范围是从 HDFS 读取,在 Spark 中过滤并将结果写入 Cassandra。 我正在使用 SBT 打包和运行。
问题来了: 从 HDFS 读取到 Spark 需要在我的 sbt 构建文件中添加以下行。
libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.0.0-cdh4.5.0"
但是,通过
读写Cassandraval 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读取需要在同一个项目中工作,如何解决这个问题?
最佳答案
您似乎正在尝试使用针对 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 构建上。
关于hadoop - 使用 Spark 通过 Cloudera Hadoop 从 Cassandra 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21086820/