আরডিডিগুলি সিরিয়ালাইজযোগ্য ইন্টারফেস প্রসারিত করে , তাই এটি আপনার কাজটি ব্যর্থ হওয়ার কারণ নয়। এখন এর অর্থ এই নয় যে আপনি RDD
স্পার্কের সাথে একটি সিরিয়ালায়ন করতে এবং এড়াতে পারেনNotSerializableException
স্পার্ক একটি বিতরণকারী কম্পিউটিং ইঞ্জিন এবং এর প্রধান বিমূর্ততা একটি লবণাক্ত বিতরণ ডেটাসেট ( আরডিডি ), যা বিতরণকৃত সংগ্রহ হিসাবে দেখা যায়। মূলত, আরডিডি উপাদানগুলি ক্লাস্টারের নোড জুড়ে বিভক্ত হয়, তবে স্পার্ক এটিকে ব্যবহারকারী থেকে দূরে রাখে, ব্যবহারকারীকে আরডিডি (সংগ্রহ) এর সাথে ইন্টারঅ্যাক্ট করতে দেয় যেন এটি স্থানীয় কোনও one
না অনেক বিস্তারিত মধ্যে পেতে, কিন্তু যখন আপনি একটি RDD (চালু বিভিন্ন রূপান্তরের চালানো map
, flatMap
, filter
এবং অন্যদের), আপনার রূপান্তর কোড (অবসান) হল:
- ড্রাইভার নোডে সিরিয়ালযুক্ত,
- ক্লাস্টারে উপযুক্ত নোডে প্রেরণ করা,
- deserialized,
- এবং অবশেষে নোডগুলিতে কার্যকর করা হয়েছে
আপনি অবশ্যই এটি স্থানীয়ভাবে চালাতে পারেন (যেমন আপনার উদাহরণ হিসাবে) তবে সেই সমস্ত পর্যায়গুলি (নেটওয়ার্কের মাধ্যমে শিপিং বাদে) এখনও ঘটে। [এটি আপনাকে প্রোডাক্টে মোতায়েনের আগে কোনও বাগগুলি ধরতে দেয়]
আপনার দ্বিতীয় ক্ষেত্রে যা ঘটে তা হ'ল আপনি testing
মানচিত্রের অভ্যন্তর থেকে শ্রেণিতে সংজ্ঞায়িত একটি পদ্ধতি কল করছেন । স্পার্ক দেখতে পায় এবং যেহেতু পদ্ধতিগুলি নিজেরাই সিরিয়ালাইজ করা যায় না, স্পার্ক পুরো ক্লাসটিকে সিরিয়ালাইজ করার চেষ্টা করে testing
, যাতে অন্য জেভিএম-তে কার্যকর হওয়ার পরে কোডটি এখনও কাজ করতে পারে work আপনার দুটি সম্ভাবনা রয়েছে:
হয় আপনি ক্লাস টেস্টিং সিরিয়ালযোগ্য করে তোলেন, তাই পুরো ক্লাসটি স্পার্কের মাধ্যমে সিরিয়ালাইজ করা যায়:
import org.apache.spark.{SparkContext,SparkConf}
object Spark {
val ctx = new SparkContext(new SparkConf().setAppName("test").setMaster("local[*]"))
}
object NOTworking extends App {
new Test().doIT
}
class Test extends java.io.Serializable {
val rddList = Spark.ctx.parallelize(List(1,2,3))
def doIT() = {
val after = rddList.map(someFunc)
after.collect().foreach(println)
}
def someFunc(a: Int) = a + 1
}
বা আপনি someFunc
কোনও পদ্ধতির পরিবর্তে ফাংশনটি তৈরি করেন (ফাংশনগুলি স্কালায় বস্তুগুলি হয়), যাতে স্পার্ক এটিকে সিরিয়ালায়িত করতে সক্ষম হবে:
import org.apache.spark.{SparkContext,SparkConf}
object Spark {
val ctx = new SparkContext(new SparkConf().setAppName("test").setMaster("local[*]"))
}
object NOTworking extends App {
new Test().doIT
}
class Test {
val rddList = Spark.ctx.parallelize(List(1,2,3))
def doIT() = {
val after = rddList.map(someFunc)
after.collect().foreach(println)
}
val someFunc = (a: Int) => a + 1
}
একই রকম, তবে শ্রেণিকরণ সিরিয়ালাইজেশনের ক্ষেত্রে একই সমস্যাটি আপনার আগ্রহী হতে পারে না এবং আপনি এটি স্পার্ক সামিট ২০১৩ উপস্থাপনায় পড়তে পারেন ।
পার্শ্ব নোট হিসাবে, আপনি আবার লিখতে rddList.map(someFunc(_))
পারেন rddList.map(someFunc)
, সেগুলি হুবহু এক। সাধারণত, দ্বিতীয়টি পছন্দ করা হয় কারণ এটি কম ভার্বোস এবং পরিষ্কার পড়ার মতো।
সম্পাদনা করুন (2015-03-15): Spark-5307 চালু SerializationDebugger এবং স্পার্ক 1.3.0 এটি ব্যবহার করতে প্রথম সংস্করণ। এটি একটি নোট-সিরিজযোগ্য এক্সসেপশনে সিরিয়ালাইজেশন পাথ যুক্ত করে । যখন একটি নোট-সিরিজাইজএক্সেপশন মুখোমুখি হয়, তখন ডিবাগার বস্তুটির গ্রাফ ঘুরে দেখেন যে সিরিয়ালাইজ করা যায় না এমন বস্তুর দিকে পাথ খুঁজে পেতে এবং ব্যবহারকারীকে অবজেক্টটি সন্ধান করতে সহায়তা করার জন্য তথ্য তৈরি করে।
ওপি-র ক্ষেত্রে, এটি স্টাডাউটে মুদ্রিত হয়:
Serialization stack:
- object not serializable (class: testing, value: testing@2dfe2f00)
- field (class: testing$$anonfun$1, name: $outer, type: class testing)
- object (class testing$$anonfun$1, <function1>)