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
550
Scalaの(俺的)イケてる ライブラリ紹介LT
kaky0922
0
890
TDでHivemallを半年使ってみたノウハウ / Hivemall Meetup 20160908
kaky0922
1
3.1k
Other Decks in Technology
See All in Technology
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
10
2.8k
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
110
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
120
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
2
380
Agentic Workflowという選択肢を考える
tkikuchi1002
1
350
Oracle Cloud Infrastructure:2025年6月度サービス・アップデート
oracle4engineer
PRO
1
140
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
140
成立するElixirの再束縛(再代入)可という選択
kubell_hr
0
820
CSS、JSをHTMLテンプレートにまとめるフロントエンド戦略
d120145
0
200
doda開発 生成AI元年宣言!自家製AIエージェントから始める生産性改革 / doda Development Declaration of the First Year of Generated AI! Productivity Reforms Starting with Home-grown AI Agents
techtekt
0
190
Definition of Done
kawaguti
PRO
6
460
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
3
220
Featured
See All Featured
Side Projects
sachag
455
42k
Building Applications with DynamoDB
mza
95
6.5k
Automating Front-end Workflow
addyosmani
1370
200k
Speed Design
sergeychernyshev
31
1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
GitHub's CSS Performance
jonrohan
1031
460k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
A designer walks into a library…
pauljervisheath
206
24k
A Tale of Four Properties
chriscoyier
159
23k
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