如何在安装 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:需要一个整数(获取类型字节)”错误的主要内容,如果未能解决你的问题,请参考以下文章

Spark安装(单机版)

Centos7安装Spark2.4

大数据高可用集群环境安装与配置(09)——安装Spark高可用集群

Spark 驱动程序中的内存泄漏

我们如何在 Spark 结构化流 2.4.4 中缓存/持久化数据集

将数据集写入 MS SQL 服务器失败