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 20160425
Search
Takayuki Sakai
April 26, 2016
Technology
3
8.9k
アドテク企業の本番環境から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.2k
cats in practice
kaky0922
1
510
Scalaの(俺的)イケてる ライブラリ紹介LT
kaky0922
0
790
TDでHivemallを半年使ってみたノウハウ / Hivemall Meetup 20160908
kaky0922
1
2.9k
Other Decks in Technology
See All in Technology
HEXA OSINT CTF V3 作戦会議
meow_noisy
0
110
Tebiki株式会社 エンジニア採用資料
tebiki
0
4k
Apple Vision Pro trial session
akkeylab
0
120
社内勉強会運営のコツ
senoo
6
1.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
1
630
日本におけるデータエンジニアリングのこれまでとこれから
foursue
9
1.9k
Hands-on / Kaname Frusawa / Cloud Compare Users Meetup 2024 at University of Tokyo on April 17
paraworld
2
470
Aurora MySQL v3(MySQL8.0互換)の オンラインDDLの罠挙動を全バージョンで検証した
yutakikai
0
150
プロデザ! BY リクルート vol.18_リクルートのリサーチ実践組織「リサーチブーストコミュニティ」
recruitengineers
PRO
2
230
開発生産性向上サービスを作るFindyが自分たちで開発生産性を爆上げした組織づくりの歩み / Findy's path to boosting its own development productivity 2024-04-17
ma3tk
0
190
入社後初めてのタスクでk8sアップグレードした話.pdf
kkato1
0
370
インシデントレスポンスのライフサイクルを廻すポイントってなに / Pinpoints of Incidentresponse Lifecycle for Operation
sakaitakeshi
0
290
Featured
See All Featured
Practical Orchestrator
shlominoach
181
9.7k
In The Pink: A Labor of Love
frogandcode
137
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
19
1.9k
The Cult of Friendly URLs
andyhume
73
5.7k
Testing 201, or: Great Expectations
jmmastey
27
6.3k
For a Future-Friendly Web
brad_frost
171
8.9k
The Invisible Side of Design
smashingmag
293
49k
Visualization
eitanlees
135
14k
Bootstrapping a Software Product
garrettdimon
PRO
301
110k
YesSQL, Process and Tooling at Scale
rocio
162
13k
It's Worth the Effort
3n
180
27k
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