ApacheSpark与Cassandra行为
我正在编写一个独立的Spark程序,它从Cassandra获取数据。 我遵循这些示例,通过newAPIHadoopRDD()和ColumnFamilyInputFormat类创建了RDD。 RDD已创建,但在调用RDD的.groupByKey()方法时,我得到一个NotSerializableException:ApacheSpark与Cassandra行为,cassandra,apache-spark,notserializableexception,Cassandra,Apache Spark,Notserializableexception,我正在编写一个独立的Spark程序,它从Cassandra获取数据。 我遵循这些示例,通过newAPIHadoopRDD()和ColumnFamilyInputFormat类创建了RDD。 RDD已创建,但在调用RDD的.groupByKey()方法时,我得到一个NotSerializableException: publicstaticvoidmain(字符串[]args){ SparkConf SparkConf=新SparkConf(); sparkConf.setMaster(“本地”)
publicstaticvoidmain(字符串[]args){
SparkConf SparkConf=新SparkConf();
sparkConf.setMaster(“本地”).setAppName(“测试”);
JavaSparkContext ctx=新的JavaSparkContext(sparkConf);
作业=新作业();
Configuration jobConf=job.getConfiguration();
job.setInputFormatClass(ColumnFamilyInputFormat.class);
setInputInitialAddress(jobConf,主机);
setinpurpcpport(jobConf,port);
setOutputinInitialAddress(jobConf,主机);
setOutpurtPCPort(jobConf,端口);
setInputColumnFamily(jobConf,keySpace,columnFamily,true);
setInputPartitioner(jobConf,“第三部分”);
setOutputPartitioner(jobConf,“第三部分”);
SlicePredicate谓词=新的SlicePredicate();
SliceRange SliceRange=新的SliceRange();
sliceRange.setFinish(新字节[0]);
sliceRange.setStart(新字节[0]);
谓词.setSlice_范围(sliceRange);
setInputSlicePredicate(jobConf,predicate);
JavaPairRDD rdd=
spark.newAPIHadoopRDD(jobConf,
ColumnFamilyInputFormat.class.asSubclass(org.apache.hadoop.mapreduce.InputFormat.class),
ByteBuffer.class、SortedMap.class);
javapairdd groupRdd=rdd.groupByKey();
System.out.println(groupRdd.count());
}
例外情况:
java.io.NotSerializableException:java.nio.HeapByteBuffer
位于java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1164)
位于java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
位于java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
位于java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
位于java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
位于org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:42)
位于org.apache.spark.storage.DiskBlockObjectWriter.write(BlockObjectWriter.scala:179)
在org.apache.spark.scheduler.ShuffleMapTask$$anonfun$runTask$1.apply上(ShuffleMapTask.scala:161)
在org.apache.spark.scheduler.ShuffleMapTask$$anonfun$runTask$1.apply上(ShuffleMapTask.scala:158)
位于scala.collection.Iterator$class.foreach(Iterator.scala:727)
在org.apache.spark.interruptblediator.foreach(interruptblediator.scala:28)
在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:158)上
在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99)上
位于org.apache.spark.scheduler.Task.run(Task.scala:51)
位于org.apache.spark.executor.executor$TaskRunner.run(executor.scala:187)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
运行(Thread.java:662)
我试图做的是将所有行键列合并到一个条目中。
当我尝试使用reduceByKey()方法时,也会遇到同样的异常,如下所示:
JavaPairRDD<ByteBuffer, SortedMap<ByteBuffer, IColumn>> reducedRdd = rdd.reduceByKey(
new Function2<SortedMap<ByteBuffer, IColumn>, SortedMap<ByteBuffer, IColumn>, sortedMap<ByteBuffer, IColumn>>() {
public SortedMap<ByteBuffer, IColumn> call(SortedMap<ByteBuffer, IColumn> arg0,
SortedMap<ByteBuffer, IColumn> arg1) throws Exception {
SortedMap<ByteBuffer, IColumn> sortedMap = new TreeMap<ByteBuffer, IColumn>(arg0.comparator());
sortedMap.putAll(arg0);
sortedMap.putAll(arg1);
return sortedMap;
}
}
);
javapairdd reducedd=rdd.reduceByKey(
新功能2(){
公共分拣地图呼叫(分拣地图arg0,
SortedMap arg1)引发异常{
SortedMap SortedMap=新树映射(arg0.comparator());
分类地图putAll(arg0);
分类地图putAll(arg1);
返回分拣的DMAP;
}
}
);
我正在使用:
- spark-1.0.0-bin-hadoop1
- 卡桑德拉1.2.12
- Java 1.6
Shai您的问题可能是由于尝试按缓冲区序列化引起的。它们不可序列化,在生成RDD之前需要将它们转换为字节数组
您应该尝试Spark的官方DataStax Cassandra驱动程序,该驱动程序可用Hi Jacek,谢谢您的回复。我的解决方案就是这样。
JavaPairRDD<ByteBuffer, SortedMap<ByteBuffer, IColumn>> reducedRdd = rdd.reduceByKey(
new Function2<SortedMap<ByteBuffer, IColumn>, SortedMap<ByteBuffer, IColumn>, sortedMap<ByteBuffer, IColumn>>() {
public SortedMap<ByteBuffer, IColumn> call(SortedMap<ByteBuffer, IColumn> arg0,
SortedMap<ByteBuffer, IColumn> arg1) throws Exception {
SortedMap<ByteBuffer, IColumn> sortedMap = new TreeMap<ByteBuffer, IColumn>(arg0.comparator());
sortedMap.putAll(arg0);
sortedMap.putAll(arg1);
return sortedMap;
}
}
);