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