初めてのSparkStreaming
~Kafka+SparkStreamingの紹介~
2015.09.09
R&D Team: tanaka.yuichi
自己紹介とか
金融系・組み込み系・コミュニティサービス・ゲーム・広告等の各システムを経てDMMへ。
DMM.comラボにおいて、検索システムの刷新、レコメンドエンジンの新規開発など、基
盤技術の開発を担当しております。
サーバーサイド、フロントエンド、ミドルウェア、インフラと領域問わず、提案から構築・実
装まで幅広くやらせてもらっています。その他OSSのcontributor等もやっております。
株式会社 DMM.comラボ
CTO室
こんなのやったりしてます
リアルタイムなトレンドToアイテムのレコメンド
メニュー
• SparkStreamingの概要
• Kafkaの概要
• DMMでの構成サンプル
• ちょっとだけコード
• パフォーマンスの話と困りごと・ハマりどころ
今日話そうと思ってる事
SparkCoreについての説明
Cluster Manager
Yarn
Mesos
Data Source
Stream
HDFS
Cassandra
SparkDStreamの説明
RDDsのまとまりをDStreamとして扱います
RDDと似た関数を持っていて、下記のようなStreamデータを
n秒で分けてバッチ処理をする仕組み
SparkStreamingのInputについて
Basic Source
SocketTextStream(Tcp)
FileStream(HDFS,S3)
Advanced Source
Twitter
Kafka
Kinesis
Flume
今日はKafka+Streamingの話
Kafkaの簡単な紹介
Apache Kafka
Pull型のキューイングシステム
• 高速
• スケーラブル
• 耐久性
• 分散システム
Group2
Kafkaの簡単な紹介
TopicA#partition0
TopicA#partition1
TopicA#partition2
msg
Consumer1#group1
Consumer2#group1
Consumer3#group2
Group1
Brokers
Consumers
DMMで何をやってるのか
余談・蛇足・閑話休題
DMM × 行動解析
Σ( ꒪⌓꒪)え“!!
人にされて嫌な事を人にしたらダメってばっちゃが言ってた
DMMのSparkStreaming周辺の図
概要
ちょっとだけコード(KafkaのStream作成部分)
object ActivitySummary{
def main(args: Array[String]){
val conf = new SparkConf().setAppName("ActivitySummary")
val ssc = new StreamingContext(conf,Seconds(5))
val kafkaParams = Map[String,String](“metadata.broker.list” -> “172.27.xxx.xx:9092,・・・")
val kafkaStream =
KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc,kafkaParams,Se
t("raw_tracking"))
ちょっとだけコード(集計処理の抜粋)
//中間データからPVを数えるよ!
val pv = middle_data
.filter(_._1.contains("_pv_"))
.map(x => x._1.substring(0,x._1.lastIndexOf("_")))
.countByValue()
//pvの移動平均用
val window_pv = middle_data
.filter(_._1.contains("_pv_"))
.map(x => "window_" + x._1.substring(0,x._1.lastIndexOf("_")))
.countByValueAndWindow(Seconds(60),Seconds(5))
//中間データからuuの重複排除
var uu = middle_data
.filter(_._1.contains("_uu_"))
.map(x => x._1)
.transform(rdd => rdd.distinct())
.map(x => x.substring(0,x.lastIndexOf("_")))
.countByValue()
ちょっとだけコード(Streamingからの書き出し抜粋)
class KafkaProducer private(brokerList:String){
val props:Properties = new Properties()
props.put("metadata.broker.list",brokerList)
props.put("serializer.class", "kafka.serializer.StringEncoder")
props.put("request.required.acks", "1")
val config:ProducerConfig = new ProducerConfig(props)
val producer:Producer[String,String] = new Producer[String,String](config)
def send(topicName:String,msg:String){
val data:KeyedMessage[String,String] = new KeyedMessage[String,String](topicName,msg)
producer.send(data)
}
def close(){}
}
object KafkaProducer{
private val kProducer = new KafkaProducer(“172.27.100.14:9092,・・・ ")
def getInstance():KafkaProducer ={ kProducer }
def apply():KafkaProducer ={ getInstance }
}
パフォーマンスの話
そもそもSparkStreamingのパフォーマンスってどう見るの?
パフォーマンスの話
そもそもSparkStreamingのパフォーマンスってどう見るの?
困った話
Spark1.3でkafkaのdirectStream使うとReceiverStatisticsが出ない(1.4で直ってる?)
MaxRatePerPartitionの設定がし辛い
Kafka+Streamingのパフォーマンスで詰まった話
spark-submitコマンドでStreamingのjarを投げる際、2つのexecutorが作成されます。
Driver
Executor
Executor
Kafka#partition0
Kafka#partition1
Kafka#partition2
Kafka#partition3
Kafka#partition4
--executor-cores 1 #各Executorに割り当てるCore数
--num-executors 2 #Executor自体の数
対応例
Driver
Executor
Executor
Kafka#partition0
Kafka#partition1
Kafka#partition2
Kafka#partition3
Kafka#partition4
--executor-cores 1 #各Executorに割り当てるCore数
--num-executors 5 #Executor自体の数
Executor
Executor
Executor
そもそもパフォーマンスを見ようと思って困った話
CDHのYARNアプリケーション画面
SparkStreaming
のアプリ
Sparkのアプリ
そもそもパフォーマンスを見ようと思って困った話
CDHのYARNアプリケーション画面(チャート)
色々なチャート
が見れる
1つのjobにどれだけ時
間がかかったか?
Streamingアプリ
通常のSparkアプリ
以上
2015.09.09
R&D Team: tanaka.yuichi

初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜

Editor's Notes

  • #6 皆知ってるSparkCore。 今回はSparkStreamingの話 リソースマネージャーとしてYARNとMesos DataSourceとしてStream,HDFS,Cassandraとかが上げられます。 DMMではYarnの上で動かしてます。
  • #7 その他のSparkのライブラリとの違いはデータ操作の基本がRDDかDstreamかの違い。
  • #8 SparkStreamingはInputとして Basic Source:SocketTestStream,FileStream AdvancedSource,Twitter,Kafka,Kinesis,Flumeが用意されていて、様々なSourceに合わせて簡単にStreamingを始めることができます。
  • #9 Kafkaの話 Kafkaのメッセージングの仕組みとして メッセージを投入するProducer メッセージを処理するBroker メッセージを受け取るConsumerに分かれます。
  • #10 Kafkaの話 メッセージはTopic単位に入れることができ、TopicからConsumerがデータを取得します。 ConsumerはGroupを作る事ができ、Group毎に一貫したデータを取得できます。 さらにpartitionを分ける事ができ、msgをpartition毎に入れる事が出来ます。 また、ConsumerはGroupを作る事ができ、Group毎に一貫したデータを取得できます。
  • #11 じゃぁ、これらを組み合わせて何をやってるのかと言うと、 こんな感じ
  • #12 すごい余談ですが、 DMMが行動解析やってる話をすると、良く「え“」って言われます。 大丈夫です。世の男性の皆様安心して下さい。 弊社のビッグデータ基盤に個人が特定出来るデータ乗ってません。あと今後ものせません。 安心して使ってください。
  • #13 行動ログ(JS) -> apiで受け取りKafkaに入れる kafka -> sparkStreamingで集約・計算処理を行い、HBaseとKafkaに書き込みを行う kafka -> websocketで垂れ流し、例えばviewに流し込み描画する Kafkaから見ると APIがProducer,SparkStreamingがConsumer SparkStreamingがProducer、ViewerがConsumer になります。
  • #14 Seconds(5)の部分:まず、このStreaming処理は5秒に1度処理されます。(5秒間隔のマイクロバッチ処理) kafkaParameterとして、KafkaのBrokerListを渡してます。 raw_trackingというtopicからデータを取ってきてます。 KafkaUtils.createDirectStreamを今回つかってます。
  • #15 FilterやMap等、RDDでおなじみの物や、transform、countByValueAndWindow等Dstream特有の物と様々な操作が用意されてます。
  • #16 Kafkaから取得して、集計したデータを再度Kafkaに戻す部分 topic名とデータを受け取ってkafkaに投げてるだけの簡単仕様になってます。
  • #17 おなじみのSparkUI 各マイクロバッチ処理をドリルダウンして行くとdurationや各stageでの詳細な情報が見れます
  • #18 SparkStreamingを使う場合はSparkUIのStreaming部分に情報が表示されます。 マイクロバッチの間隔が表示されてます。 Last Batchに最後に動いたバッチの時間が表示されてます。 ちなみに75%値がBatchInterval超える場合はどんどんDelayが溜まって行き取り返しがつかなくなるので注意 こちらはReceiverの情報で、どのくらいのレコード数を処理したか等が見れます
  • #19 Sparkのみの構築だと今更1.3を使う事はないだろうけど、CDH使うときは1.3が入るので気をつけて。 ReceiverStatisticsが見れないので、maxRateの設定がし辛い
  • #20 1つのexecutorにどれだけのcoreが割り当てられるか?はClusterのSpec次第ですが、 少なくともStreamingのCore数がKafkaのPartition数を下回るとすごく処理が遅いです。DirectStreamを使う場合kafkaとRDDのpartitionが1:1になるので それを処理できるcore数又はexecutor数を当てて上げましょう YARNの場合はcoreはディフォルト1です。
  • #21 1つのexecutorにどれだけのcoreが割り当てられるか?はClusterのSpec次第ですが、 少なくともStreamingのCore数がKafkaのPartition数を下回るとすごく処理が遅いです。DirectStreamを使う場合kafkaとRDDのpartitionが1:1になるので それを処理できるcore数又はexecutor数を当てて上げましょう YARNの場合はcoreはディフォルト1です。
  • #22 CDHとっても便利です。 どのくらいCPU使ってるか?メモリの割当どうか?Mapperがどのくらい終わってるか?Reducerがどのくらい終わってるかを見る事が出来る でもSparkStremingは出力されない
  • #23 CDHはチャートも見れてとっても便利です。 CPU時間とかメモリの割当とかHDFSのバイト数とかどのくらいの時間がかかったとか見れる でも此処に中途半端にSparkStreamingのアプリケーションも入っちゃう 経過時間の分布でチューニング対象のSparkアプリケーション調べようとすると SparkStreamingのアプリが邪魔して使い物にならない・・・・