2

范围是从 HDFS 读取,在 Spark 中过滤并将结果写入 Cassandra。我正在使用 SBT 打包和运行。

这是问题所在:从 HDFS 读取到 Spark 需要在我的 sbt 构建文件中添加以下行。

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

但是,通过读写 Cassandra

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

仅当 hadoop-client 的库依赖项被忽略或更改为 0.1 或 1.2.0 或 2.2.0(非 CDH)时才有效 - 不幸的是,HDFS 读取是不可能的。如果添加了 hadoop-client 行,尝试从 Cassandra 读取时会引发以下错误:

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

因此,我得出结论,Cassandra 读/写的问题似乎是与 Cloudera 相关的问题?请注意,Cassandra 读/写只需删除 libraryDependencies 行即可。

既然 HDFS 和 Cassandra 读取需要在同一个项目中工作,那么如何解决这个问题呢?

4

1 回答 1

1

您似乎正在尝试使用基于 CDH 构建的 Spark 的 Apache Hadoop 发行版。

您的项目永远不必像 Spark 那样依赖 hadoop-client。在我们的 Sppark + Cassandra 集成库Calliope中,我们依赖于 Spark -

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

我们一直在将此库与 Apache Hadoop HDFS、CDH HDFS 和我们自己的 SnackFS 一起使用。您只需要确保在 Spark 的正确构建上进行部署。

于 2014-01-23T06:34:09.153 回答