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.2k
アドテク企業の本番環境から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
550
Scalaの(俺的)イケてる ライブラリ紹介LT
kaky0922
0
890
TDでHivemallを半年使ってみたノウハウ / Hivemall Meetup 20160908
kaky0922
1
3.1k
Other Decks in Technology
See All in Technology
使えるデータ基盤を作る技術選定の秘訣 / selecting-the-right-data-technology
pei0804
10
1.7k
GrafanaをClaude DesktopからMCPで触ってみた
hamadakoji
0
1.2k
Microsoft Fabric のライセンスについて
ryomaru0825
2
3.5k
計装を見直してアプリケーションパフォーマンスを改善させた話
donkomura
2
200
技術選定を突き詰める 懇親会LT
okaru
2
1.3k
Опыт использования Nessie в Азбуке Вкуса
emeremyanina1234
0
470
人間性を捧げる生成AI時代の技術選定
yo4raw
2
1.2k
Design for Failure - リージョンとAZについて
yuki_ink
0
130
SwiftUIとMetalで簡単に作るレアカード風UI
stoticdev
1
110
Platform Engineering for Private Cloud
cote
PRO
1
140
技術的負債を「戦略的投資」にするためのPdMとエンジニアの連携と実践
satomino
3
820
TypeScriptで実践するクリーンアーキテクチャ ― WebからもCLIからも使えるアプリ設計 / CClean Architecture with Typescript Application
panda_program
7
1.2k
Featured
See All Featured
Producing Creativity
orderedlist
PRO
344
40k
Code Review Best Practice
trishagee
68
18k
A Tale of Four Properties
chriscoyier
159
23k
We Have a Design System, Now What?
morganepeng
52
7.6k
Why Our Code Smells
bkeepers
PRO
336
57k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
A Modern Web Designer's Workflow
chriscoyier
693
190k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
The Cost Of JavaScript in 2023
addyosmani
49
7.9k
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