为什么sc.cassandraTable的地图功能("测试","用户")。select("用户名")无效?

时间:2015-12-11 07:22:31

标签: apache-spark cassandra apache-spark-sql spark-cassandra-connector

关注spark-cassandra-connector's demoInstalling the Cassandra / Spark OSS Stack,在spark-shell下,我尝试了以下代码段:

text/plain

sc.stop val conf = new SparkConf(true) .set("spark.cassandra.connection.host", "172.21.0.131") .set("spark.cassandra.auth.username", "adminxx") .set("spark.cassandra.auth.password", "adminxx") val sc = new SparkContext("172.21.0.131", "Cassandra Connector Test", conf) val rdd = sc.cassandraTable("test", "users").select("username") 的许多运算符都可以正常工作,例如:

rdd

但是当我使用rdd.first rdd.count 时:

map

然后,我跑:

val result = rdd.map(x => 1) //just for simple
result: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[61] at map at <console>:32

我收到了以下错误:

result.first

我不知道为什么会出现这样的错误?任何建议将不胜感激!

更新: 根据{{​​3}}对@RussSpitzer的回答,我通过跟踪错误解决了此错误,而不是使用15/12/11 15:09:00 WARN TaskSetManager: Lost task 0.0 in stage 31.0 (TID 104, 124.250.36.124): java.lang.ClassNotFoundException: $line346.$read$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$1 Caused by: java.lang.ClassNotFoundException: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$1 at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612) 并创建新的sc.stop,我开始{{1带选项:

SparkContext

然后所有步骤都相同并且正常工作。

2 个答案:

答案 0 :(得分:4)

Russell Spitzer's answer from the spark-connector-user list

  

我非常确定这里的主要问题是您使用--jars启动上下文然后杀死该上下文然后再启动另一个上下文。尝试简化代码,而不是设置所有这些spark conf选项,并创建一个新的上下文运行你的shell。您在类路径上需要的jar是连接器程序集jar,而不是您要运行的Scala脚本的自定义构建。

     

./spark-shell --conf spark.casandra.connection.host=10.129.20.80 ...

     

您无需修改​​ack.wait.timeoutexecutor.extraClasspath

答案 1 :(得分:3)

Spark应用程序通常将编译后的代码作为jar文件发送给执行程序。这样,执行程序中存在map的函数。

spark-shell中的情况比较棘手。它必须以交互方式为您的每一行编译和广播代码。你里面甚至没有上课。它会创建这些假的$$iwC$$类来解决这个问题。

通常情况下效果很好,但您可能遇到了spark-shell错误。您可以尝试通过将代码放在spark-shell

中的类中来解决此问题
object Obj { val mapper = { x: String => 1 } }
val result = rdd.map(Obj.mapper)

但是将代码实现为应用程序可能是最安全的,而不是仅仅在spark-shell中编写代码。