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のパラメータなどが分かっていないと難しい
チューニングを勉強したい
- 売上向上につながる柔軟で速やかな分析→調査中