2014-01-13 129 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标签:)) –