我正在Amazon EMR集群上运行pyspark。我有一个非常简单的测试脚本,看看我是否可以使用spark-submit ...
将数据写入s3from 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环境的一步?
谢谢!
答案 0 :(得分:0)
当您运行python 3.4时,可能会将EMR群集配置为使用pyspark 2.7,这可能会在使用pyspark 2.7时导致问题
以下链接描述了如何配置Amazon EMR以使用spark with python 3.4
我知道在Amazon EMR集群实例上安装了Python 3.4.3, 但是Spark和其他程序使用的默认Python版本是 Python 2.7.10。如何将默认Python版本更改为Python 3 并运行一个pyspark工作?
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
有关python2与python3中range()
之间差异的更多信息:
Python2 https://docs.python.org/2/library/functions.html#range 范围(开始,停止[,步骤])
这是一个用于创建包含算术的列表的通用函数 级数。它最常用于for循环。争论必须 是简单的整数。如果省略step参数,则默认为1。 如果省略start参数,则默认为0.完整表单 返回普通整数列表[start,start + step,start + 2 * 步, ...]。如果step为正,则最后一个元素是最大的开始 + i *步骤少于停止;如果step为负数,则最后一个元素是最小的start + i * step大于stop。步骤不能为零 (或者引发ValueError)。
示例:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Python 3 https://docs.python.org/3/library/functions.html#func-range 范围(开始,停止[,步骤])
范围实际上是一个不可变的序列,而不是一个函数 类型,如范围和序列类型中记录的 - 列表,元组,范围。
>>> range(10)
range(0, 10)
答案 1 :(得分:0)
试试这个
导出PYSPARK_PYTHON = python3
答案 2 :(得分:0)
好的,所以看起来这与python3无关,而且与我的conda环境有关。简而言之,我在+
中设置了一个conda环境,但我实际上只在主节点上激活了它。所以主节点使用的是conda python,但是工作者正在使用system python。
我现在的解决方案是设置var searchResponse = client.Search<Invoice>(s => s
.AllIndices()
.AllTypes()
.Query(q => +q
.Terms(m => m
.Field(f => f.LineItems.First().ListItems.First().ListItemID)
.Terms(ids)
)
)
);
。
有没有更好的方法在工作节点上激活我的conda环境?