Como corrigir o erro 'TypeError: é necessário um número inteiro (obteve o tipo bytes)' ao tentar executar o pyspark após a instalação do spark 2.4.4

16

Instalei o OpenJDK 13.0.1 e python 3.8 e spark 2.4.4. As instruções para testar a instalação são executar. \ Bin \ pyspark a partir da raiz da instalação do spark. Não tenho certeza se perdi uma etapa na instalação do spark, como definir alguma variável de ambiente, mas não consigo encontrar mais instruções detalhadas.

Posso executar o interpretador python na minha máquina, por isso estou confiante de que ele está instalado corretamente e a execução de "java -version" me dá a resposta esperada; portanto, não acho que o problema ocorra com nenhum deles.

Eu recebo um rastreamento de pilha dos erros do 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)
Chris
fonte

Respostas:

44

Isso está acontecendo porque você está usando o python 3.8. A versão mais recente do pip do pyspark (pyspark 2.4.4 no momento da redação) não suporta python 3.8. Faça o downgrade para python 3.7 por enquanto, e você deve ficar bem.

John
fonte
Obrigado, isso é ótimo!
Chris
isso não funcionou para mim, rebaixado para 3.7.6
user2331566
11
Posso confirmar que o pyspark 2.4.4 está funcionando para mim com python3.7.5
mork
Pode confirmar que um novo ambiente conda com python 3.7.0 funciona! Obrigado.
J. Offenberg
Confirmando que 3.7.7 funcionou
kolistivra
1

Como solução alternativa suja, pode-se substituir a _cell_set_template_codeimplementação somente em Python3 sugerida pela documentação da _make_cell_set_template_codefunção:

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()

Aqui está um patch para o spark v2.4.5: https://gist.github.com/ei-grad/d311d0f34b60ebef96841a3a39103622

Aplique por:

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

Isso corrige o problema com ./bin/pyspark, mas ./bin/spark-submit usa o pacote pyspark.zip com sua própria cópia do cloudpickle.py. E se fosse corrigido lá, ainda assim não funcionaria, falhando com o mesmo erro ao retirar algum objeto pyspark/serializers.py.

Mas parece que o suporte ao Python 3.8 já chegou ao Spark v3.0.0-preview2, para que você possa experimentá-lo. Ou siga o Python 3.7, como sugere a resposta aceita.

ei-grad
fonte
0

Tente instalar a versão mais recente do pyinstaller que pode ser compatível com o python 3.8 usando este comando:

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

referência :
https://github.com/pyinstaller/pyinstaller/issues/4265

mohamed_18
fonte
11
Eu fiz isso e pysparkainda dá o mesmo erro
javadba 10/03
O mesmo aqui. Parece que este é um problema diferente, mesmo que seja a mesma mensagem de erro. O problema do OP acontece em pyspark\cloudpickle.py. O problema do PyInstaller ocorre em PyInstaller\building\utils.py.
Steven