Apache spark 如何修复';TypeError:需要一个整数(获取类型字节)';安装spark 2.4.4后尝试运行pyspark时出错

Apache spark 如何修复';TypeError:需要一个整数(获取类型字节)';安装spark 2.4.4后尝试运行pyspark时出错,apache-spark,pyspark,Apache Spark,Pyspark,我已经安装了OpenJDK 13.0.1、python 3.8和spark 2.4.4。测试安装的说明将运行。\bin\pyspark,从spark安装的根目录开始。我不确定我是否错过了spark安装的一个步骤,比如设置一些环境变量,但我找不到任何进一步的详细说明 我可以在我的机器上运行python解释器,因此我确信它安装正确,并且运行“java-version”会给我预期的响应,所以我认为这两个都不是问题所在 我从cloudpickly.py获得了错误的堆栈跟踪: Traceback (mos

我已经安装了OpenJDK 13.0.1、python 3.8和spark 2.4.4。测试安装的说明将运行。\bin\pyspark,从spark安装的根目录开始。我不确定我是否错过了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)
回溯(最近一次呼叫最后一次):
文件“C:\software\spark-2.4.4-bin-hadoop2.7\bin\..\python\pyspark\shell.py”,第31行,在
从pyspark导入SparkConf
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\ \uuuu init\uuuu.py”,第51行,在
从pyspark.context导入SparkContext
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\context.py”,第31行,在
来自pyspark进口蓄能器
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\acculators.py”,第97行,在
从pyspark.serializers导入read_int,PickleSerializer
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\serializers.py”,第71行,在
从Pypark导入cloudpickle
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py”,第145行,在
_单元设置模板代码=\u生成单元设置模板代码()
文件“C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py”,第126行,位于“生成单元集模板”代码中
返回类型.代码类型(
TypeError:需要整数(获取类型字节)

之所以发生这种情况,是因为您使用的是python 3.8。pyspark的最新pip版本(撰写本文时为pyspark 2.4.4)不支持python 3.8。请暂时降级到python 3.7,您应该不会有问题。

使用以下命令尝试安装最新版本的pyinstaller,该版本可以与python 3.8兼容:

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
参考

作为一种肮脏的解决方法,可以通过
\u make\u cell\u set\u template\u code
函数的docstring将
\u cell\u template\u code>替换为Python3-only实现:

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的补丁:

通过以下方式应用它:

git apply <(curl https://gist.githubusercontent.com/ei-grad/d311d0f34b60ebef96841a3a39103622/raw)

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

pip install --upgrade pyspark
这将更新包(如果有可用的话)。如果这没有帮助,那么您可能必须降级到兼容的python版本


pyspark
package doc明确规定:

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


确保使用正确版本的Java、Python和Spark。 我得到了由过时的Spark版本(Spark 2.4.7)引起的相同错误


下载Python 3.8旁边最新的Spark 3.0.1(作为Anaconda3 2020.07的一部分)Java JDK 8为我解决了这个问题!

我可以确认pyspark 2.4.4在python3.7.5上对我有效,可以确认使用python3.7.0的全新conda环境可以正常工作!谢谢。这是问题跟踪程序bug的链接:和github pull请求:用于此。这方面的修复将是pyspark 3.0的一部分。2019年3月30日,v3.0.0-rc1是在测试版中发布的:。希望v3.0.0即将发布。我使用Spark 2.4.4版,它给conda python 3.7.0带来了同样的问题。我使用Spark 2.4.6,并在ubuntu 20.04上安装python 3.7.8,使用解决了这个问题。我这样做了,
pyspark
仍然在这里给出同样的错误。看起来这是一个不同的问题,即使我相同的错误消息。OP的问题发生在
pyspark\cloudpickle.py
中。PyInstaller问题发生在
PyInstaller\building\utils.py
中。