范围是从 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 读取需要在同一个项目中工作,那么如何解决这个问题呢?