अस्वीकरण: बस स्पार्क के साथ खेलना शुरू करें।स्पार्क के बंद होने और उनके क्रमबद्धता को समझना
मुझे प्रसिद्ध "टास्क सीरियलज़ेबल" अपवाद को समझने में परेशानी हो रही है लेकिन मेरा प्रश्न उन लोगों से थोड़ा अलग है जो मैं SO (या तो मुझे लगता है) पर देखता है।
मेरे पास एक छोटा कस्टम आरडीडी (TestRDD
) है। इसमें एक ऐसा क्षेत्र है जो वस्तुओं को संग्रहीत करता है जिनकी कक्षा Serializable (NonSerializable
) लागू नहीं करती है। मैंने Kryo का उपयोग करने के लिए "spark.serializer" कॉन्फ़िगरेशन विकल्प सेट किया है। हालांकि, जब मैं अपने RDD पर count()
कोशिश, मैं निम्नलिखित मिल:
Caused by: java.io.NotSerializableException: com.complexible.spark.NonSerializable
Serialization stack:
- object not serializable (class: com.test.spark.NonSerializable, value: [email protected])
- field (class: com.test.spark.TestRDD, name: mNS, type: class com.test.spark.NonSerializable)
- object (class com.test.spark.TestRDD, TestRDD[1] at RDD at TestRDD.java:28)
- field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, (TestRDD[1] at RDD at TestRDD.java:28,<function2>))
at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:46)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100)
at org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1009)
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$submitStage(DAGScheduler.scala:933)
जब मैं देखने के अंदर DAGScheduler.submitMissingTasks
मुझे लगता है कि यह मेरे RDD, जो जावा serializer, नहीं Kryo है पर इसके बंद serializer का उपयोग करता है serializer जो मैं उम्मीद करता हूँ। मैंने पढ़ा है कि क्रियो को बंद करने के लिए क्रमबद्ध करने में समस्याएं हैं और स्पार्क हमेशा बंद करने के लिए जावा धारावाहिक का उपयोग करता है लेकिन मुझे समझ में नहीं आता कि यहां कितने बंद होने लगते हैं।
SparkConf conf = new SparkConf()
.setAppName("ScanTest")
.setMaster("local")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
JavaSparkContext sc = new JavaSparkContext(conf);
TestRDD rdd = new TestRDD(sc.sc());
System.err.println(rdd.count());
है, कोई मानचित्रकारों या कुछ भी जो बंद होने की क्रमबद्धता की आवश्यकता होगी: सभी मैं यहाँ कर रहा हूँ यह है। OTOH इस काम करता है:
sc.parallelize(Arrays.asList(new NonSerializable(), new NonSerializable())).count()
Kryo serializer अपेक्षा के अनुरूप, बंद serializer शामिल नहीं है प्रयोग किया जाता है। अगर मैंने धारावाहिक संपत्ति को क्रायो में सेट नहीं किया है, तो मुझे यहां एक अपवाद भी मिलेगा।
मैं किसी भी पॉइंटर्स की सराहना करता हूं कि यह कहां से बंद हो जाता है और यह सुनिश्चित करने के लिए कि मैं कस्टम आरडीडी को क्रमबद्ध करने के लिए क्रियो का उपयोग कर सकता हूं।
अद्यतन: यहाँ अपने गैर serializable क्षेत्र mNS
साथ TestRDD
है:
class TestRDD extends RDD<String> {
private static final ClassTag<String> STRING_TAG = ClassManifestFactory$.MODULE$.fromClass(String.class);
NonSerializable mNS = new NonSerializable();
public TestRDD(final SparkContext _sc) {
super(_sc,
JavaConversions.asScalaBuffer(Collections.<Dependency<?>>emptyList()),
STRING_TAG);
}
@Override
public Iterator<String> compute(final Partition thePartition, final TaskContext theTaskContext) {
return JavaConverters.asScalaIteratorConverter(Arrays.asList("test_" + thePartition.index(),
"test_" + thePartition.index(),
"test_" + thePartition.index()).iterator()).asScala();
}
@Override
public Partition[] getPartitions() {
return new Partition[] {new TestPartition(0), new TestPartition(1), new TestPartition(2)};
}
static class TestPartition implements Partition {
final int mIndex;
public TestPartition(final int theIndex) {
mIndex = theIndex;
}
public int index() {
return mIndex;
}
}
}
क्या आपके पास ऐसा फ़ील्ड है जो आपके 'टेस्टआरडीडी' में' स्पार्ककॉन्टेक्स्ट 'रखता है? हमें 'टेस्टआरडीडी' की अपनी परिभाषा दिखाएं या एक [एमसीवीई] –
@YuvalItzchakov बनाएं। 'स्पार्ककॉन्टेक्स्ट' सुपर के कन्स्ट्रक्टर को पास कर दिया गया है, इसलिए हाँ, आरडीडी इसे पकड़ता है। अपवाद हालांकि इसके बारे में शिकायत नहीं प्रतीत होता है। –
क्या आप 'NonSerializable' पोस्ट कर सकते हैं? –