2015-04-28 33 views
0

我正在嘗試從kafka主題中傳輸事件並將它們保存到Infinispan。Apache Spark任務中的Infinispan RemoteCache - RemoteCache不可序列化

Infinispan作爲獨立服務器部署 - 因此不嵌入。

已提交我的Spark任務後,我將消息添加到Kafka主題以供任務使用。正如它試圖這樣做,有一個例外:

Error running job streaming job 1430222654000 ms.0 org.apache.spark.SparkException: Task not serializable 
... 
Caused by: java.io.NotSerializableException: org.infinispan.client.hotrod.impl.RemoteCacheImpl 
Serialization stack: 
    - object not serializable (class: org.infinispan.client.hotrod.impl.RemoteCacheImpl, value: [email protected]) 

有關如何解決此問題的任何想法?

回答

3

上面的錯誤可能發生在Spark中,當您聲明對主驅動程序中的某個字段的引用(在任務外部),然後在工作人員(在任務內)中引用它時。由於RemoteCacheImpl不是可序列化的,因此無法通過網絡發貨。 嘗試在任務內部獲取對RemoteCache的引用,而不是依賴閉包來完成。

+0

我有RemoteCache實例在啓動時初始化(這使得它駐留在主服務器中)。然後我嘗試引用foreachRDD()中的初始化緩存,這需要序列化。我實質上做的是stream.map(parse).countByValue()。foreachRDD {rdd => rdd.foreach(saveToInfinispan)}。我必須在saveToInfinispan內初始化RemoteCache。在foreachRDD()中初始化它是不夠的。我認爲這樣做效率低下,我錯了嗎?有沒有更合理的方法?無論如何,你的回答是正確的,謝謝你! – siltalau

+0

您可能對Infinispan Spark連接器感興趣,將DStream保存到遠程緩存是支持的用例之一http://blog.infinispan.org/2015/08/infinispan-spark-connector-01-released.html – gnf

相關問題