Spark无法从Amazon Kinesis获取事件

时间:2016-02-23 02:00:59

标签: apache-spark emr amazon-kinesis

我最近一直试图从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。

  1. http://spark.apache.org/docs/latest/streaming-kinesis-integration.html
  2. https://github.com/apache/spark/blob/master/extras/kinesis-asl/src/main/scala/org/apache/spark/examples/streaming/KinesisWordCountASL.scala

  3. Apache Spark Kinesis Sample not working

1 个答案:

答案 0 :(得分:1)

回答我自己的问题 -

我在Spark Kinesis集成方面取得了一些成功,关键是unionStreams.foreachRDD。

有两种版本的foreachRDD可用

  • unionStreams.foreachRDD
  • unionStreams.foreachRDD((rdd:RDD [Array [Byte]],time:Time)

由于某种原因,第一个不能得到我的结果,但改变到第二个取得预期的结果。然而要探索原因。

在下方添加代码段以供参考。

另外考虑改变这一点。这也对我有帮助 -

"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()