Apache Sparkを使用してMLを行う。シリアル化エラーが発生し続ける


7

そのため、感情分析を行うためにSparkを使用しています。Pythonオブジェクトを渡すために使用している(おそらく)シリアライザでエラーが発生し続けています。

PySpark worker failed with exception:
Traceback (most recent call last):
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/worker.py", line 77, in main
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 191, in dump_stream
    self.serializer.dump_stream(self._batched(iterator), stream)
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 123, in dump_stream
    for obj in iterator:
  File "/Users/abdul/Desktop/RSI/spark-1.0.1-bin-    hadoop1/python/pyspark/serializers.py", line 180, in _batched
    for item in iterator:
TypeError: __init__() takes exactly 3 arguments (2 given)

シリアライザのコードはここにあります

そして私のコードはここにあります


回答:


10

ほとんどの場合、(Py)Sparkのシリアル化エラーは、分散コードの一部(たとえばに渡される関数map)がシリアル化できないデータに依存していることを意味します。次の例を検討してください。

rdd = sc.parallelize(range(5))
rdd = rdd.map(lambda x: x + 1)
rdd.collect()

ここでは、すべてのワーカーに送信するコレクションとラムダ関数を分散しています。Lambdaは完全に自己完結型であるため、そのバイナリ表現を他のノードに心配することなく簡単にコピーできます。

次に、物事をもう少し面白くしましょう。

f = open("/etc/hosts")
rdd = sc.parallelize(range(100))
rdd = rdd.map(lambda x: f.read())
rdd.collect()
f.close()

ブーム!シリアル化モジュールの奇妙なエラー!ちょうど起こったことfは、ファイルオブジェクトであるをワーカーに渡そうとしたことです。明らかに、ファイルオブジェクトはローカルデータのハンドルであるため、他のマシンに送信することはできません。


では、特定のコードで何が起こっているのでしょうか?実際のデータがなく、レコード形式がわからなければ、完全にデバッグすることはできませんが、問題は次の行にあると思います。

def vectorizer(text, vocab=vocab_dict):

Pythonでは、キーワード引数は、関数が初めて呼び出されたときに初期化されます。sc.parallelize(...).map(vectorizer)その定義の直後に呼び出すと、vocab_dictローカルで利用可能ですが、リモートワーカーはそれについてまったく何も知りません。したがって、関数は予想よりも少ないパラメーターで呼び出され、__init__() takes exactly 3 arguments (2 given)エラーが発生します。

また、sc.parallelize(...)...collect()呼び出しのパターンが非常に悪いことに注意してください 。まず、コレクションをクラスター全体に分散し、いくつかの計算を行ってから、結果をプルします。しかし、ここでデータをやり取りすることはかなり無意味です。代わりに、これらの計算をローカルで実行し、Sparkの並列プロセスを実行できるのは、非常に大きなデータセット(main amazon_datasetなど)を操作する場合のみです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.