在安装spark 2.4.4后尝试运行pyspark时如何解决'TypeError:整数是必需的(got类型字节)'错误

Chr*_*ris 4 apache-spark pyspark

我已经安装了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)
Run Code Online (Sandbox Code Playgroud)

Ani*_*non 14

正如约翰正确指出的那样,它的 python 和 pyspark 版本不匹配。对于较新的python版本,您可以尝试,

pip install --upgrade pyspark
Run Code Online (Sandbox Code Playgroud)

这将更新包,如果有的话。如果这没有帮助,那么您可能必须降级到兼容的 python 版本。


pyspark 包文档明确指出:

注意:如果您将它与 Spark 独立集群一起使用,您必须确保版本(包括次要版本)匹配,否则您可能会遇到奇怪的错误。


Jel*_*mer 8

python 3.8 的问题已在最新版本中得到解决。我收到此错误是因为我的 scikit-learn 版本非常过时

pip install scikit-learn --upgrade
Run Code Online (Sandbox Code Playgroud)

解决了问题


Joh*_*ohn 7

发生这种情况是因为您使用的是python 3.8。pyspark的最新pip版本不支持python 3.8。现在降级到python 3.7,应该没问题。

  • 我可以确认 pyspark 2.4.4 可以与 python3.7.5 一起使用 (3认同)
  • 可以确认使用 python 3.7.0 的新 conda 环境可以正常工作!谢谢。 (2认同)
  • 以下是问题跟踪器错误的链接:https://issues.apache.org/jira/browse/SPARK-29536 和 github pull 请求:https://github.com/apache/spark/pull/26194 。此问题的修复将成为 pyspark 3.0 的一部分。2019年3月30日,v3.0.0-rc1发布测试版:https://github.com/apache/spark/releases。希望 v3.0.0 很快就会推出。 (2认同)
  • 我使用spark 2.4.6,并使用[this](/sf/answers/4300145671/)在ubuntu 20.04上安装python 3.7.8解决了问题。 (2认同)

ei-*_*rad 6

作为一种肮脏的解决方法,可以将 替换为函数文档字符串建议的_cell_set_template_code仅 Python3 实现:_make_cell_set_template_code

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()
Run Code Online (Sandbox Code Playgroud)

这是spark v2.4.5的补丁:https://gist.github.com/ei-grad/d311d0f34b60ebef96841a3a39103622

通过以下方式应用它:

git apply <(curl https://gist.githubusercontent.com/ei-grad/d311d0f34b60ebef96841a3a39103622/raw)
Run Code Online (Sandbox Code Playgroud)

这解决了 ./bin/pyspark 的问题,但 ./bin/spark-submit 使用捆绑的 pyspark.zip 及其自己的 cloudpickle.py 副本。如果它在那里得到修复,那么它仍然无法工作,在 unpickling 中的某些对象时会因相同的错误而失败pyspark/serializers.py

不过 Spark v3.0.0-preview2 似乎已经支持 Python 3.8,所以可以尝试一下。或者,坚持使用 Python 3.7,就像已接受的答案所建议的那样。