23
初初初初 SparkStreaming ~Kafka+SparkStreaming 初初初 ~ 2015.09.09 R&D Team: tanaka.yuichi

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

Embed Size (px)

Citation preview

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

初めての SparkStreaming~Kafka+SparkStreaming の紹介 ~

2015.09.09 R&D Team: tanaka.yuichi

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

自己紹介とか

金融系・組み込み系・コミュニティサービス・ゲーム・広告等の各システムを経てDMM へ。DMM.com ラボにおいて、検索システムの刷新、レコメンドエンジンの新規開発など、基盤技術の開発を担当しております。サーバーサイド、フロントエンド、ミドルウェア、インフラと領域問わず、提案から構築・実装まで幅広くやらせてもらっています。その他 OSS の contributor 等もやっております。

株式会社 DMM.com ラボCTO 室

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

こんなのやったりしてます

リアルタイムなトレンド To アイテムのレコメンド

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

メニュー

• SparkStreaming の概要• Kafka の概要• DMM での構成サンプル• ちょっとだけコード• パフォーマンスの話と困りごと・ハマりどころ

今日話そうと思ってる事

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

SparkCore についての説明

Cluster Manager

Yarn

Mesos

Data Source

Stream

HDFS

Cassandra

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

SparkDStream の説明

RDDs のまとまりを DStream として扱います

RDD と似た関数を持っていて、下記のような Stream データをn 秒で分けてバッチ処理をする仕組み

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

SparkStreaming の Input について

Basic Source

SocketTextStream(Tcp)

FileStream(HDFS,S3)

Advanced Source

Twitter

Kafka

Kinesis

Flume

今日は Kafka+Streaming の話

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

Kafka の簡単な紹介

Apache Kafka

Pull 型のキューイングシステム• 高速• スケーラブル• 耐久性• 分散システム

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

Group2

Kafka の簡単な紹介

TopicA#partition0

TopicA#partition1

TopicA#partition2

msg

Consumer1#group1

Consumer2#group1

Consumer3#group2

Group1

BrokersConsumers

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

DMM で何をやってるのか

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

余談・蛇足・閑話休題

DMM × 行動解析Σ( ⌓꒪ ꒪ ) え“!!

人にされて嫌な事を人にしたらダメってばっちゃが言ってた

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

DMM の SparkStreaming 周辺の図概要

Page 13: 初めてのSpark streaming 〜kafka+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"))

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

ちょっとだけコード ( 集計処理の抜粋)

// 中間データから 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の紹介〜

ちょっとだけコード (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の紹介〜

パフォーマンスの話

そもそも SparkStreaming のパフォーマンスってどう見るの?

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

パフォーマンスの話

そもそも SparkStreaming のパフォーマンスってどう見るの?

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

困った話

Spark1.3 で kafka の directStream 使うと ReceiverStatistics が出ない( 1.4 で直ってる?)

MaxRatePerPartition の設定がし辛い

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

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の紹介〜

対応例

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の紹介〜

そもそもパフォーマンスを見ようと思って困った話CDH の YARN アプリケーション画面

SparkStreamingのアプリ

Spark のアプリ

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

そもそもパフォーマンスを見ようと思って困った話CDH の YARN アプリケーション画面(チャート)

色々なチャートが見れる1 つの job にどれだけ時間がかかったか? Streaming アプリ

通常の Spark アプリ

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

以上2015.09.09

R&D Team: tanaka.yuichi