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

Preview:

Citation preview

初めての 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

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

Recommended