簡體   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