Giải Lỗi PySparkRuntimeError: JAVA_GATEWAY_EXITED Trong PySpark

PySparkRuntimeError: [JAVA_GATEWAY_EXITED] Java gateway process exited before sending its port number - Lỗi này thường xuất phát từ các vấn đề về cấu trúc môi trường và sự tương thích phiên bản giữa Java, Python, Spark và PySpark.

Tương thích Phiên bản

Trước khi bắt đầu cấu hình môi trường, bạn nên kiểm tra sự tương thích giữa các thành phần. Nếu các phiên bản không phù hợp, hãy thử theo quy trình dưới đây. Nếu vấn đề vẫn tồn tại, hãy cân nhắc nâng cấp hoặc hạ cấp các thành phần.

Ví dụ: Môi trường ban đầu của tôi sử dụng (Python 3.9, Java 17, Spark 2.4 và PySpark 3.5). Sau khi chuyển sang (Python 3.9, Java 8/jdk-1.8, Spark 3.4.3 và PySpark 3.4.3), môi trường đã được cấu hình thành công. Mỗi trường hợp có thể khác nhau, hãy điều chỉnh phiên bản phù hợp với hệ thống của bạn.

Vấn đề Môi trường Java

Khuyến nghị sử dụng Java 8 (jdk-1.8). Trước tiên, hãy kiểm tra đã cài đặt Java chưa bằng lệnh:

java -version

Nếu chưa cấu hình:

  1. Nhấn chuột phải vào "This PC" → Properties → Advanced system settings → Advanced → Environment Variables
  2. Trong System variables, tạo mới JAVA_HOME với giá trị là thư mục cài đặt Java
  3. Nếu không tìm thấy thư mục cài đặt Java, bạn có thể sử dụng lệnh:
where java

Chỉ cần đến thư mục gốc của JDK (ví dụ: C:\Program Files\Java\jdk-1.8)

Sau khi thêm JAVA_HOME, trong Path thêm:

%JAVA_HOME%\bin

Đến đây, môi trường Java đã được cấu hình xong.

Cấu hình Môi trường Spark

Tải xuống và giải nén gói Spark, khuyến nghị sử dụng phiên bản 3.x. (Việc cài đặt PySpark qua pip thường không giải quyết được vấn đề, tốt hơn nên tải gói Spark trực tiếp).

Tải phiên bản 3.4 (hoặc bất kỳ phiên bản 3.x nào), giải nén và đặt vào thư mục phù hợp.

Tương tự, cấu biến môi trường SPARK_HOME và trong Path thêm:

%SPARK_HOME%\bin

Cấu hình Môi trường PySpark

PYSPARK_PYTHON nên trỏ đến đường dẫn của trình thông dịch Python. Biến môi trường này dùng để chỉ định trình thông dịch Python mà PySpark nên sử dụng, đặc biệt quan trọng khi có nhiều phiên bản Python hoặc môi trường ảo.

Sử dụng lệnh để tìm đường dẫn Python:

where python

Đồng thời, sao chép thư mục pyspark từ spark/python vào python/lib/site-packages

Lưu ý vấn đề phiên bản: phiên bản Spark và PySpark nên tương thích. Nếu Spark của bạn là 3.4.3, hãy đảm bảo PySpark cũng là 3.4.3:

pip install pyspark==3.4.3

Kiểm tra lại phiên bản PySpark sau khi cài đặt.

Tiếp theo, cấu hình PYSPARK_PYTHON trỏ đến đường dẫn Python cài đặt toàn hệ thống.

Tương tự, nếu chưa cấu biến môi trường Python, bạn cũng có thể cấu hình trong Path.

Kiểm tra

Sau khi cấu hình xong, trong cmd nhập các lệnh sau để kiểm tra:

echo %SPARK_HOME%
echo %PYSPARK_PYTHON%
echo %JAVA_HOME%

Trực tiếp chạy:

spark-shell

Nếu xuất hiện thông báo khởi động thành công, nghĩa là cấu hình thành công.

Trong Python, thực hiện kiểm tra đơn giản:

from pyspark.sql import SparkSession

session = SparkSession.builder \
    .appName("Kiểm tra PySpark") \
    .getOrCreate()

data = [("Nguyễn Văn A", 1), ("Trần Thị B", 2)]
data_frame = session.createDataFrame(data, ["Tên", "ID"])
data_frame.show()

Nếu xuất kết quả như mong đợi, PySpark đã được cấu hình thành công.

Tóm tắt

Tóm lại, để giải quyết lỗi JAVA_GATEWAY_EXITED:

  1. Đảm bảo đã cài đặt Java 8
  2. Cài đặt phiên bản Spark và PySpark tương thích
  3. Cấu hình đúng các biến môi trường: JAVA_HOME, SPARK_HOME, PYSPARK_PYTHON

Chỉ cần đảm bảo môi trường được cấu hình chính xác và các phiên bản tương thích, vấn đề sẽ được giải quyết.

Thẻ: PySpark Java Spark Big Data Data Processing

Đăng vào ngày 4 tháng 6 lúc 00:25