読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

アドテクを支えるScala - Ad Generationの場合 #adtech_scala

勉強会

ScaleOut出向

Scala歴1年半くらい

Ad Generation開発

  • medibaでScalaを採用した理由
  • Ad GenerationでどのようにScalaを使っているのか
  • sprayを使ったrtb-engen
  • sparkを使ったrtb-engen-log
  • scalaを使ってみて

medibaでScalaを採用した理由

scalaのことには触れられていない

  • GitHubを見るに2011年くらいから
  • Liftを使ったアドサーバーのプロトタイプ(当時のリードエンジニアがScala推し)
  • medibaadでは配信サーバでPlay 集計でspark

Ad Generationについて

SSP Ad Generation DSP ScaleOut DMP ScaleOut

Ad Platfor上に構築されたSSP スマホに注力 RTB関連

  • SDK⇔adserver⇔rtb-engine⇔DSP
  • rtb-engineでオークションをして、一番高い広告が表示される
  • RTBサーバ 集計サーバ

  • fluentd

  • HDFS
  • mesos
  • rtb-engine-log

どのようにScalaが使われているか

  • rtb-engine
  • DSPからの入札をオークションするサーバ
  • rtb-engine-log
  • アクセス数、DSP通信、オークション状況(入札、落札)の集計

rtb-engine

  • spray 1.2.1(akkaベース)
  • アドサーバと枠データ、オークション結果をやりとりする
  • DSPとの入札、応札をやりとり
  • DSPからのレスポンスをまってオークションする
  • 集計画面用のAPI(Angular JS)

  • 現状10台

  • 70億オークション/月
  • 250億bid リクエスト/月
  • 70億x3-4DSP
  • ピーク時
  • 対アドサーバ 4900qps 20000qps

rtb-engineで投げ先を選択する

ピーク時にさばけない * チューニング * configの見直し * コードの見直し

  • akkaの設定とsprayの設定
  • 似たような設定項目が複数ある(サーバサイド、クライアントサイドでいろいろ設定がある)
  • APIレイヤが細かい

  • コードの見直し

  • ブロックする場所をFuture
  • 用途ごとにスレッドプールを割り当て(ログ出力用、など)
  • 良い性能に落ち着いた

rtb-engine-log

  • spark1.0.0(分散コンピューティング用のフレームワーク Scalaだけで動かしている)
  • mesos上で動かしている(Hadoop使っていなくって、sparkと相性が良い)
  • 7種類のログを集計
  • 10分毎、1時間毎、1日毎に集計
  • 入力はHDFS 出力はDB

構成

masterとslaveの構成 cronスクリプトでキックすると、問い合わせして、zookeeperに登録されているサーバに処理を渡してそれぞれでタスクを実行するという形

  • 6cpu 20GB/台x4台
  • master2台 slave4台
  • 500M - 1.5G x 7 x 10 / hourくらいサマる
  • 12 - 40s/job 1ジョブだいたい12秒から40秒

感想

  • sparkを使った感想は概ね良好
  • 集計自体よりもI/Oがネック
  • 程よいサイズで
  • 手軽に試せるし、身構えず書ける
  • spark-shellが試しやすい
  • コレクションを操作するのと変わらず書ける

Scalaを使ってみて

  • 並列処理、並行処理を使いやすい
  • アドサーバやRTBサーバには向いている

  • 用途を選ばない言語

  • なんでもそつなくこなせる
  • 配信も集計も1つの言語で
  • 変更とかしやすくていろいろ楽

  • やっぱりJavaやJVMを知っておいた方がいい

  • Javaの資産を使って書くのがいい
  • スレッドまわり JVMのパラメータなどが分かっていないと難しい

  • チューニングを勉強したい

  • 売上向上につながる柔軟で速やかな分析→調査中