2014-01-13 50 views
2

範圍是從HDFS讀取,在Spark中過濾並將結果寫入Cassandra。 我是包裝和SBT運行。使用Spark從Cloudera Hadoop讀取Cassandra

這裏是問題: 從HDFS到Spark的讀取需要在我的sbt構建文件中有以下行。

libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.0.0-cdh4.5.0" 

然而,讀,通過

val casRdd = sc.newAPIHadoopRDD(
    job.getConfiguration(), 
    classOf[ColumnFamilyInputFormat], 
    classOf[ByteBuffer], 
    classOf[SortedMap[ByteBuffer, IColumn]]) 

寫卡桑德拉如果Hadoop的客戶端庫相關要麼忽略或改爲0.1或1.2.0或2.2.0不只是工作(非CDH) - 不幸的是HDFS讀取是不可能的。 如果添加了Hadoop的客戶端線,下面則拋出Error試圖從卡桑德拉閱讀時:

java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected 

因此,我的結論是與卡桑德拉問題的讀/寫,似乎是被Cloudera公司相關的問題嗎?請注意,Cassandra的讀/寫操作只需刪除libraryDependencies行即可。

由於HDFS和Cassandra需要在同一個項目中工作,這個問題該如何解決?

回答

1

看來你正在嘗試使用Spark針對CDH構建的Apache Hadoop發行版。

您的項目不應該依賴於hadoop客戶端,因爲Spark已經做到了。在我們Sppark +卡桑德拉集成庫Calliope我們有星火依賴 -

"org.apache.spark" %% "spark-core" % SPARK_VERSION % "provided" 

我們一直在使用這個庫與Apache Hadoop的HDFS,CDH HDFS和我們自己的SnackFS。你需要確定的是你部署在Spark的構建版本上。

+0

(這是@ daumann的問題;我剛剛編輯它以添加Spark標籤:)) –