對於瞭解spark而言非常重要的一件事是它是一個分佈式環境。
名稱RDD
是Resilient Distributed Datasets
的縮寫。火花RDD中的項一般分爲partitions
,分佈在Spark集羣中的各個不同節點上。
當你調用像yourRdd.map(a => a.toString)
,該map
實現這個RDD的知道,它必須首先把這個包a => a.toString
功能的關閉,然後序列化閉合,然後將其發送到有該RDD
的partitions
的所有節點。結果的實際計算髮生在這些節點上。
所以......當你在處理RDD
的時候,請確保你不會混淆/混合使用分配RDD
api和普通的Scala API。
推薦的方法給你寫一段代碼會,
val yourRdd = sc.textFile("hdfs://ip:8020/property.conf"))
yourRdd.foreach(line =>
val c = line.split("=")
println(c(0) + " " + c(1))
)
在
SparkConf.set(c(0), c(1))
線
這裏,SparkConf
是class
,你通常不能序列classes
。您也不能在class SparkConf
上調用成員函數set
。您需要創建classes
的實例。另外SparkConf
碰巧是一個沒有實現可序列化接口的類,因此即使SparkConf
的實例也是不可序列化的。
通常情況下,您不應該使用火花RDD來創建您的SparkConf
,因爲RDD不會在沒有SparkContext
的情況下存在,而這又需要SparkConf
進行初始化。
但是對於這種情況可以說你需要這麼做......然後你首先從你的RDD獲得一個正常的scala列表然後用它來創建你的SparkConf。
val mySparkConf = new SparkConf()
val yourRdd = sc.textFile("hdfs://ip:8020/property.conf"))
val yourList = yourRdd.foreach(line =>
val c = line.split("=")
).collect.toList
yourList.foreach(c => mySparkConf.set(c(0), c(1)))
我在谷歌搜索。但沒有發現任何特定的事情。有什麼辦法可以序列化這個 – Darshan