Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アドテク企業の本番環境からTD使ってみた / Treasure Data Tech Talk 20160425

アドテク企業の本番環境からTD使ってみた / Treasure Data Tech Talk 20160425

機械学習の基礎から、本番環境へのTreasureDataを使った機械学習導入部分までカバーします。
nex8という株式会社ファンコミュニケーションズの開発・運用するDSPにおけるお話です。

Takayuki Sakai

April 26, 2016
Tweet

More Decks by Takayuki Sakai

Other Decks in Technology

Transcript

  1. ञҪ ਸࢸ - 2016/01- F@N Communicationsגࣜձࣾ - ๭CAࣾΞυςΫελδΦͰΠϯλʔϯͱ͔ͯͨ͠ - ScalaΤϯδχΞ

    (ଞʹRuby, Python, JS, Go…) - ػցֶश΋΍ΔΑ - Slack & Raspberry PiͰΤΞίϯ͚ͭͨΓ
  2. Ұൠతͳֶशσʔλ 1 1 1 …… 0 ಛ௃ྔ1 ಛ௃ྔ2 ಛ௃ྔ3 ……

    ਖ਼ղϥϕϧ 2 3 2 …… 0 2 2 3 …… 1 ……
  3. CTR༧ଌͷ৔߹ 1 1 1 …… 0 αΠτ Ϣʔβ ޿ࠂ ……

    ΫϦοΫ
 ͞Ε͔ͨ 2 3 2 …… 0 2 2 3 …… 1 …… 1ߦ͕
 1ΠϯϓϨογϣϯ
  4. CSVͰද͢ͱ… # αΠτ, Ϣʔβ, ޿ࠂ, …, ਖ਼ղϥϕϧ site_1, user_1, campaign_1,

    …, 0 site_2, user_3, campaign_2, …, 0 site_2, user_2, campaign_3, …, 1 …
  5. ֶशσʔλ …… 0 …… …… …… Ξ
 ϧ
 ΰ
 


    Ϧ
 ζ
 Ϝ ༧ଌϞσϧ 0 1 ࠓճ͸
 ϩδεςΟοΫճؼ …… 0
  6. 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 …
  7. ޿ࠂ1 …… ಛ௃ྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05

    ༧ଌϞσϧ ͜ͷಛ௃ྔͷॏΈ͸…ʁ αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ޿ࠂ1 ޿ࠂ2 αΠτ1 Ϣʔβ2
  8. …… ಛ௃ྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ

    ޿ࠂ1 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ޿ࠂ1 ޿ࠂ2 αΠτ1 Ϣʔβ2
  9. …… ಛ௃ྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ

    ଍͠߹Θͤͯ -0.8 ޿ࠂ1 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ޿ࠂ1 ޿ࠂ2 αΠτ1 Ϣʔβ2
  10. …… ಛ௃ྔ ॏΈ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ༧ଌϞσϧ

    ຐ๏ͷؔ਺Λ͔͚Δͱ… sigmoid(-0.8) ޿ࠂ1 αΠτ1 Ϣʔβ2 αΠτ1 αΠτ2 Ϣʔβ1 Ϣʔβ2 ޿ࠂ1 ޿ࠂ2
  11. …… ಛ௃ྔ ॏΈ 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
  12. ֶशσʔλ …… 0 …… …… …… Ξ
 ϧ
 ΰ
 


    Ϧ
 ζ
 Ϝ 0 1 …… 0 2. ༧ଌϞσϧͷ࡞੒ ༧ଌϞσϧ 0.1 -0.2 1.0 -0.6 -0.3 -0.05 ಛ௃ྔ ॏΈ
  13. 3. ༧ଌ …… ༧ଌϞσϧ 0.1 -0.2 1.0 -0.6 -0.3 -0.05

    ಛ௃ྔ ॏΈ ༧ଌ͍ͨ͠
 σʔλ 0.31 ༧ଌCTR
  14. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java
  15. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java 1. ֶशσʔλͷ࡞੒
  16. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java 2. ༧ଌϞσϧͷ࡞੒
  17. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java 3. ༧ଌ
  18. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java ࠷ॳͷ2εςοϓ͕
 SQLͰ׬݁ͯ͠Δʂ
  19. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java ࠷ॳͷਤ
  20. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java ͜ͷ෦෼
  21. // 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))
  22. // 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. ΫΤϦΛ࣮ߦ
  23. // 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. ΫΤϦऴྃ·Ͱ଴ͭ
  24. // 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. ݁ՌΛऔಘ
  25. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java ༧ଌϞσϧͷ࡞੒࣌ʹ
 S3ʹͰ΋Export͓͚ͯ͠͹… S3
  26. RTBαʔό ϩά ϩάςʔϒϧ fluentd SQLͷੈք ֶशσʔλ 0.1 0.3 0.2 ༧ଌϞσϧ

    Treasure Data redis ίϐʔ ϝϞϦΩϟογϡ ϦΫΤετ Ϩεϙϯε CTRΛ༧ଌ 0.31 ༧ଌϞσϧʹ
 ΞΫηε όοναʔό td-client-java ؆୯ʂ S3