Spark  Streaming  +  Amazon  Kinesis
@imai_̲factory
Spark  Streaming
•  Sparkの主要機能のひとつで、ストリーム処
理理を実装するのを容易易化してくれる。
•  データソースにはKafkaやKinesisを利利⽤用でき
る。
•  時系列列に並ぶ無限⻑⾧長のRDD配列列をDStream
というオブジェクトに抽象化してくれる。
FRPっぽい書き⽅方が簡単に実現できる。
先にConclusion
•  KinesisのConsumerを書く⼿手段はいろいろある
が、Spark  Streamingを使うと、とてもプログ
ラマフレンドリに書ける!
•  ストリームにスライディングウィンドウなSQL
かける、みたいな処理理が⾃自然に書ける!
•  プログラマが、あまりKinesisについて気にせず
にコードを書けるのがこの構成の⼀一番のメリッ
トだと思っている。
RDD
@t1
RDD
@t2
RDD
@t3
DStream
Time
RDD
@t4
RDD
@t5
DStream
Programming  with  DStream
val conf = SparkConf()!
val ssc = StreamingContext(conf, Seconds(1))!
!
val lines = lines.ssc.socketTextStream(“localhost”,9999)!
val words = lines.flatMap(_.split(“ “))!
!
val pairs = words.map(word => (word, 1))!
val count = pairs.reduceByKey(_ + _)!
count.print()!
!
ssc.satrt()!
ssc.awaitTermination()!
Programming  with  DStream
val conf = SparkConf()!
val ssc = StreamingContext(conf, Seconds(1))!
!
val lines = lines.ssc.socketTextStream(“localhost”,9999)!
val words = lines.flatMap(_.split(“ “))!
!
val pairs = words.map(word => (word, 1))!
val count = pairs.reduceByKey(_ + _)!
count.print()!
!
ssc.satrt()!
ssc.awaitTermination()!
Programming  with  DStream
val conf = SparkConf()!
val ssc = StreamingContext(conf, Seconds(1))!
!
val lines = lines.ssc.socketTextStream(“localhost”,9999)!
val words = lines.flatMap(_.split(“ “))!
!
val pairs = words.map(word => (word, 1))!
val count = pairs.reduceByKey(_ + _)!
count.print()!
!
ssc.satrt()!
ssc.awaitTermination()!
Programming  with  DStream
val conf = SparkConf()!
val ssc = StreamingContext(conf, Seconds(1))!
!
val lines = lines.ssc.socketTextStream(“localhost”,9999)!
val words = lines.flatMap(_.split(“ “))!
!
val pairs = words.map(word => (word, 1))!
val count = pairs.reduceByKey(_ + _)!
count.print()!
!
ssc.satrt()!
ssc.awaitTermination()!
DStream
Flume
Kafka
Kinesis
Twitter
File
Socket
Data  sources
Amazon  Kinesis
•  フルマネージドなストリームサービス/
メッセージブローカー
•  平たくいうとマネージドなKafkaに近い
•  マネージドなので
– 運⽤用の⼿手間がいらない
– スループットをほしいだけ設定すればそれだ
けで使える
Amazon  Kinesis
Amazon  Kinesis
Data	
  stream	
   Store,	
  Shuffle	
  &	
  Sort	
  
Consumer  apps
Consumer  apps
Consumer  apps
Process	
  
Spark  Streaming  +Amazon  Kinesis
Amazon  Kinesis
Data	
  stream	
   Store,	
  Shuffle	
  &	
  Sort	
   Process	
  
Spark  Streaming  +Amazon  Kinesis
•  Kinesisに投⼊入されたデータをSparkを
使って処理理が書ける
•  Kinesisのストリームに対して
– ウィンドウ関数+SparkSQLしたりできる。
– のちほどデモします
•  KinesisのConsumerを、とてもプログラ
マフレンドリに書ける!
Building  Amazon  Kinesis  
Consumer  app
Amazon  Kinesis
Data	
  stream	
   Store,	
  Shuffle	
  &	
  Sort	
  
API,  SDKを使ってスクラッチ実装
KCLを使って実装
AWS  Lambda
Process	
  
SparkのKinesisインテグレーションも、Stormのkinesis-‐‑‒spoutも下のほうのレイ
ヤでKCLを使っている
StormやSparkを使う
↑まちがいでした。はてブコメントに感謝です	
  
Amazon  Kinesis
Data	
  stream	
   Store,	
  Shuffle	
  &	
  Sort	
   Process	
  
Run  SparkSQL  on  Kinesis  Stream
SQL	
  
Run  SparkSQL  on  Kinesis  Stream
import org.apache.spark.streaming.kinesis.KinesisUtils!
!
val kinesisStreams = (0 until numStreams).map { i =>!
KinesisUtils.createStream(!
ssc, streamName, endpointUrl, kinesisCheckpointInterval,!
InitialPositionInStream.LATEST, StorageLevel.MEMORY_ONLY!
)!
}!
val unionStreams = ssc.union(kinesisStreams)!
val words = unionStreams.flatMap(...)!
import org.apache.spark.streaming.kinesis.KinesisUtils!
!
val kinesisStreams = (0 until numStreams).map { i =>!
KinesisUtils.createStream(!
ssc, streamName, endpointUrl, kinesisCheckpointInterval,!
InitialPositionInStream.LATEST, StorageLevel.MEMORY_ONLY!
)!
}!
!
val unionStreams = ssc.union(kinesisStreams)!
!
val words = unionStreams.flatMap(...)!
Run  SparkSQL  on  Kinesis  Stream
Dstreamの配列列
DstreamをひとつにUNION
Dstreamに対するTransformation
words.foreachRDD(foreachFunc = (rdd: RDD[String], time: Time) => {!
!
val sqlContext = SQLContextSingleton.getInstance(rdd.sparkContext)!
!
sqlContext.read.json(rdd).registerTempTable("words")!
!
val wordCountsDataFrame =!
sqlContext.sql(”””select level, count(*) as total !
from words!
group by level”””)!
!
println(s"========= $time =========")!
wordCountsDataFrame.show()!
!
})!
DStream
Run  SparkSQL  on  Kinesis  Stream
JSONデー
タを直接取
り扱える。
Conclusion
KinesisのConsumerを書く⼿手段はいろいろ
あるが、Spark  Streamingを使うと、とて
もプログラマフレンドリに書ける!
PluggableInputDStream
KinesisReceiver
KinesisClientLibrary
Worker  thread
KinesisUtils.createStream(!
ssc, streamName, endpointUrl, kinesisCheckpointInterval,!
InitialPositionInStream.LATEST, StorageLevel.MEMORY_ONLY!
)!
	
  
DynamoDB  Table
Kinesis  Stream
Under  the  hood
GetRecords
Checkpoint
One  more  thing:
Amazon  EMR  now  supports  Apache  Spark!
•  EMRクラスタ起動時に
Sparkを選択するだけで利利
⽤用可能!
•  2015/06/23時点では
Spark1.3.1のみがサポー
ト
One  more  thing:
Amazon  EMR  now  supports  Apache  Spark!
Amazon  Kinesis Amazon  EMR
+	
  

Spark Streaming + Amazon Kinesis