我最近一直试图从Kinesis获取Spark阅读事件但是在接收事件时遇到了问题。虽然Spark能够连接到Kinesis并且能够从Kinesis获取元数据,但它无法从中获取事件。它总是取回零元素。
没有错误,只有空结果。 Spark能够获取元数据(例如,kinesis中的分片数量等)。
我用过这些[1& 2]指南让它工作,但还没有太多运气。我也尝试了SO [3]的一些建议。群集具有足够的可用资源/核心。
我们在Spark和Kinesis之间看到了Protobuf版本中的版本冲突,这也可能是导致此行为的原因。 Spark使用protobuf-java版本2.5.0,kinesis可能使用protobuf-java-2.6.1.jar。
只是想知道是否有人遇到过这种行为,或者已经开始使用kinesis。
尝试使用Spark 1.5.0,Spark 1.6.0。
答案 0 :(得分:1)
回答我自己的问题 -
我在Spark Kinesis集成方面取得了一些成功,关键是unionStreams.foreachRDD。
有两种版本的foreachRDD可用
由于某种原因,第一个不能得到我的结果,但改变到第二个取得预期的结果。然而要探索原因。
在下方添加代码段以供参考。
另外考虑改变这一点。这也对我有帮助 -
"org.apache.spark" % "spark-streaming-kinesis-asl_2.10" % "1.6.0", // Doesnt work
"org.apache.spark" % "spark-streaming-kinesis-asl_2.10" % "1.4.1", // Works
希望它可以帮助某人:)
感谢大家的帮助。
val kinesisStreams = (0 until numStreams).map {
count =>
val stream = KinesisUtils.createStream(
ssc,
consumerName,
streamName,
endpointUrl,
regionName,
InitialPositionInStream.TRIM_HORIZON,
kinesisCheckpointInterval,
StorageLevel.MEMORY_AND_DISK_2
)
stream
}
val unionStreams = ssc.union(kinesisStreams)
println(s"========================")
println(s"Num of streams: ${numStreams}")
println(s"========================")
/*unionStreams.foreachRDD{ // Doesn't Work !!
rdd =>
println(rdd.count)
println("rdd isempty:" + rdd.isEmpty)
}*/
unionStreams.foreachRDD ((rdd: RDD[Array[Byte]], time: Time) => { // Works, Yeah !!
println(rdd.count)
println("rdd isempty:" + rdd.isEmpty)
}
)
ssc.start()
ssc.awaitTermination()