初めてのspark streaming 〜kafka+sparkstreamingの紹介〜
TRANSCRIPT
初めての 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
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
BrokersConsumers
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,Set("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