スパークについて理解する上で非常に重要なことの1つは、分散環境だということです。
RDD
の名前はResilient Distributed Datasets
の略語です。スパークRDD内の項目は、一般的に、partitions
に分割され、Sparkクラスタのさまざまなノードに分散されます。
あなたがyourRdd.map(a => a.toString)
のようなものを呼び出すと、このRDDのmap
実装は、それは最初、閉鎖にこの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
のインスタンスさえもシリアル化できません。
SparkConf
を作成するのに通常は火花RDDを使用しないでください。SparkContext
がなくてもRDDが存在しないため、SparkConf
を初期化する必要があります。
しかし、この場合、あなたはそれを行う必要があると言うことができます。次に、RDDから通常のスカラーリストを取得してから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)))
Googleで検索しました。これに特有のものは何も見つかりませんでした。私はこれをシリアル化できる方法はありますか? – Darshan