Lỗi Spark - Phiên bản chính của tệp lớp không được hỗ trợ


82

Tôi đang cố gắng cài đặt Spark trên máy Mac của mình. Tôi đã sử dụng home-brew để cài đặt spark 2.4.0 và Scala. Tôi đã cài đặt PySpark trong môi trường anaconda của mình và đang sử dụng PyCharm để phát triển. Tôi đã xuất sang hồ sơ bash của mình:

export SPARK_VERSION=`ls /usr/local/Cellar/apache-spark/ | sort | tail -1`
export SPARK_HOME="/usr/local/Cellar/apache-spark/$SPARK_VERSION/libexec"
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH

Tuy nhiên tôi không thể làm cho nó hoạt động.

Tôi nghi ngờ điều này là do phiên bản java từ việc đọc theo dõi. Tôi thực sự đánh giá cao một số trợ giúp khắc phục sự cố. Vui lòng bình luận nếu có bất kỳ thông tin nào tôi có thể cung cấp hữu ích ngoài việc truy xuất nguồn gốc.

Tôi nhận được lỗi sau:

Traceback (most recent call last):
  File "<input>", line 4, in <module>
  File "/anaconda3/envs/coda/lib/python3.6/site-packages/pyspark/rdd.py", line 816, in collect
    sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
  File "/anaconda3/envs/coda/lib/python3.6/site-packages/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/anaconda3/envs/coda/lib/python3.6/site-packages/py4j/protocol.py", line 328, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.lang.IllegalArgumentException: Unsupported class file major version 55

2
bản sửa lỗi này đã hoạt động đối với tôi ngay cả với "Tệp lớp không được hỗ trợ phiên bản chính 57"
SchwarzeHuhn

Khắc phục: Để khắc phục sự cố này, tôi đã chỉnh sửa tệp bash_profile để đảm bảo java 1.8 được sử dụng làm mặc định chung như sau: touch ~/.bash_profile; open ~/.bash_profile Thêm export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)và lưu trong chỉnh sửa văn bản.
James

Bản sửa lỗi đó hoạt động đối với bất kỳ Java nào trên Mac. Libexec không có gì để làm với giấy phép hoặc oracle
OneCricketeer

Địa ngục phụ thuộc cho Spark. Tôi ghét nó.
0x4a6f4672

Câu trả lời:


90

Chỉnh sửa Spark 3.0 hỗ trợ Java 11, vì vậy bạn sẽ cần nâng cấp

Spark chạy trên Java 8/11, Scala 2.12, Python 2.7 + / 3.4 + và R 3.1+. Hỗ trợ Java 8 trước phiên bản 8u92 không được dùng nữa kể từ Spark 3.0.0



Câu trả lời ban đầu

Cho đến khi Spark hỗ trợ Java 11 hoặc cao hơn (hy vọng sẽ được đề cập trong tài liệu mới nhất khi có), bạn phải thêm cờ để đặt phiên bản Java của mình thành Java 8.

Kể từ Spark 2.4.x

Spark chạy trên Java 8 , Python 2.7 + / 3.4 + và R 3.1+. Đối với API Scala, Spark 2.4.4 sử dụng Scala 2.12. Bạn sẽ cần sử dụng phiên bản Scala tương thích (2.12.x)

Trên Mac / Unix, hãy xem asdf-java để cài đặt các Jav khác nhau

Trên máy Mac, tôi có thể làm điều này trong tôi .bashrc,

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

Trên Windows, hãy kiểm tra Chocolately, nhưng nghiêm túc chỉ sử dụng WSL2 hoặc Docker để chạy Spark.


Bạn cũng có thể đặt điều này spark-env.shthay vì đặt biến cho toàn bộ hồ sơ của mình.

Và, tất nhiên, điều này có nghĩa là bạn sẽ cần cài đặt Java 8 ngoài Java 11 hiện có của bạn


4
Cảm ơn @ cricket_007 khi tôi thử cài đặt thùng chứa java8 Tôi gặp lỗi sau Không có thùng chứa 'java8': Không có thùng chứa có tên này.
James

2
Tôi đã thử những điều sau đây mà dường như làm việc: tap brew caskroom / phiên bản pha thùng cài đặt java8
James

1
Điều này dường như đã khắc phục sự cố, nhưng không phải trong PyCharm. Tôi có cần trỏ đến java trong đó không? Cảm ơn!
James

1
Cập nhật hướng dẫn cài đặt Java 8 JDK trên macOS: "brew tap AdoptOpenJDK / openjdk; brew cask install accepttopenjdk8"
Joris

3
@James cảm ơn bạn đã trả lời lại, tôi đã giải quyết bằng cách cập nhật một số thông tin xác thực git. Dù sao thì java8 không còn khả dụng vì Oracle đã đặt giấy phép trên đăng ký trước. Vì vậy, cách tiếp cận đó không hoạt động nữa. Để cài đặt java8 bạn cần phải xem câu trả lời này. stackoverflow.com/questions/24342886/…
Gonzalo Garcia,

89

Tôi gặp sự cố này khi chạy Jupyter Notebook và Spark bằng Java 11. Tôi đã cài đặt và định cấu hình cho Java 8 bằng các bước sau.

Cài đặt Java 8:

$ sudo apt install openjdk-8-jdk

Vì tôi đã cài đặt Java 11, sau đó tôi đặt Java mặc định của mình thành phiên bản 8 bằng cách sử dụng:

$ sudo update-alternatives --config java

Chọn Java 8 và sau đó xác nhận các thay đổi của bạn:

$ java -version

Đầu ra phải tương tự như:

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

Bây giờ tôi có thể chạy Spark thành công trong Máy tính xách tay Jupyter. Các bước trên dựa trên hướng dẫn sau: https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04


1
nếu bạn đang sử dụng sdkman, sdk install java 8.0.212-zulucài đặt java 8 và hỏi bạn có muốn sử dụng java cài đặt 8 là java mặc định
Xiao

Cảm ơn bạn! trường hợp của tôi giống hệt như trường hợp của bạn.
Kenny Aires

19

Tôi thấy rằng việc thêm các vị trí tia lửa qua findsparkjava8 với os vào đầu của kịch bản là giải pháp đơn giản nhất:

import findspark
import os
spark_location='/opt/spark-2.4.3/' # Set your own
java8_location= '/usr/lib/jvm/java-8-openjdk-amd64' # Set your own
os.environ['JAVA_HOME'] = java8_location
findspark.init(spark_home=spark_location) 

7

Vấn đề nghe là PySpark yêu cầu Java 8 cho một số chức năng. Spark 2.2.1 gặp sự cố với Java 9 và hơn thế nữa. Giải pháp được đề xuất là cài đặt Java 8.

bạn có thể cài đặt riêng java-8 và đặt nó làm java mặc định của bạn và thử lại.

để cài đặt java 8,

sudo apt install openjdk-8-jdk

để thay đổi phiên bản java mặc định, hãy làm theo điều này . bạn có thể sử dụng lệnh

 update-java-alternatives --list

để liệt kê tất cả các phiên bản java có sẵn.

đặt một mặc định bằng cách chạy lệnh:

sudo update-alternatives --config java

để chọn phiên bản java bạn muốn. cung cấp số chính xác trong danh sách được cung cấp. sau đó cheak phiên bản java của bạn java -versionvà nó sẽ được cập nhật. Đặt cả biến JAVA_HOME.

để đặt JAVA_HOME, Bạn phải tìm thư mục và phiên bản Java cụ thể. Cho phép thảo luận SO này để có được ý tưởng đầy đủ về việc thiết lập biến home java. vì chúng tôi sẽ sử dụng java 8, đường dẫn thư mục của chúng tôi là /usr/lib/jvm/java-8-openjdk-amd64/. chỉ cần vào /usr/lib/jvmthư mục và kiểm tra xem đâu là thư mục có sẵn. sử dụng ls -lđể xem các thư mục và các liên kết mềm của chúng, vì các thư mục này có thể là lối tắt cho một số phiên bản java. sau đó vào thư mục chính của bạn cd ~và chỉnh sửa tệp bashrc

cd ~
gedit .bashrc

sau đó Thêm dòng dưới đây vào tệp, lưu và thoát.

## SETTING JAVA HOME
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

sau đó, để thực hiện những gì bạn đã làm, hãy nhập source ~/.bashrc và chạy trong thiết bị đầu cuối


4

Trên windows (Windows 10), bạn có thể giải quyết sự cố bằng cách cài đặt jdk-8u201-windows-x64.exe và đặt lại biến môi trường hệ thống về phiên bản chính xác của JAVA JDK:

JAVA_HOME -> C: \ Program Files \ Java \ jdk1.8.0_201.

Đừng quên khởi động lại thiết bị đầu cuối nếu không quá trình đặt lại biến môi trường không thực hiện được.


xin đừng quên khởi động lại thiết bị đầu cuối!
rishi jain

2

Đối với người dùng Debian 10 'buster', Java 8 JRE có sẵn trong nvidia-openjdk-8-jregói.

Cài đặt nó với

sudo apt install nvidia-openjdk-8-jre

Sau đó đặt JAVA_HOMEkhi chạy pyspark, ví dụ:

JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark

Tôi sẽ đề nghị sử dụng AdoptOpenJDK qua Nvidia để nhận Java
OneCricketeer

1

Tôi chỉ muốn thêm hai xu của tôi vào đây vì nó sẽ tiết kiệm vài giờ thời gian cho những người đang sử dụng PyCharm (đặc biệt là cấu hình chạy). Sau khi thay đổi của bạn .bashrchoặc .bash_profiletrỏ đến Java 8 bằng cách sửa đổi các biến env của JAVA_HOME và PATH (giống như hầu hết mọi người ở đây đã đề xuất), bạn sẽ nhận thấy rằng khi bạn chạy Spark của mình bằng cách sử dụng cấu hình chạy của PyCharm, nó vẫn không hoạt động đúng. Java. Có vẻ như có một số vấn đề với PyCharm (Tôi đang sử dụng PyCharm Professional 2020.2 trong Mac Catalina). Ngoài ra, khi bạn chạy nó bằng terminal của PyCharm, nó hoạt động tốt. Điều đó xác nhận có điều gì đó không ổn với PyCharm. Để cấu hình chạy của PyCharm nhận JAVA mới, tôi phải thêm biến môi trường JAVA_HOME một cách cụ thể vào cấu hình chạy như hình dưới đây-

nhập mô tả hình ảnh ở đây

va no đa hoạt động!

Một tùy chọn khác cũng hoạt động là kiểm tra Include system environment variables optiontrong Environment Variablescửa sổ trong cấu hình chạy (xem ảnh chụp màn hình ở trên) và khởi động lại PyCharm


0

Tôi gặp vấn đề tương tự trong windows và tôi đã thêm JAVA_HOME vào đường dẫn biến môi trường:

JAVA_HOME: C: \ Program Files \ Java \ jdk-11.0.1


1
Xin chào, tôi cũng đã làm như vậy. Tôi vẫn nhận được cùng một lỗi. Có điều gì khác bạn đã thay đổi? C: \ Program Files \ Java \ jdk-11.0.2
Gautam

@Gautum Như câu trả lời khác hiển thị, bạn cần Java 8. Các lỗi một cách rõ ràng nói phiên bản 55 (đó là Java 11) không được hỗ trợ
OneCricketeer

0

Xin chào thực sự để đảm bảo rằng bạn đang đặt đúng SPARK_HOME PATH, bạn có thể sử dụng tập lệnh python này để định vị nó: https://github.com/apache/spark/blob/master/python/pyspark/find_spark_home.py

python3 find_spark_home.py 

/usr/local/lib/python3.7/site-packages/pyspark

Trên máy Mac của tôi, trên thiết bị đầu cuối:

vim ~/.bashrc

và thêm đường dẫn:

export JAVA_HOME=/Library/java/JavaVirtualMachines/adoptopenjdk-8.jdk/contents/Home/

export SPARK_HOME=/usr/local/lib/python3.7/site-packages/pyspark

export PYSPARK_PYTHON=/usr/local/bin/python3

và cuối cùng là áp dụng thay đổi

source ~/.bashrc

0

Trên macOS: cài đặt Java8 trên máy tính xách tay của bạn bằng các lệnh sau:

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

-1

Sự cố này xảy ra do phiên bản Java bạn đã đặt trên biến môi trường JAVA_HOME.

Đường dẫn JAVA CŨ: /usr/lib/jvm/java-1.11.0-openjdk-amd64

Giải pháp: Đặt JAVA_HOME thành / usr / lib / jvm / java-8-openjdk-amd64

Nó sẽ hoạt động !!!

Lưu ý Lỗi của tôi là:

Tệp "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/rdd.py", dòng 816, trong collection sock_info = self.ctx._jvm.PythonRDD.collectAndServe (self._jrdd .rdd ()) Tệp "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", dòng 1257, trong lệnh gọi Tệp "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py", dòng 79, trong deco nâng IllegalArgumentException (s.split (':', 1) [1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unsupported class file major version 55 '


Điều này bổ sung điều gì cho câu trả lời hiện có nói rằng Java 8 là bắt buộc?
OneCricketeer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.