连接spark和cassandra时出错

时间:2016-01-22 15:28:07

标签: java apache-spark cassandra datastax spark-cassandra-connector

我在做什么:

  • 尝试连接Spark和Cassandra以从spark检索存储在cassandra表中的数据。

我遵循了哪些步骤:

  • 下载 cassandra 2.1.12 spark 1.4.1
  • 使用sudo build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean packagsbt/sbt clean assembly
  • 制作火花
  • 将一些数据存储到cassandra中。
  • 将这些罐子下载到spark/lib

cassandra-driver-core2.1.1.jar spark-cassandra-connector_2.11-1.4.1.jar

将jar文件路径添加到conf/spark-defaults.conf,如

spark.driver.extraClassPath \
                            ~/path/to/spark-cassandra-connector_2.11-1.4.1.jar:\
                            ~/path/to/cassandra-driver-core-2.1.1.jar

我如何运行shell:

运行./bin/cassandra之后,我就像 -

一样运行spark

sudo ./bin/pyspark

并尝试使用sudo ./bin/spark-shell

我在做什么查询

sqlContext.read.format("org.apache.spark.sql.cassandra")\
               .options(table="users", keyspace="test")\
               .load()\
               .show()

问题:

 java.lang.NoSuchMethodError:\
                    scala.Predef$.$conforms()Lscala/Predef$$less$colon$less;

org.apache.spark.sql.cassandra出现在我下载的spark-cassandra-connecter.jar中。

以下是完整的Log Trace

我尝试了什么:

  • 我尝试使用选项--packages--driver-class-path以及--jars选项添加2个罐子。
  • 尝试将scala降级为2.1并尝试使用scala shell,但仍然出现同样的错误。

我一直在考虑的问题 -

  1. 我使用的cassandra,spark和scala的版本是否相互兼容?
  2. 我使用的是正确版本的jar文件吗?
  3. 我是否以错误的方式编译火花?
  4. 我错过了什么或做错了什么?
  5. 我对spark和cassandra很新,所以我真的需要一些建议!花了好几个小时,这可能是微不足道的。

1 个答案:

答案 0 :(得分:4)

一些注意事项

您正在为2.10构建spark并使用Spark Cassandra Connector库2.11。要为2.11构建spark,您需要使用-Dscala-2.11标志。这很可能是导致错误的主要原因。

接下来实际包含项目中的连接器,只包括没有依赖项的核心库是不够的。如果您超过第一个错误,您很可能会看到缺少的deps中的其他类未找到错误。

这就是为什么建议使用Spark Packages网站和--packages标志。这将包括一个“fat-jar”,它具有所有必需的依赖项。看到 http://spark-packages.org/package/datastax/spark-cassandra-connector

对于Spark 1.4.1和pyspark,这将是

//Scala 2.10
$SPARK_HOME/bin/pyspark --packages datastax:spark-cassandra-connector:1.4.1-s_2.10
//Scala 2.11
$SPARK_HOME/bin/pyspark --packages datastax:spark-cassandra-connector:1.4.1-s_2.11

您永远不必使用--packages方法手动下载jar。

不要使用spark.driver.extraClassPath,它只会向驱动程序添加依赖项远程代码将无法使用依赖项。