1

私はAmazon EMRクラスタでpysparkを実行しています。私は火花提出python2.7環境でを使用して、このスクリプトを実行すると、私は、...私は火花提出を使ってS3にデータを書き込むことができるかどうかを確認するためにpyspark saveAsTextFileはPython 2.7では動作しますが、3.4では動作しません

from pyspark import SparkContext 
sc = SparkContext() 
numbers = sc.parallelize(range(100)) 
numbers.saveAsTextFile("s3n://my-bucket/test.txt") 
sc.stop() 

を非常に簡単なテストスクリプトを持っているそれだけで正常に動作します。しかし、私はpython3.4環境で同じスクリプトを実行しようとすると、私は以下のトレースバックを得る...

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last): 
File ".../pyspark/worker.py", line 161, in main 
    func, profiler, deserializer, serializer = read_command(pickleSer, infile) 
File ".../pyspark/worker.py", line 54, in read_command 
    command = serializer._read_with_length(file) 
File ".../pyspark/serializers.py", line 164, in _read_with_length 
    return self.loads(obj) 
File ".../pyspark/serializers.py", line 419, in loads 
    return pickle.loads(obj, encoding=encoding) 
AttributeError: Can't get attribute 'unicode' on <module 'builtins' (built-in)> 

私はcondaを使用して、私のPython環境を操作し、PYSPARK_PYTHONPYSPARK_DRIVER_PYTHON変数を設定することです。

python 3にsaveAsTextFileを使用して問題がありますか?あるいは、私は私のpython 3環境を設定するステップを逃していますか?

ありがとうございます!

答えて

0

[OK]を、この

輸出PYSPARK_PYTHONを試してみてくださいので、これはのpython3とは何の関係もあり、私のconda環境に関係するすべてのものを持っていないように見えます。要するに、私はbootstrap.shにコンドーム環境を設定しましたが、実際にはマスターノードでのみ有効にしました。したがって、マスターノードはconda pythonを使用していましたが、作業者はシステムpythonを使用していました。

私の解決策は今度はPYSPARK_PYTHON=/home/hadoop/miniconda3/envs/myenv/pythonに設定されています。

ワーカーノードで私のconda環境を有効にする良い方法はありますか?

0

pysparkで使用するときに問題を引き起こす可能性がありますのpython 3.4を実行している間、2.7

次のリンクはアマゾンEMRが火花を使用するように設定する方法について説明し、あなたのEMRクラスタはpyspark 2.7を使用するように設定されている可能性がありpython 3.4

と私は、Python 3.4.3がアマゾンEMRクラスターインスタンス、 が、スパークや他のプログラムで使用されるデフォルトのPythonのバージョンにインストールされている知っている のPython 2.7.10です。デフォルトのPythonバージョンをPython 3 に変更してpysparkジョブを実行するにはどうすればよいですか?

https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/


のpython3対Python2でrange()機能の異なる実装があります。

Python2でrange()a list of numbersを返します。
Python2でrange()a generatorを返します。

あなたがのpython3を使用しているときに、あなたが提供する入力が代わりのpython3対python2でrange()間の異なる程度list of numbers

詳細情報のgeneratorです:

Python2https://docs.python.org/2/library/functions.html#range 範囲(開始、停止[、ステップ])

算術 の進捗を含むリストを作成する多彩な機能です。これはforループで最も頻繁に使用されます。引数は、 が平易な整数でなければなりません。 step引数を省略すると、デフォルトは1になります。 start引数を省略すると、デフォルトは0になります。完全形式 は、単純な整数のリスト[start、start + step、start + 2 * step、 ..]。ステップが正である場合、最後の要素は最大の開始です。 + i *ステップは停止よりも小さくなります。 stepが負の場合、最後の要素はstopより大きい最小の開始+ i *ステップです。ステップはゼロであってはなりません (そうでなければValueErrorが発生します)。

例:

>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

パイソン3 https://docs.python.org/3/library/functions.html#func-range範囲([ステップ]停止、開始)

ではなく関数で、範囲は実際には範囲とシーケンス型に記載されているような不変シーケンス タイプ - リスト、tupル、範囲。

>>> range(10) 
range(0, 10) 
+0

ご返信ありがとうございます。 '' a '、' b '、' c '、' d '' 'に' range(100) 'を置き換え、' 'PYSPARK_PYTHON":/ usr/bin/python3 "'残念ながら私はまだ同じエラーが発生しています。 –

0

=のpython3

関連する問題