Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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.3k
アドテク企業の本番環境から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
570
Scalaの(俺的)イケてる ライブラリ紹介LT
kaky0922
0
900
TDでHivemallを半年使ってみたノウハウ / Hivemall Meetup 20160908
kaky0922
1
3.2k
Other Decks in Technology
See All in Technology
GC25 Recap+: Advancing Go Garbage Collection with Green Tea
logica0419
1
400
生成AI_その前_に_マルチクラウド時代の信頼できるデータを支えるSnowflakeメタデータ活用術.pdf
cm_mikami
0
110
M5製品で作るポン置きセルラー対応カメラ
sayacom
0
150
pprof vs runtime/trace (FlightRecorder)
task4233
0
170
Azure SynapseからAzure Databricksへ 移行してわかった新時代のコスト問題!?
databricksjapan
0
140
Azure Well-Architected Framework入門
tomokusaba
1
300
「Verify with Wallet API」を アプリに導入するために
hinakko
1
230
Escaping_the_Kraken_-_October_2025.pdf
mdalmijn
0
130
Findy Team+のSOC2取得までの道のり
rvirus0817
0
330
stupid jj tricks
indirect
0
7.9k
Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題 - BAKUCHIKU BANBAN #2
marokiki
0
140
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
20k
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Become a Pro
speakerdeck
PRO
29
5.5k
How to Think Like a Performance Engineer
csswizardry
27
2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Embracing the Ebb and Flow
colly
88
4.8k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Context Engineering - Making Every Token Count
addyosmani
5
180
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Language of Interfaces
destraynor
162
25k
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