2016-05-03 6 views
0

マップ操作内から直列化不可能なJavaオブジェクトを使用する必要があります。ドライバで最初に初期化しようとすると、「タスクはシリアル化できません」というエラーが表示されます。最適なオプションは、各分割に対してそれを宣言することですが、オブジェクトの初期化はHDFSからいくつかのファイルを読み込みます。それを可能にするには、私は労働者(NullPointerException)で利用できないように見えるsc.hadoopConfiguration変数が必要です。作業員のHDFSから読み込む直列化不可能なオブジェクトを初期化する

労働者側のHDFSから読むことはできますか?もしそうなら、私はmapPartitionsを使って各パーティションのオブジェクトを初期化することができます。そうでない場合、最良のアプローチは何ですか?

+1

、あなたのオブジェクトを設定するには、HDFSからどのくらいのデータを読んでいますか?私は多くの場合、ドライバ内で構成データを収集し、文字列の配列を作成します。私はScalaを使用しますが、シングルトンオブジェクトを作成し、エグゼキュータコード内のどこにでも、Array of Stringsを引数として渡すオブジェクトを使用します。初期化されていない場合は、文字列の配列で初期化されます。既に初期化されている場合は、文字列の配列を無視して、あなたがしたいことを何でもします。このようにすると、パーティションごとに気にする必要はありません。実行者ごとに1回しか発生しません。 –

+0

良いアプローチ。私はこれを@zsxwingが提供する答えにマージしようとします。ありがとうございました! – Miguel

答えて

1

あなたはSerializableWritablesc.hadoopConfigurationをラップし、このようなあなたのコードでそれを使用することができます。

val hadoopConf = new SerializableWritable(sc.hadoopConfiguration) 
    sc.parallelize(1 to 1000, 4).mapPartitions { iter => 
    val conf = hadoopConf.value 
    ... 
    } 
+0

ありがとう!完璧に動作します。あなたはhadoop構成が労働者に渡されない理由を知っていますか? – Miguel

+0

これは、Sparkが他のプラットフォームで動作する可能性があり、そのためにhadoop設定を必要としないためです。ところで、 'worker'ではなく' executor'と呼ばれるべきです。 「労働者」はスパークでは別の意味を持っています。 – zsxwing

関連する問題