นำเข้า pyspark ใน python shell


111

นี่เป็นสำเนาคำถามของคนอื่นในฟอรัมอื่นที่ไม่เคยมีคำตอบฉันจึงคิดว่าจะถามที่นี่ซ้ำเพราะฉันมีปัญหาเดียวกัน (ดูhttp://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

ฉันติดตั้ง Spark อย่างถูกต้องบนเครื่องของฉันและสามารถเรียกใช้โปรแกรม python ด้วยโมดูล pyspark ได้โดยไม่มีข้อผิดพลาดเมื่อใช้. /bin/pyspark เป็นล่ามหลามของฉัน

อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้ Python shell ปกติเมื่อฉันพยายามนำเข้าโมดูล pyspark ฉันได้รับข้อผิดพลาดนี้:

from pyspark import SparkContext

และมันบอกว่า

"No module named pyspark".

ฉันจะแก้ไขปัญหานี้ได้อย่างไร? มีตัวแปรสภาพแวดล้อมที่ฉันต้องตั้งให้ชี้ Python ไปที่ส่วนหัว / ไลบรารี pyspark / ฯลฯ หรือไม่ หากการติดตั้ง spark ของฉันคือ / spark / ฉันต้องรวมเส้นทาง pyspark ไว้ด้วย? หรือโปรแกรม pyspark สามารถเรียกใช้จากล่าม pyspark เท่านั้น?


พวกเขากล่าวว่าการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมนั้น "ไม่ได้ผลอย่างยิ่งเพราะ bin / spark-submit ถูกแทนที่อย่างรวดเร็ว" บางทีคุณอาจได้เรียนรู้บางอย่างจากการแลกเปลี่ยนนี้
emmagras

คำตอบ:


97

นี่คือวิธีการง่ายๆ(ถ้าคุณไม่กังวลเกี่ยวกับวิธีการทำงาน !!!)

ใช้findspark

  1. ไปที่ python shell ของคุณ

    pip install findspark
    
    import findspark
    findspark.init()
  2. นำเข้าโมดูลที่จำเป็น

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. เรียบร้อย !!!


วิธีแก้ปัญหาอื่น ๆ ไม่ได้ผลสำหรับฉัน ตอนนี้ฉันใช้ findspark ในโปรแกรมของฉัน ดูเหมือนจะเป็นวิธีแก้ปัญหาที่ดีสำหรับปัญหา
พระวิเคราะห์

ฉันไม่อยากทำแบบนี้ .. แต่เดี๋ยวก่อน .. ไม่มีอะไรจะได้ผล .. ฉันจะเอามัน
javadba

51

หากพิมพ์ข้อผิดพลาดดังกล่าว:

ImportError: ไม่มีโมดูลชื่อ py4j.java_gateway

โปรดเพิ่ม $ SPARK_HOME / python / build ใน PYTHONPATH:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

9
ตามที่อธิบายไว้ในคำตอบอื่น stackoverflow.com/questions/26533169/… ฉันต้องเพิ่ม PYTHONPATH การส่งออกต่อไปนี้ = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson

46

ปรากฎว่าถังขยะ pyspark เป็น LOADING python และโหลดเส้นทางไลบรารีที่ถูกต้องโดยอัตโนมัติ ตรวจสอบ $ SPARK_HOME / bin / pyspark:

# Add the PySpark classes to the Python path:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH

ฉันเพิ่มบรรทัดนี้ในไฟล์. bashrc ของฉันและตอนนี้พบโมดูลที่ถูกต้องแล้ว!


1
นอกจากขั้นตอนนี้ฉันยังต้องเพิ่ม: export SPARK_HOME=~/dev/spark-1.1.0ไปคิด ชื่อพับของคุณอาจแตกต่างกันไป
emmagras

21

อย่าเรียกใช้ไฟล์ py ของคุณเป็น: python filename.py แทนใช้:spark-submit filename.py


ใครช่วยขยายความว่าทำไมไม่ทำสิ่งนี้ ฉันได้ตรวจสอบคำถามนี้แล้ว แต่จนถึงขณะนี้ยังไม่พบสิ่งที่อธิบายว่าทำไมจึงเป็นเช่นนั้น
Mint

@ มิ้นท์คำตอบอื่น ๆ แสดงว่าทำไม; แพ็คเกจ pyspark ไม่รวมอยู่ใน $ PYTHONPATH ตามค่าเริ่มต้นดังนั้นimport pysparkจะล้มเหลวที่บรรทัดคำสั่งหรือในสคริปต์ที่เรียกใช้งาน คุณต้องทำอย่างใดอย่างหนึ่ง เรียกใช้ pyspark ผ่านการส่งประกายไฟตามที่ตั้งใจไว้หรือ b. เพิ่ม $ SPARK_HOME / python ใน $ PYTHONPATH
kingledion

อีกจุดหนึ่งคือ spark-submit คือเชลล์สคริปต์ซึ่งช่วยให้คุณกำหนดค่าสภาพแวดล้อมของระบบได้อย่างถูกต้องก่อนใช้ spark ถ้าคุณทำ python main.py คุณต้องกำหนดค่าสภาพแวดล้อมระบบให้ถูกต้องเช่น PYTHONPATH, SPARK_HOME
E.ZY

21

ด้วยการส่งออกเส้นทาง SPARK และเส้นทาง Py4j มันเริ่มทำงาน:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.5.1
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH 
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

ดังนั้นหากคุณไม่ต้องการพิมพ์สิ่งเหล่านี้ทุกครั้งที่คุณต้องการเปิด Python shell คุณอาจต้องการเพิ่มลงใน.bashrcไฟล์ของคุณ


1
ฉันไม่พบไดเรกทอรีlibexecในApache Sparkการติดตั้งของฉันมีความคิดอย่างไร
Alberto Bonsanto

@AlbertoBonsanto ขออภัย ฉันไม่ประสบปัญหานี้ ไม่มีความคิด :(
Dawny33

1
ใช่พวกเขาเอาโฟลเดอร์ libexec ออกมาใน spark 1.5.2
bluerubez

1
@bluerubez ดูเหมือนจะมีใน spark 1.6.2 ... นอกจากนี้ไม่แน่ใจว่าlibexec/python/buildไดเร็กทอรีมีไว้เพื่ออะไร แต่ spark 1.6.2 ไม่มี
OneCricketeer

17

บน Mac ฉันใช้ Homebrew เพื่อติดตั้ง Spark (สูตร "apache-spark") จากนั้นฉันตั้งค่า PYTHONPATH ด้วยวิธีนี้เพื่อให้การนำเข้า Python ทำงาน:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH

แทนที่ "1.2.0" ด้วยเวอร์ชัน apache-spark จริงบนเครื่อง Mac ของคุณ


14

สำหรับการดำเนินการ Spark ใน pyspark จำเป็นต้องมีส่วนประกอบสองอย่างในการทำงานร่วมกัน:

  • pyspark แพ็คเกจหลาม
  • Spark อินสแตนซ์ใน JVM

เมื่อเปิดใช้งานสิ่งต่างๆด้วย spark-submit หรือ pyspark สคริปต์เหล่านี้จะดูแลทั้งสองอย่างเช่นพวกเขาตั้งค่า PYTHONPATH เส้นทาง ฯลฯ ของคุณเพื่อให้สคริปต์ของคุณสามารถค้นหา pyspark และพวกเขายังเริ่มต้นอินสแตนซ์ spark โดยกำหนดค่าตามพารามิเตอร์ของคุณ เช่น - master X

หรืออาจเป็นไปได้ที่จะข้ามสคริปต์เหล่านี้และเรียกใช้แอปพลิเคชัน spark ของคุณโดยตรงในตัวแปล python เช่นpython myscript.py. สิ่งนี้น่าสนใจอย่างยิ่งเมื่อสคริปต์จุดประกายเริ่มซับซ้อนขึ้นและในที่สุดก็ได้รับ args ของตัวเอง

  1. ตรวจสอบให้แน่ใจว่า Python interpreter สามารถหาแพ็คเกจ pyspark ได้ ตามที่ได้กล่าวไปแล้วไม่ว่าจะเพิ่ม spark / python dir ไปยัง PYTHONPATH หรือติดตั้ง pyspark โดยตรงโดยใช้ pip install
  2. ตั้งค่าพารามิเตอร์ของอินสแตนซ์ spark จากสคริปต์ของคุณ (พารามิเตอร์ที่เคยถูกส่งไปยัง pyspark)
    • สำหรับการกำหนดค่าจุดประกายตามที่คุณตั้งไว้ตามปกติด้วย --conf จะถูกกำหนดด้วยออบเจ็กต์ config (หรือการกำหนดค่าสตริง) ใน SparkSession.builder.config
    • สำหรับตัวเลือกหลัก (เช่น --master หรือ --driver-mem) ในตอนนี้คุณสามารถตั้งค่าได้โดยเขียนไปยังตัวแปรสภาพแวดล้อม PYSPARK_SUBMIT_ARGS เพื่อให้สิ่งต่างๆสะอาดและปลอดภัยยิ่งขึ้นคุณสามารถตั้งค่าจากภายใน Python เองและประกายไฟจะอ่านเมื่อเริ่มต้น
  3. เริ่มต้นอินสแตนซ์ซึ่งคุณต้องเรียกใช้getOrCreate()จากออบเจ็กต์ตัวสร้าง

สคริปต์ของคุณอาจมีลักษณะดังนี้:

from pyspark.sql import SparkSession

if __name__ == "__main__":
    if spark_main_opts:
        # Set main options, e.g. "--master local[4]"
        os.environ['PYSPARK_SUBMIT_ARGS'] = spark_main_opts + " pyspark-shell"

    # Set spark config
    spark = (SparkSession.builder
             .config("spark.checkpoint.compress", True)
             .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11")
             .getOrCreate())

9

ในการกำจัดImportError: No module named py4j.java_gatewayคุณต้องเพิ่มบรรทัดต่อไปนี้:

import os
import sys


os.environ['SPARK_HOME'] = "D:\python\spark-1.4.1-bin-hadoop2.4"


sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python")
sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip")

try:
    from pyspark import SparkContext
    from pyspark import SparkConf

    print ("success")

except ImportError as e:
    print ("error importing spark modules", e)
    sys.exit(1)

7

ใน Windows 10 สิ่งต่อไปนี้ใช้ได้กับฉัน ฉันเพิ่มตัวแปรสภาพแวดล้อมต่อไปนี้โดยใช้การตั้งค่า > แก้ไขตัวแปรสภาพแวดล้อมสำหรับบัญชีของคุณ :

SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%

(เปลี่ยน "C: \ Programming \ ... " เป็นโฟลเดอร์ที่คุณติดตั้ง spark ไว้)


5

สำหรับผู้ใช้ Linux วิธีต่อไปนี้เป็นวิธีที่ถูกต้อง (และไม่ฮาร์ดโค้ด) ในการรวม pyspark libaray ใน PYTHONPATH ทั้งสองส่วน PATH มีความจำเป็น:

  1. เส้นทางไปยังโมดูล pyspark Python เองและ
  2. พา ธ ไปยังไลบรารีซิปที่โมดูล pyspark อาศัยเมื่ออิมพอร์ต

โปรดสังเกตด้านล่างว่าเวอร์ชันของไลบรารีแบบซิปจะถูกกำหนดแบบไดนามิกดังนั้นเราจึงไม่ฮาร์ดโค้ด

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}

4

ฉันใช้งานคลัสเตอร์ spark บน CentOS VM ซึ่งติดตั้งจากแพ็คเกจ cloudera yum

ต้องตั้งค่าตัวแปรต่อไปนี้เพื่อรัน pyspark

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH

4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

นี่คือสิ่งที่ฉันทำเพื่อใช้การแจกจ่าย Anaconda กับ Spark นี่คือ Spark เวอร์ชันอิสระ คุณสามารถเปลี่ยนบรรทัดแรกเป็น python bin ของผู้ใช้ของคุณ นอกจากนี้ในขณะที่ Spark 2.2.0 PySpark ยังมีให้เป็นแพ็คเกจแบบสแตนด์อโลนบน PyPi แต่ฉันยังไม่ได้ทดสอบ



3

ผมมีปัญหาเหมือนกัน.

ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชัน python ที่ถูกต้องและคุณกำลังติดตั้งด้วย pip เวอร์ชันที่ถูกต้อง ในกรณีของฉัน: ฉันมีทั้ง python 2.7 และ 3.x ฉันได้ติดตั้ง pyspark ด้วย

pip2.7 ติดตั้ง pyspark

และมันได้ผล


2

ฉันได้รับข้อผิดพลาดนี้เนื่องจากสคริปต์ python ที่ฉันพยายามส่งเรียกว่า pyspark.py ( facepalm ) การแก้ไขคือการตั้งค่า PYTHONPATH ของฉันตามที่แนะนำไว้ข้างต้นจากนั้นเปลี่ยนชื่อสคริปต์เป็น pyspark_test.py และล้าง pyspark.pyc ที่สร้างขึ้นตามชื่อดั้งเดิมของสคริปต์ของฉันและนั่นจะเป็นการล้างข้อผิดพลาดนี้


2

ในกรณีของ DSE (DataStax Cassandra & Spark) ต้องเพิ่มตำแหน่งต่อไปนี้ใน PYTHONPATH

export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH

จากนั้นใช้ dse pyspark เพื่อรับโมดูลในพา ธ

dse pyspark

2

ฉันมีปัญหาเดียวกันนี้และจะเพิ่มสิ่งหนึ่งในแนวทางแก้ไขที่เสนอข้างต้น เมื่อใช้ Homebrew บน Mac OS X เพื่อติดตั้ง Spark คุณจะต้องแก้ไขที่อยู่พา ธ py4j เพื่อรวม libexec ในเส้นทาง (อย่าลืมเปลี่ยนเวอร์ชัน py4j เป็นเวอร์ชันที่คุณมี)

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH

หมายเหตุ - ฉันลองคลายซิปแล้วใช้py4jโฟลเดอร์อย่างเดียวไม่ได้ผล ใช้ไฟล์ zip ...
El Dude


1

คุณยังสามารถสร้าง Docker container โดยมี Alpine เป็น OS และติดตั้ง Python และ Pyspark เป็นแพ็คเกจ ที่จะมีทั้งหมดบรรจุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.