我在亚马逊的EMR集群上运行火星雨。我有一个非常简单的测试脚本,看看我是否可以使用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环境中使用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环境时遗漏了一步?
谢谢!
发布于 2017-01-30 22:01:41
好的,看起来这与python3无关,一切都与我的conda环境有关。简而言之,我在我的bootstrap.sh
中设置了一个conda环境,但实际上我只在主节点上激活了它。所以主节点使用的是conda,但是工作人员使用的是system。
我现在的解决方案是设置PYSPARK_PYTHON=/home/hadoop/miniconda3/envs/myenv/python
。
是否有更好的方法在工作节点上激活我的conda环境?
发布于 2017-01-29 08:44:31
当您运行python 3.4时,您的EMR集群可能被配置为使用pyspark 2.7,这可能会在使用pyspark 2.7时引起问题。
下面的链接描述如何将Amazon配置为在python3.4中使用spark
我知道Python3.4.3安装在Amazon集群实例上,但是Spark和其他程序使用的默认Python版本是Python2.7.10。如何将默认Python版本更改为Python3并运行pyspark作业?
https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/
range()
函数在Python2和Python3中有不同的实现。
在Python2中,range()
返回a list of numbers
。
在Python2中,range()
返回a generator
。
因此,当您使用Python3时,您提供的输入是generator
而不是list of numbers
。
关于range()
在python2 vs python3:中的不同之处的更多信息
Python2 https://docs.python.org/2/library/functions.html#range范围(开始、停止、步骤)
这是一个通用的函数,用于创建包含算术进度的列表。它最常用于for循环。参数必须是纯整数。如果省略step参数,则默认为1;如果省略start参数,则默认为0。完整表单返回普通整数开始、开始+步骤、开始+2*步骤、.的列表。如果step为正,则最后一个元素是最大的start +i*步骤小于stop;如果step为负值,则最后一个元素是最小的start +I*步骤大于stop。步骤不能为零(否则引发ValueError )。
示例:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Python3 https://docs.python.org/3/library/functions.html#func-range 范围(开始、停止、步骤)
range并不是一个函数,它实际上是一种不可变的序列类型,如range和sequence类型中所描述的那样-- list、tuple、range。
>>> range(10)
range(0, 10)
发布于 2017-01-30 18:22:19
尝尝这个
导出PYSPARK_PYTHON=python3
https://stackoverflow.com/questions/41916902
复制相似问题