繁体   English   中英

无法并行化Scala中的列表

[英]Unable to parallelize a list in Scala

我无法并行化Scala中的列表,得到java.lang.NullPointerException

    messages.foreachRDD( rdd => {
       for(avroLine <- rdd){
        val record = Injection.injection.invert(avroLine.getBytes).get
        val field1Value = record.get("username")
        val jsonStrings=Seq(record.toString())
        val newRow = sqlContext.sparkContext.parallelize(Seq(record.toString()))
            }
            })

产量

 jsonStrings...List({"username": "user_118", "tweet": "tweet_218", "timestamp": 18})

例外

    Caused by: java.lang.NullPointerException
at com.capitalone.AvroConsumer$$anonfun$main$1$$anonfun$apply$1.apply(AvroConsumer.scala:83)
at com.capitalone.AvroConsumer$$anonfun$main$1$$anonfun$apply$1.apply(AvroConsumer.scala:74)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at org.apache.spark.util.CompletionIterator.foreach(CompletionIterator.scala:26)
at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:917)
at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:917)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1944)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1944)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:99)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282)

提前致谢!!

您正在尝试在spark worker上下文中创建RDD。 foreachRDD在驱动程序中运行时,您在每个RDD上执行的foreach操作将分配给工作程序。 您似乎不太可能实际想要为输入流的每一行创建一个新的RDD。

评论后更新:

很难在没有代码格式的注释线程中进行讨论。 我的基本问题是,为什么不这样做:

val messages: ReceiverInputDStream[String] = RabbitMQUtils.createStream(ssc, rabbitParams)
def toJsonString(message: String): String = SparkUtils.getRecordInjection(QUEUE_NAME).invert(message.getBytes()).get
val jsonStrings: DStream[String] = messages map toJsonString

我没有费心找出并跟踪所有正在使用的库(请下次,提交MCVE ),因此我没有尝试进行编译。 但是看起来您想要的就是将每个输入消息映射到JSON字符串。 也许您想对结果的String DStream做些花哨的事情,但这可能是另一个问题。

def toJsonString(message: String): String = {val record = 

SparkUtils.getRecordInjection(QUEUE_NAME).invert(message.getBytes()).get  }
dStreams.foreachRDD( rdd => {
val jsonStrings = rdd.map (stream =>toJsonString(stream))
val df = sqlContext.read.json(jsonStrings)
df.write.mode("Append").csv("/Users/Documents/kafka-poc/consumer-out/def/")}

暂无
暂无

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

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