我在Amazon EMR集群上运行pyspark . 我有一个非常简单的测试脚本,看看我是否可以使用spark-submit将数据写入s3 ...
from pyspark import SparkContext
sc = SparkContext()
numbers = sc.parallelize(range(100))
numbers.saveAsTextFile("s3n://my-bucket/test.txt")
sc.stop()
当我在python2.7环境中使用spark-submit运行这个脚本时,它运行得很好 . 但是当我尝试在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并通过设置 PYSPARK_PYTHON
和 PYSPARK_DRIVER_PYTHON
变量来操纵我的python环境 .
在python 3中使用 saveAsTextFile
有问题吗?或者我错过了设置我的python 3环境的一步?
谢谢!
3 回答
您正在运行python 3.4时,您的EMR集群可能配置为使用pyspark 2.7,这可能会在使用pyspark 2.7时出现问题
以下链接描述了如何配置Amazon EMR以使用spark与python 3.4
https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/
Python2与Python3中的
range()
函数有不同的实现 .在Python2中
range()
返回a list of numbers
.在Python2中
range()
返回a generator
.因此,当您使用Python3时,您提供的输入是
generator
而不是list of numbers
More info about the different between range() in python2 vs python3:
Python2 https://docs.python.org/2/library/functions.html#range range(start,stop [,step])
例:
Python 3 https://docs.python.org/3/library/functions.html#func-range range(start, stop[, step])
试试这个
导出PYSPARK_PYTHON = python3
好的,所以看起来这与python3无关,而且与我的conda环境有关 . 简而言之,我在
bootstrap.sh
中设置了一个conda环境,但我实际上只在主节点上激活了它 . 所以主节点使用的是conda python,但是工作者正在使用系统python .我现在的解决方案是设置
PYSPARK_PYTHON=/home/hadoop/miniconda3/envs/myenv/python
.有没有更好的方法在工作节点上激活我的conda环境?