初めてのspark streaming 〜kafka+sparkstreamingの紹介〜
TRANSCRIPT
![Page 1: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/1.jpg)
初めての SparkStreaming~Kafka+SparkStreaming の紹介 ~
2015.09.09 R&D Team: tanaka.yuichi
![Page 2: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/2.jpg)
自己紹介とか
金融系・組み込み系・コミュニティサービス・ゲーム・広告等の各システムを経てDMM へ。DMM.com ラボにおいて、検索システムの刷新、レコメンドエンジンの新規開発など、基盤技術の開発を担当しております。サーバーサイド、フロントエンド、ミドルウェア、インフラと領域問わず、提案から構築・実装まで幅広くやらせてもらっています。その他 OSS の contributor 等もやっております。
株式会社 DMM.com ラボCTO 室
![Page 3: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/3.jpg)
こんなのやったりしてます
リアルタイムなトレンド To アイテムのレコメンド
![Page 4: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/4.jpg)
メニュー
• SparkStreaming の概要• Kafka の概要• DMM での構成サンプル• ちょっとだけコード• パフォーマンスの話と困りごと・ハマりどころ
今日話そうと思ってる事
![Page 5: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/5.jpg)
SparkCore についての説明
Cluster Manager
Yarn
Mesos
Data Source
Stream
HDFS
Cassandra
![Page 6: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/6.jpg)
SparkDStream の説明
RDDs のまとまりを DStream として扱います
RDD と似た関数を持っていて、下記のような Stream データをn 秒で分けてバッチ処理をする仕組み
![Page 7: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/7.jpg)
SparkStreaming の Input について
Basic Source
SocketTextStream(Tcp)
FileStream(HDFS,S3)
Advanced Source
Kafka
Kinesis
Flume
今日は Kafka+Streaming の話
![Page 8: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/8.jpg)
Kafka の簡単な紹介
Apache Kafka
Pull 型のキューイングシステム• 高速• スケーラブル• 耐久性• 分散システム
![Page 9: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/9.jpg)
Group2
Kafka の簡単な紹介
TopicA#partition0
TopicA#partition1
TopicA#partition2
msg
Consumer1#group1
Consumer2#group1
Consumer3#group2
Group1
BrokersConsumers
![Page 10: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/10.jpg)
DMM で何をやってるのか
![Page 11: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/11.jpg)
余談・蛇足・閑話休題
DMM × 行動解析Σ( ⌓꒪ ꒪ ) え“!!
人にされて嫌な事を人にしたらダメってばっちゃが言ってた
![Page 12: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/12.jpg)
DMM の SparkStreaming 周辺の図概要
![Page 13: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/13.jpg)
ちょっとだけコード (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"))
![Page 14: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/14.jpg)
ちょっとだけコード ( 集計処理の抜粋)
// 中間データから 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()
![Page 15: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/15.jpg)
ちょっとだけコード (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 }}
![Page 16: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/16.jpg)
パフォーマンスの話
そもそも SparkStreaming のパフォーマンスってどう見るの?
![Page 17: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/17.jpg)
パフォーマンスの話
そもそも SparkStreaming のパフォーマンスってどう見るの?
![Page 18: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/18.jpg)
困った話
Spark1.3 で kafka の directStream 使うと ReceiverStatistics が出ない( 1.4 で直ってる?)
MaxRatePerPartition の設定がし辛い
![Page 19: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/19.jpg)
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 自体の数
![Page 20: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/20.jpg)
対応例
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
![Page 21: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/21.jpg)
そもそもパフォーマンスを見ようと思って困った話CDH の YARN アプリケーション画面
SparkStreamingのアプリ
Spark のアプリ
![Page 22: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/22.jpg)
そもそもパフォーマンスを見ようと思って困った話CDH の YARN アプリケーション画面(チャート)
色々なチャートが見れる1 つの job にどれだけ時間がかかったか? Streaming アプリ
通常の Spark アプリ
![Page 23: 初めてのSpark streaming 〜kafka+sparkstreamingの紹介〜](https://reader036.vdocuments.mx/reader036/viewer/2022062412/58873c041a28abc0748b6bbd/html5/thumbnails/23.jpg)
以上2015.09.09
R&D Team: tanaka.yuichi