Bagaimana cara mengatur versi python pengemudi di spark?

88

Saya menggunakan spark 1.4.0-rc2 jadi saya bisa menggunakan python 3 dengan spark. Jika saya menambahkan export PYSPARK_PYTHON=python3ke file .bashrc saya, saya dapat menjalankan spark secara interaktif dengan python 3. Namun, jika saya ingin menjalankan program mandiri dalam mode lokal, saya mendapatkan kesalahan:

Exception: Python in worker has different version 3.4 than that in driver 2.7, PySpark cannot run with different minor versions

Bagaimana cara menentukan versi python untuk driver? Pengaturan export PYSPARK_DRIVER_PYTHON=python3tidak berhasil.

Kevin
sumber

Jawaban:

34

Anda perlu memastikan proyek mandiri yang Anda luncurkan diluncurkan dengan Python 3. Jika Anda mengirimkan program mandiri Anda melalui spark-submit maka itu akan berfungsi dengan baik, tetapi jika Anda meluncurkannya dengan python pastikan Anda menggunakan python3 untuk memulai aplikasi Anda.

Juga, pastikan Anda telah mengatur variabel env Anda ./conf/spark-env.sh(jika tidak ada, Anda dapat menggunakan spark-env.sh.templatesebagai basis.)

Holden
sumber
3
@Kevin - Saya mengalami masalah yang sama, dapatkah Anda memposting solusi terkait perubahan yang Anda buat di spark-evn.sh.
Dev Patel
1
Ini adalah cara yang tepat untuk menginduksi variabel PATH ke Spark, alih-alih memodifikasi .bashrc.
CᴴᴀZ
Mengapa menggunakan python 3 diperlukan @Holden?
jerzy
Spark dapat berjalan di python2, tetapi dalam hal ini pengguna mencoba menentukan python3 dalam pertanyaan mereka. Versi Python mana pun itu perlu dilakukan secara konsisten.
Holden
83

Pengaturan PYSPARK_PYTHON=python3dan PYSPARK_DRIVER_PYTHON=python3keduanya ke python3 berfungsi untuk saya. Saya melakukan ini menggunakan ekspor di .bashrc saya. Pada akhirnya, ini adalah variabel yang saya buat:

export SPARK_HOME="$HOME/Downloads/spark-1.4.0-bin-hadoop2.4"
export IPYTHON=1
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

Saya juga mengikuti tutorial ini untuk membuatnya bekerja dari dalam notebook Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/

fccoelho.dll
sumber
5
Ada kesalahan pada spark 2.1 terkait dengan opsi "IPYTHON = 1". Pesan kesalahannya adalah "IPYTHON dan IPYTHON_OPTS dihapus di Spark 2.0+. Hapus ini dari lingkungan dan setel PYSPARK_DRIVER_PYTHON dan PYSPARK_DRIVER_PYTHON_OPTS sebagai gantinya."
notilas
1
PYSPARK_PYTHON=python3mengatur versi Python dari pekerja, bukan?
Joe
Jika dijalankan dari PyCharm, tambahkan PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3ke Run> Edit Configurations> {your_run_config}> Variabel Lingkungan. Untuk menjadikannya default untuk semua konfigurasi proses, perbarui Variabel Lingkungan untuk template yang diinginkan di bawah Run> Edit Configurations> Templates
MisterEd
28

Membantu dalam kasus saya:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
Nikolay Bystritskiy
sumber
1
ini berfungsi untuk saya setelah menyetel PYSPARK_DRIVER_PYTHON ke nilai yang sama dengan PYSPARK_PYTHON.
buxizhizhoum
12

Anda dapat menentukan versi Python untuk driver dengan mengatur variabel lingkungan yang sesuai di ./conf/spark-env.shfile. Jika belum ada, Anda dapat menggunakan spark-env.sh.templatefile yang disediakan yang juga menyertakan banyak variabel lain.

Berikut adalah contoh sederhana dari sebuah spark-env.shfile untuk mengatur variabel lingkungan Python yang relevan:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
export PYSPARK_PYTHON=/usr/bin/python3       
export PYSPARK_DRIVER_PYTHON=/usr/bin/ipython

Dalam hal ini, ini menetapkan versi Python yang digunakan oleh pekerja / pelaksana ke Python3 dan versi driver Python ke iPython untuk shell yang lebih baik untuk bekerja.

Jika Anda belum memiliki spark-env.shfile, dan tidak perlu menyetel variabel lain, yang ini harus melakukan apa yang Anda inginkan, dengan asumsi bahwa jalur ke biner python yang relevan sudah benar (verifikasi dengan which). Saya memiliki masalah serupa dan ini memperbaikinya.

James Clarke
sumber
Bagaimana cara menjalankan file ini?
Volatil3
Saya harus mengganti nama spark-env.sh.template menjadi spark-env.sh dan kemudian menambahkan ke ekor file ekspor PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Saya harus mencari tahu di mana python3 saya melalui python3 yang mana
danivicario
10

Jika Anda menjalankan Spark di organisasi yang lebih besar dan tidak dapat memperbarui file /spark-env.sh, mengekspor variabel lingkungan mungkin tidak berfungsi.

Anda dapat menambahkan pengaturan Spark tertentu melalui --confopsi saat mengirimkan pekerjaan pada saat dijalankan.

pyspark --master yarn --[other settings]\ 
  --conf "spark.pyspark.python=/your/python/loc/bin/python"\ 
  --conf "spark.pyspark.driver.python=/your/python/loc/bin/python"
Phillip Stich
sumber
9

Saya baru saja menghadapi masalah yang sama dan ini adalah langkah-langkah yang saya ikuti untuk menyediakan versi Python. Saya ingin menjalankan pekerjaan PySpark saya dengan Python 2.7, bukan 2.6.

  1. Pergi ke folder $SPARK_HOMEyang dituju (dalam kasus saya /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. Di bawah folder conf, ada file bernama spark-env.sh. Jika Anda memiliki file bernama, spark-env.sh.templateAnda perlu menyalin file ke file baru bernama spark-env.sh.

  3. Edit file dan tulis tiga baris berikutnya

    ekspor PYSPARK_PYTHON = / usr / local / bin / python2.7

    ekspor PYSPARK_DRIVER_PYTHON = / usr / local / bin / python2.7

    ekspor SPARK_YARN_USER_ENV = "PYSPARK_PYTHON = / usr / local / bin / python2.7"

  4. Simpan dan luncurkan aplikasi Anda lagi :)

Dengan demikian, jika Anda mengunduh versi mandiri Spark baru, Anda dapat mengatur versi Python yang Anda inginkan untuk menjalankan PySpark.

selknam
sumber
2
Catatan rekomendasinya adalah untuk cpfile spark-env.sh.templatesebagai yang baru spark-env.shdan kemudian mengubah file baru daripada mengubah nama dan konten template. Template seharusnya tetap sebagai referensi.
et_l
@et_l Anda benar, saya baru saja membuat sedikit modifikasi pada jawaban dengan mempertimbangkan komentar Anda, terima kasih!
selknam
5

Saya menemukan pesan kesalahan yang sama dan saya telah mencoba tiga cara yang disebutkan di atas. Saya membuat daftar hasil sebagai referensi pelengkap untuk orang lain.

  1. Ubah PYTHON_SPARKdan PYTHON_DRIVER_SPARKnilai spark-env.shtidak bekerja untuk saya.
  2. Ubah nilai di dalam skrip python menggunakan os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"tidak berfungsi untuk saya.
  3. Ubah nilai dalam ~/.bashrckarya seperti pesona ~
jujur
sumber
komentar Anda adalah emas murni setelah menghabiskan satu Hour.Thanks
cheapcoder
Terima kasih banyak. Saya menguji banyak solusi. Hormat Anda bekerja dengan sangat baik.
Muser
3

Saya menjalankannya di IPython (seperti yang dijelaskan dalam tautan ini oleh Jacek Wasilewski ) dan mendapatkan pengecualian ini; Ditambahkan PYSPARK_PYTHONke file kernel IPython dan menggunakan notebook jupyter untuk dijalankan, dan mulai bekerja.

vi  ~/.ipython/kernels/pyspark/kernel.json

{
 "display_name": "pySpark (Spark 1.4.0)",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "IPython.kernel",
  "--profile=pyspark",
  "-f",
  "{connection_file}"
 ],

 "env": {
  "SPARK_HOME": "/usr/local/spark-1.6.1-bin-hadoop2.6/",
  "PYTHONPATH": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/:/usr/local/spark-1
.6.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip",
  "PYTHONSTARTUP": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/pyspark/shell.py
",
  "PYSPARK_SUBMIT_ARGS": "--master spark://127.0.0.1:7077 pyspark-shell",
  "PYSPARK_DRIVER_PYTHON":"ipython2",
   "PYSPARK_PYTHON": "python2"
 }
Alex Punnen
sumber
2

Saya mendapat masalah yang sama tentang percikan mandiri di windows . Versi perbaikan saya seperti ini: Saya memiliki pengaturan variabel lingkungan seperti di bawah ini

PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark

Dengan pengaturan ini saya menjalankan Action di pyspark dan mendapatkan pengecualian berikut:

Python in worker has different version 3.6 than that in driver 3.5, PySpark cannot run with different minor versions.
Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

Untuk memeriksa dengan versi python mana yang digunakan spark-worker saya, tekan perintah berikut di prompt cmd .

python --version
Python 3.6.3

yang menunjukkan Python 3.6.3 . Jadi jelas spark-worker saya menggunakan sistem python yang v3.6.3.

Sekarang ketika saya mengatur spark-driver saya untuk menjalankan jupyter dengan mengatur PYSPARK_DRIVER_PYTHON=jupyterjadi saya perlu memeriksa versi python yang digunakan jupyter.

Untuk melakukan ini, buka Anaconda Prompt dan tekan

python --version
Python 3.5.X :: Anaconda, Inc.

Berikut mendapat jupyter python menggunakan v3.5.x . Anda juga dapat memeriksa versi ini di Notebook manapun (Help-> About).

Sekarang saya perlu mengupdate jupyter python ke versi v3.6.6 . Untuk melakukan itu, buka Anaconda Prompt dan tekan

conda cari python

Ini akan memberi Anda daftar versi python yang tersedia di Anaconda. Instal yang Anda inginkan dengan

conda install python = 3.6.3

Sekarang saya memiliki kedua instalasi Python dari versi 3.6.3 Spark yang sama tidak sesuai dan tidak saat saya menjalankan Action pada Spark-driver. Pengecualian hilang. Selamat membuat kode ...

Rizvi Hasan
sumber
1

Jika Anda hanya ingin mengubah versi python untuk tugas saat ini, Anda dapat menggunakan perintah pyspark start berikut:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
Peter Pan
sumber
1

Silakan lihat cuplikan di bawah ini:

#setting environment variable for pyspark in linux||ubuntu
#goto --- /usr/local/spark/conf
#create a new file named spark-env.sh copy all content of spark-env.sh.template to it
#then add below lines to it, with path to python

PYSPARK_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser"
#i was running python 3.6 ||run - 'which python' in terminal to find the path of python
Justin Varughese
sumber
Silakan periksa template sebelum memposting.
Deepesh Rehi
0

Saya menggunakan lingkungan berikut

? python --version; ipython --version; jupyter --version
Python 3.5.2+
5.3.0
5.0.0

dan alias berikut bekerja dengan baik untuk saya

alias pyspark="PYSPARK_PYTHON=/usr/local/bin/python3 PYSPARK_DRIVER_PYTHON=ipython ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"    
alias pysparknotebook="PYSPARK_PYTHON=/usr/bin/python3 PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS='notebook' ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"

Di notebook, saya mengatur lingkungan sebagai berikut

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
George Fisher
sumber
0

Kesalahan

"Pengecualian: Python pada pekerja memiliki versi 2.6 yang berbeda dari pada driver 2.7, PySpark tidak dapat berjalan dengan versi minor yang berbeda". 

Perbaiki (untuk lingkungan Cloudera)

  • Edit file ini: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Tambahkan baris ini:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    
William Lee
sumber
0

Mengalami hal ini hari ini di tempat kerja. Admin menganggap sebaiknya kode keras Python 2.7 sebagai PYSPARK_PYTHONdan PYSPARK_DRIVER_PYTHONdalam $SPARK_HOME/conf/spark-env.sh. Tidak perlu dikatakan, ini merusak semua pekerjaan kami yang menggunakan versi atau lingkungan python lain (yang> 90% dari pekerjaan kami). @PhillipStich menunjukkan dengan benar bahwa Anda mungkin tidak selalu memiliki izin menulis untuk file ini, seperti kasus kami. Sementara pengaturan konfigurasi dalam spark-submitpanggilan adalah sebuah opsi, alternatif lain (ketika berjalan dalam mode benang / cluster) adalah mengatur SPARK_CONF_DIRvariabel lingkungan untuk menunjuk ke skrip konfigurasi lain. Di sana Anda dapat menyetel PYSPARK_PYTHON Anda dan opsi lain yang mungkin Anda perlukan. Template dapat ditemukan di kode sumber spark-env.sh di github .

Grr
sumber
0

Dalam kasus saya (Ubuntu 18.04), saya menjalankan kode ini di terminal:

sudo vim ~/.bashrc

dan kemudian diedit SPARK_HOMEsebagai berikut:

export SPARK_HOME=/home/muser/programs/anaconda2019/lib/python3.7/site-packages/pyspark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

Dengan melakukan itu, saya SPARK_HOMEakan merujuk ke pysparkpaket yang saya instal di site-package.

Untuk mempelajari cara menggunakan vim, buka tautan ini .

Muser
sumber
0

Lari:

ls -l /usr/local/bin/python*

Baris pertama dalam contoh ini menunjukkan symlink python3. Untuk mengaturnya sebagai symlink python default, jalankan perintah berikut:

ln -s -f /usr/local/bin/python3 /usr/local/bin/python

lalu muat ulang shell Anda.

Hillary Murefu
sumber
0

Saya memiliki masalah yang sama, hanya lupa mengaktifkan lingkungan virtual saya. Untuk siapa pun di luar sana yang juga memiliki mental kosong.

chadmc
sumber
0

Jika Anda bekerja di mac, gunakan perintah berikut

export SPARK_HOME=`brew info apache-spark | grep /usr | tail -n 1 | cut -f 1 -d " "`/libexec
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH

export HADOOP_HOME=`brew info hadoop | grep /usr | head -n 1 | cut -f 1 -d " "`/libexec
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/:$LD_LIBRARY_PATH
export PYSPARK_PYTHON=python3

Jika Anda menggunakan OS lain, periksa tautan berikut: https://github.com/GalvanizeDataScience/spark-install

Juan José
sumber