繁体   English   中英

使用 Kafka 的 Spark Streaming:空集合异常

[英]Spark Streaming using Kafka: empty collection exception

我正在使用 Kafka 和 Spark Streaming 开发一种算法。 这是我的接收器的一部分:

val Array(brokers, topics) = args
val sparkConf = new SparkConf().setAppName("Traccia2014")
val ssc = new StreamingContext(sparkConf, Seconds(10))

 // Create direct kafka stream with brokers and topics
val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers)
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicsSet)
val slice=30
val lines = messages.map(_._2)
val dStreamDst=lines.transform(rdd => {
    val y= rdd.map(x => x.split(",")(0)).reduce((a, b) => if (a < b) a else b)
    rdd.map(x => (((x.split(",")(0).toInt - y.toInt).toLong/slice).round*slice+" "+(x.split(",")(2)),1)).reduceByKey(_ + _)
})
dStreamDst.print()

我收到以下错误:

 ERROR JobScheduler: Error generating jobs for time 1484927230000 ms
 java.lang.UnsupportedOperationException: empty collection
    at org.apache.spark.rdd.RDD$$anonfun$reduce$1$$anonfun$apply$42.apply(RDD.scala:1034)
    at org.apache.spark.rdd.RDD$$anonfun$reduce$1$$anonfun$apply$42.apply(RDD.scala:1034)

这是什么意思? 我怎么能解决呢? 任何形式的帮助都非常感谢..提前致谢

更新:已解决。 不要使用 transform 或 print() 方法。 使用foreachRDD,是最好的解决方案。

您遇到此 b/c 您正在使用 transform() API 与 DStream 进行交互。 使用该方法时,您将获得表示该数据及时快照的 RDD,在您的情况下为 10 秒窗口。 您的代码失败,因为在特定时间窗口,没有数据,并且您正在操作的 RDD 是空的,当您调用 reduce() 时会出现“空集合”错误。

在调用操作之前,使用rdd.isEmpty()确保 RDD 不为空。

lines.transform(rdd => {
  if (rdd.isEmpty)
    rdd
  else {
    // rest of transformation
  }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM