Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アドテク企業の本番環境からTD使ってみた / Treasure Data Tech Talk ...
Search
Takayuki Sakai
April 26, 2016
Technology
3
9.4k
アドテク企業の本番環境からTD使ってみた / Treasure Data Tech Talk 20160425
機械学習の基礎から、本番環境へのTreasureDataを使った機械学習導入部分までカバーします。
nex8という株式会社ファンコミュニケーションズの開発・運用するDSPにおけるお話です。
Takayuki Sakai
April 26, 2016
Tweet
Share
More Decks by Takayuki Sakai
See All by Takayuki Sakai
オフィスの前にある信号が変わる タイミング教えてくれるWebページ 作ろうとしたよ with DeepLearning
kaky0922
0
1.3k
cats in practice
kaky0922
1
580
Scalaの(俺的)イケてる ライブラリ紹介LT
kaky0922
0
910
TDでHivemallを半年使ってみたノウハウ / Hivemall Meetup 20160908
kaky0922
1
3.2k
Other Decks in Technology
See All in Technology
AIBuildersDay_track_A_iidaxs
iidaxs
3
410
シニアソフトウェアエンジニアになるためには
kworkdev
PRO
3
200
20251219 OpenIDファウンデーション・ジャパン紹介 / OpenID Foundation Japan Intro
oidfj
0
300
日本Rubyの会: これまでとこれから
snoozer05
PRO
4
200
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
1
110
AI-DLCを現場にインストールしてみた:プロトタイプ開発で分かったこと・やめたこと
recruitengineers
PRO
2
190
SREには開発組織全体で向き合う
koh_naga
0
390
AI駆動開発の実践とその未来
eltociear
1
400
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
580
まだ間に合う! Agentic AI on AWSの現在地をやさしく一挙おさらい
minorun365
15
1.5k
プロンプトやエージェントを自動的に作る方法
shibuiwilliam
15
15k
SQLだけでマイグレーションしたい!
makki_d
0
1.1k
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
95
14k
A Modern Web Designer's Workflow
chriscoyier
698
190k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
62
Unsuck your backbone
ammeep
671
58k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
170
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
740
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Ruling the World: When Life Gets Gamed
codingconduct
0
92
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
0
840
Information Architects: The Missing Link in Design Systems
soysaucechin
0
710
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
57
37k
Side Projects
sachag
455
43k
Transcript
ΞυςΫاۀͷ ຊ൪ڥ͔ΒTDͬͯΈͨ Scala x TreasureData ΦϯϥΠϯCTR༧ଌ
ञҪ ਸࢸ - 2016/01- F@N Communicationsגࣜձࣾ - CAࣾΞυςΫελδΦͰΠϯλʔϯͱ͔ͯͨ͠ - ScalaΤϯδχΞ
(ଞʹRuby, Python, JS, Go…) - ػցֶशΔΑ - Slack & Raspberry PiͰΤΞίϯ͚ͭͨΓ
ରऀ - ػցֶश or CTR༧ଌʹڵຯ͕͋Δਓ - Scala͔ΒTreasureDataΛͬͯΈ͍ͨਓ
ΞυςΫۀքͷதͰ DSPͱ͍͏ͷΛ࡞ͬͯ·͢
What’s DSP?
What DSPs do SSP DSP ͜ͷαΠτʹϦΫΤετ དྷͯΔ͚Ͳࠂग़͞Μʁ
What DSPs do SSP DSP ͦͬͨ͜Β 0.1ԁͳΒങ͏Θ
What DSPs do SSP DSP Αͬ͠Ό͋Μͨʹ ചͬͨΖ ଞͷձࣾͷํ͕ ͍͍ஈ͚ͭͯ͘ΕͨΘ
What DSPs do SSP DSP Αͬ͠Ό͋Μͨʹ ചͬͨΖ ଞͷձࣾͷํ͕ ͍͍ஈ͚ͭͯ͘ΕͨΘ
͜ͷؒΘ͔ͣ50ms
ࠓͷҰ࿈ͷΓͱΓΛ RTBͱ͍͏Α RTB: Real-Time Bidding ςετʹग़Δͧʂ
RTBͷಛ େྔΞΫηε ɾඵؒ5ສͱ͔ ૣ͍Ϩεϙϯε ɾ100msҎʹฦ͞ͳ͍ͱΦʔΫγϣϯʹࢀՃͰ͖ͳ͍
ຊ
ސ٬ʢࠂओʣʹͱͬͯ ΑΓՁͷ͋ΔDSPΛ࡞Γ͍ͨʂ
ΫϦοΫ(CTR)ͷ ༧ଌ͕େࣄ CTR: Click Through Rate
DSP Site A Site B ࠂग़͞Μʁ ࠂग़͞Μʁ
DSP Site A (CTR=0.1%) Site B (CTR=1%) 0.5ԁͳΒങ͏Ͱ 5ԁͳΒങ͏Ͱ
CTR͕Θ͔Δͱ దਖ਼ͳஈͰೖࡳͰ͖Δ ΫϦοΫ
RTBͷ࣌ʹΘ͔͍ͬͯΔใ - ϢʔβID - αΠτID - ࠂID - etc…ʢͨ͘͞Μʣ
- ϢʔβID - αΠτID - ࠂID - etc…ʢͨ͘͞Μʣ ͜ΕΒͷใ͔Β CTRΛ༧ଌͯ͠ΈΑ͏ʂ
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ ͰͦͷϢʔβͷCTR1%ͩͥ
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ ͰͦͷϢʔβͷCTR1%ͩͥ ͡Ό͋ؒΛऔͬͯ0.5%ͬͯ͜ͱʹ͢Δʁ
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ ͰͦͷϢʔβͷCTR1%ͩͥ ͡Ό͋ؒΛऔͬͯ0.5%ͬͯ͜ͱʹ͢Δʁ Ϣʔβ͝ͱͷใͷํ͕ਖ਼֬ͩΖ 0.8%͘Β͍͡ΌͶ
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ ͰͦͷϢʔβͷCTR1%ͩͥ ͡Ό͋ؒΛऔͬͯ0.5%ͬͯ͜ͱʹ͢Δʁ Ϣʔβ͝ͱͷใͷํ͕ਖ਼֬ͩΖ 0.8%͘Β͍͡ΌͶ ͋ɺࠂ͝ͱͷCTRߟ͑ͳ͍ͱ…
͜ͷαΠτͰͷࠓ·ͰͷCTR0.1%ͩΑ ͰͦͷϢʔβͷCTR1%ͩͥ ͡Ό͋ؒΛऔͬͯ0.5%ͬͯ͜ͱʹ͢Δʁ Ϣʔβ͝ͱͷใͷํ͕ਖ਼֬ͩΖ 0.8%͘Β͍͡ΌͶ ͋ɺࠂͷCTRߟ͑ͳ͍ͱ… ߟ͑ग़͢ͱେม
- ϢʔβID - αΠτID - ࠂID - etc…ʢͨ͘͞Μʣ ͪͳΈʹɺ͜ͷΑ͏ͳ ༧ଌͷࡐྉʹͳΔใΛ
ಛྔͱ͍͏Α
Machine Learning ػցֶश
Machine LearningͳΒ…
Machine LearningͳΒ… - ෳͷಛྔʹରͯ͠ (ϢʔβID, αΠτID…)
Machine LearningͳΒ… - ෳͷಛྔʹରͯ͠ (ϢʔβID, αΠτID…) - ֶతࠜڌʹج͍ͮͯ
Machine LearningͳΒ… - ෳͷಛྔʹରͯ͠ (ϢʔβID, αΠτID…) - ֶతࠜڌʹج͍ͮͯ - ࣗಈͰ
Machine LearningͳΒ… - ෳͷಛྔʹରͯ͠ (ϢʔβID, αΠτID…) - ֶతࠜڌʹج͍ͮͯ - ࣗಈͰ
CTR͕༧ଌͰ͖Δʂ
ػցֶशͬͯͲ͏Δͷʁ
ࠓճͷख๏ɻৄ͍͠ਓ͚ - ڭࢣ͋Γֶश - ڭࢣσʔλϩά͔Β࡞ - ࠓճϩδεςΟοΫճؼͷઆ໌Ͱ͢ Βͳ͍ਓಡΈඈͯ͠OK
ػցֶशͷجຊ 1. ֶशσʔλͷ࡞ 2. ༧ଌϞσϧͷ࡞ 3. ༧ଌ
1. ֶशσʔλͷ࡞
Ұൠతͳֶशσʔλ 1 1 1 …… 0 ಛྔ1 ಛྔ2 ಛྔ3 ……
ਖ਼ղϥϕϧ 2 3 2 …… 0 2 2 3 …… 1 ……
CTR༧ଌͷ߹ 1 1 1 …… 0 αΠτ Ϣʔβ ࠂ ……
ΫϦοΫ ͞Ε͔ͨ 2 3 2 …… 0 2 2 3 …… 1 …… 1ߦ͕ 1ΠϯϓϨογϣϯ
CSVͰද͢ͱ… # αΠτ, Ϣʔβ, ࠂ, …, ਖ਼ղϥϕϧ site_1, user_1, campaign_1,
…, 0 site_2, user_3, campaign_2, …, 0 site_2, user_2, campaign_3, …, 1 …
2. ༧ଌϞσϧͷ࡞
ֶशσʔλ …… 0 …… …… …… Ξ ϧ ΰ
Ϧ ζ Ϝ ༧ଌϞσϧ 0 1 ࠓճ ϩδεςΟοΫճؼ …… 0
αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2 ಛྔ ॏΈ ༧ଌϞσϧͷத
ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 αΠτ1 αΠτ2
Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2
CSVͰද͢ͱ… # ಛྔ, ॏΈ site_1, 0.1 site_2, -0.2 user_1, 1.0
user_2, -0.6 campaign_1,-0.3 campaign_2,-0.05 …
3. ༧ଌ
CTRΛΓ͍ͨσʔλ αΠτ1 Ϣʔβ2 ࠂ1 …… ֶशσʔλͱ΄΅ಉ͡ ਖ਼ղϥϕϧ͚ͩͳ͍
ࠂ1 …… ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05
༧ଌϞσϧ ͜ͷಛྔͷॏΈ…ʁ αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2 αΠτ1 Ϣʔβ2
…… ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ
ࠂ1 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2 αΠτ1 Ϣʔβ2
…… ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ
͠߹Θͤͯ -0.8 ࠂ1 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2 αΠτ1 Ϣʔβ2
…… ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ
ຐ๏ͷؔΛ͔͚Δͱ… sigmoid(-0.8) ࠂ1 αΠτ1 Ϣʔβ2 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2
…… ಛྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ
CTRग़͖ͯͨʂ sigmoid(-0.8) 0.31 ※దͰ͢ ࠂ1 αΠτ1 Ϣʔβ2 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ࠂ1 ࠂ2
͓͞Β͍
ֶशσʔλ …… 0 …… …… …… 0 1 1. ֶशσʔλͷ࡞
ϩά …… 0
ֶशσʔλ …… 0 …… …… …… Ξ ϧ ΰ
Ϧ ζ Ϝ 0 1 …… 0 2. ༧ଌϞσϧͷ࡞ ༧ଌϞσϧ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ಛྔ ॏΈ
3. ༧ଌ …… ༧ଌϞσϧ 0.1 -0.2 1.0 -0.6 -0.3 -0.05
ಛྔ ॏΈ ༧ଌ͍ͨ͠ σʔλ 0.31 ༧ଌCTR
զʑͷγεςϜߏ
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java 1. ֶशσʔλͷ࡞
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java 2. ༧ଌϞσϧͷ࡞
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java 3. ༧ଌ
͓ؾ͖ͮͩΖ͏͔…
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java ࠷ॳͷ2εςοϓ͕ SQLͰ݁ͯ͠Δʂ
\ ŪƄźō… /
࠷ॳͷ2εςοϓΛSQLͰ࣮ݱ͢Δํ๏ʹ ؔͯ͠ɺHivemall։ൃऀͷ༉Ҫ͞Μ͕ ॻ͍ͨQIitaͷૉΒ͍͠هࣄ͕ ͋Γ·͢ͷͰɺͦͪΒΛࢀর͍ͯͩ͘͠͞ɻ Hive/HivemallΛར༻ͨ͠ࠂΫϦοΫεϧʔ(CTR)ͷਪఆ http://qiita.com/myui/items/f726ca3dcc48410abe45
ͬͱϗϯτʹຊ
Scala͔ΒTDΛ͏
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java ࠷ॳͷਤ
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java ͜ͷ෦
td-client-java - JavaΫϥΠΞϯτϥΠϒϥϦ - Treasure Dataެࣜ - جຊతʹTDͷAPIΛhttpͰୟ͍ͯΔ͚ͩ
ΫΤϦΛ͛ͯ ݁ՌΛऔಘͯ͠ΈΔ
// hogeςʔϒϧͷதΛऔಘ val sql = ‘SELECT * FROM hoge’ val
client = TDClient.newClient() val jobRequest = TDJobRequest.newPrestoQuery(dbName, sql) val jobId = client.submit(jobRequest) val backOff = new ExponentialBackOff while (!client.jobStatus(jobId).getStatus.isFinished) { Thread.sleep(backOff.nextWaitTimeMillis) } val input = client.jobResult(jobId, TDResultFormat.MESSAGE_PACK_GZ, new Function[InputStream, InputStream] { def apply(input: InputStream) = input } val unpacker = MessagePack.newDefaultUnpacker(new GZIPInputStream(input))
͍…ʢ´ɾωɾʆʣ
// hogeςʔϒϧͷதΛऔಘ val sql = ‘SELECT * FROM hoge’ val
client = TDClient.newClient() val jobRequest = TDJobRequest.newPrestoQuery(dbName, sql) val jobId = client.submit(jobRequest) val backOff = new ExponentialBackOff while (!client.jobStatus(jobId).getStatus.isFinished) { Thread.sleep(backOff.nextWaitTimeMillis) } val input = client.jobResult(jobId, TDResultFormat.MESSAGE_PACK_GZ, new Function[InputStream, InputStream] { def apply(input: InputStream) = input } val unpacker = MessagePack.newDefaultUnpacker(new GZIPInputStream(input)) 1. ΫΤϦΛ࣮ߦ
// hogeςʔϒϧͷதΛऔಘ val sql = ‘SELECT * FROM hoge’ val
client = TDClient.newClient() val jobRequest = TDJobRequest.newPrestoQuery(dbName, sql) val jobId = client.submit(jobRequest) val backOff = new ExponentialBackOff while (!client.jobStatus(jobId).getStatus.isFinished) { Thread.sleep(backOff.nextWaitTimeMillis) } val input = client.jobResult(jobId, TDResultFormat.MESSAGE_PACK_GZ, new Function[InputStream, InputStream] { def apply(input: InputStream) = input } val unpacker = MessagePack.newDefaultUnpacker(new GZIPInputStream(input)) 2. ΫΤϦऴྃ·Ͱͭ
// hogeςʔϒϧͷதΛऔಘ val sql = ‘SELECT * FROM hoge’ val
client = TDClient.newClient() val jobRequest = TDJobRequest.newPrestoQuery(dbName, sql) val jobId = client.submit(jobRequest) val backOff = new ExponentialBackOff while (!client.jobStatus(jobId).getStatus.isFinished) { Thread.sleep(backOff.nextWaitTimeMillis) } val input = client.jobResult(jobId, TDResultFormat.MESSAGE_PACK_GZ, new Function[InputStream, InputStream] { def apply(input: InputStream) = input } val unpacker = MessagePack.newDefaultUnpacker(new GZIPInputStream(input)) 3. ݁ՌΛऔಘ
- ਖ਼͍ʹ͍͘ - ScalaͬΆ͘ͳ͍ - ͦͦTDͷςʔϒϧΛϓϩάϥϜ ͔ΒಡΉ͜ͱࣗମ͋·Γఆ͞Εͯͳ͍
- ਖ਼͍ʹ͍͘ - ScalaͬΆ͘ͳ͍ - ͦͦTDͷςʔϒϧΛϓϩάϥϜ ͔ΒಡΉ͜ͱࣗମ͋·Γఆ͞Εͯͳ͍ ͡Ό͋Ͳ͏͢Δ
Result ExportΛ ͍·͠ΐ͏
Result Export - ΫΤϦ͕ऴΘͬͨλΠϛϯάͰ ݁ՌΛࢦఆͨ͠ॴʹసૹ͢Δ - సૹઌ - S3 -
RDB - Mongo - etc…
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java ༧ଌϞσϧͷ࡞࣌ʹ S3ʹͰExport͓͚ͯ͠… S3
RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ
Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ ΞΫηε όοναʔό td-client-java ؆୯ʂ S3
ͦͷଞͷϢʔεέʔε Scala x TreasureData
ScalaͰੜͨ͠σʔλΛ TDʹΞοϓϩʔυ
Bulk Import - TDʹσʔλΛΞοϓϩʔυ͢ΔίϚϯυ - ίϚϯυϥΠϯͳͲ͔Β͑Δ - JavaϥΠϒϥϦʹରԠ͕ؔ͋Δ
͋Εɺಈ͔ͳ͍…
͋Εɺಈ͔ͳ͍… ͍߹ΘͤΔ
None
ʂʁ
None
ͱ͍͏Θ͚ͰEmbulk ͍·͠ΐ͏
- Ϗοάσʔλ༻σʔλϩʔμ - fluentdͷϏοάσʔλ൛Έ͍ͨͳײ͡ - TD͕։ൃ͍ͯ͠Δ - Φʔϓϯιʔε - Ϋδϥ
γϟν͕͔Θ͍͍
Αʔ͠Scala͔Β Embulk͏ͧʔ…
ͦ͜·ͰͰ͖·ͤΜͰͨ͠ ʢ࣌ؒΕʣ
·ͱΊ
1. TDͱHivemallͰCTR༧ଌϞσϧ࡞·Ͱ SQLͰ݁͢ΔΑʂ 2. Scala͔ΒTDͷςʔϒϧಡΉͷେม => Result ExportΛ͏·͓͘͏ 3. Scala͔ΒTDʹσʔλ্͛ΔͷEmbulkͰ
=> ୭͔Γํڭ͍͑ͯͩ͘͞
\ ͋Γ͕ͱ͏͍͟͝·ͨ͠ /
None