如何在安装 spark 2.4.4 后尝试运行 pyspark 时修复“TypeError:需要一个整数(获取类型字节)”错误
Posted
技术标签:
【中文标题】如何在安装 spark 2.4.4 后尝试运行 pyspark 时修复“TypeError:需要一个整数(获取类型字节)”错误【英文标题】:How to fix 'TypeError: an integer is required (got type bytes)' error when trying to run pyspark after installing spark 2.4.4 【发布时间】:2019-11-04 20:10:49 【问题描述】:我已经安装了 OpenJDK 13.0.1 和 python 3.8 和 spark 2.4.4。测试安装的说明是从 spark 安装的根目录运行 .\bin\pyspark。我不确定我是否错过了 spark 安装中的一个步骤,比如设置一些环境变量,但我找不到任何进一步的详细说明。
我可以在我的机器上运行 python 解释器,所以我确信它安装正确并且运行“java -version”会给我预期的响应,所以我认为问题不在于其中任何一个。
我从 cloudpickly.py 中获得了错误堆栈跟踪:
Traceback (most recent call last):
File "C:\software\spark-2.4.4-bin-hadoop2.7\bin\..\python\pyspark\shell.py", line 31, in <module>
from pyspark import SparkConf
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\__init__.py", line 51, in <module>
from pyspark.context import SparkContext
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\context.py", line 31, in <module>
from pyspark import accumulators
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\accumulators.py", line 97, in <module>
from pyspark.serializers import read_int, PickleSerializer
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\serializers.py", line 71, in <module>
from pyspark import cloudpickle
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py", line 145, in <module>
_cell_set_template_code = _make_cell_set_template_code()
File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py", line 126, in _make_cell_set_template_code
return types.CodeType(
TypeError: an integer is required (got type bytes)
【问题讨论】:
【参考方案1】:发生这种情况是因为您使用的是 python 3.8。 pyspark 的最新 pip 版本(撰写本文时为 pyspark 2.4.4)不支持 python 3.8。现在降级到 python 3.7,你应该没问题。
【讨论】:
我可以确认 pyspark 2.4.4 正在为我使用 python3.7.5 可以确认使用 python 3.7.0 的全新 conda 环境有效!谢谢。 这里是问题跟踪器错误的链接:issues.apache.org/jira/browse/SPARK-29536 和 github 拉取请求:github.com/apache/spark/pull/26194。对此的修复将是 pyspark 3.0 的一部分。 2019 年 3 月 30 日,v3.0.0-rc1 发布测试版:github.com/apache/spark/releases。希望 v3.0.0 即将推出。 我使用的是 Spark 2.4.4 版,它与 conda python 3.7.0 有同样的问题 我使用 spark 2.4.6,在 ubuntu 20.04 上使用 this 安装 python 3.7.8 解决了这个问题。【参考方案2】:正如 John 正确指出的那样,它的 python 和 pyspark 版本不匹配。 对于较新的python版本,您可以尝试,
pip install --upgrade pyspark
如果有可用的包,这将更新包。如果这没有帮助,那么您可能必须降级到兼容的 python 版本。
pyspark
package doc 明确指出:
注意:如果您将其与 Spark 独立集群一起使用,您必须确保版本(包括次要版本)匹配,否则您可能会遇到奇怪的错误。
【讨论】:
【参考方案3】:作为一种肮脏的解决方法,可以通过_make_cell_set_template_code
函数的文档字符串将_cell_set_template_code
替换为纯Python3实现suggested:
Notes
-----
In Python 3, we could use an easier function:
.. code-block:: python
def f():
cell = None
def _stub(value):
nonlocal cell
cell = value
return _stub
_cell_set_template_code = f()
这里是 spark v2.4.5 的补丁:https://gist.github.com/ei-grad/d311d0f34b60ebef96841a3a39103622
通过以下方式申请:
git apply <(curl https://gist.githubusercontent.com/ei-grad/d311d0f34b60ebef96841a3a39103622/raw)
这解决了 ./bin/pyspark 的问题,但 ./bin/spark-submit 使用捆绑的 pyspark.zip 及其自己的 cloudpickle.py 副本。如果它在那里被修复,那么它仍然无法工作,在取消pyspark/serializers.py
中的某些对象时失败并出现同样的错误。
但是看起来 Python 3.8 支持已经到了 spark v3.0.0-preview2,所以可以尝试一下。或者,按照公认的答案建议,坚持使用 Python 3.7。
【讨论】:
【参考方案4】:确保使用正确版本的 Java、Python 和 Spark。 我遇到了由过时的 Spark 版本 (Spark 2.4.7) 引起的相同错误。
通过下载最新的 Spark 3.0.1、Python 3.8(作为 Anaconda3 2020.07 的一部分)和 Java JDK 8 为我解决了问题!
【讨论】:
这里有同样的问题。通过从 PySpark 2.4.4 升级到 3.01 解决了这个问题。【参考方案5】:尝试使用此命令安装可以与 python 3.8 兼容的最新版本的 pyinstaller:
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
参考:https://github.com/pyinstaller/pyinstaller/issues/4265
【讨论】:
我这样做了,pyspark
仍然给出同样的错误
这里也一样。似乎这是一个不同的问题,即使它是相同的错误消息。 OP 的问题发生在pyspark\cloudpickle.py
。 PyInstaller 问题发生在PyInstaller\building\utils.py
。以上是关于如何在安装 spark 2.4.4 后尝试运行 pyspark 时修复“TypeError:需要一个整数(获取类型字节)”错误的主要内容,如果未能解决你的问题,请参考以下文章
大数据高可用集群环境安装与配置(09)——安装Spark高可用集群