04. tháng 4 2025
Cần lưu ý rằng, theo mặc định, file jquery trên trang này đã bị chặn, bạn cần tự giải quyết vấn đề này. Tôi chọn phiên bản Spark 3.0.1 được xây dựng trước cho Apache Hadoop 2.7.
Trang web sẽ tự động gợi ý một địa chỉ tải về, có thể thấy lựa chọn mặc định là nguồn tải từ Đại học Ngoại ngữ Bắc Kinh:
wget
Tập tin rất lớn, lên tới 210MB.
> ls -lah
total 210M
-rw-rw-rw- 1 zhongwei zhongwei 210M Th8 28 17:25 spark-3.0.1-bin-hadoop2.7.tgz
tar zxvf spark-3.0.1-bin-hadoop2.7.tgz
> cd spark-3.0.1-bin-hadoop2.7
> tree -L 1
.
├── LICENSE
├── NOTICE
├── R
├── README.md
├── RELEASE
├── bin
├── conf
├── data
├── examples
├── jars
├── kubernetes
├── licenses
├── python
├── sbin
└── yarn
11 thư mục, 4 tệp tin
> ./bin/spark-shell
JAVA_HOME chưa được thiết lập
> ./bin/pyspark
JAVA_HOME chưa được thiết lập
Rõ ràng, ngay cả phiên bản Python của Spark Shell cũng phụ thuộc vào Java.
Việc chạy cục bộ trên một máy rất đơn giản – tất cả những gì bạn cần là có Java được cài đặt trong hệ thống PATH của mình hoặc biến môi trường JAVA_HOME chỉ đến một phiên bản Java đã cài đặt. Spark hoạt động với Java 8/11, Scala 2.12, Python 2.7+/3.4+ và R 3.5+. Phiên bản Java 8 dưới 8u92 không còn được hỗ trợ kể từ Spark 3.0.0. Python 2 và các phiên bản Python 3 dưới 3.6 cũng không còn được hỗ trợ kể từ Spark 3.0.0. Đối với API Scala, Spark 3.0.1 sử dụng Scala 2.12. Bạn cần sử dụng phiên bản Scala tương thích (2.12.x).
Từ tài liệu chính thức của Spark, chúng ta biết rằng Spark 3.0.1 phụ thuộc vào phiên bản Java 8u92 trở lên.
Trên hệ thống Ubuntu của tôi chưa có môi trường Java:
> javac
Lệnh 'javac' không tìm thấy, nhưng có thể cài đặt bằng cách sử dụng:
sudo apt install openjdk-11-jdk-headless # phiên bản 11.0.8+10-0ubuntu1~20.04, hoặc
sudo apt install default-jdk # phiên bản 2:1.11-72
sudo apt install openjdk-8-jdk-headless # phiên bản 8u265-b01-0ubuntu2~20.04
sudo apt install openjdk-13-jdk-headless # phiên bản 13.0.3+3-1ubuntu2
sudo apt install openjdk-14-jdk-headless # phiên bản 14.0.1+7-1ubuntu1
sudo apt install ecj # phiên bản 3.16.0-1
Cài đặt trực tiếp bằng apt:
sudo apt install openjdk-8-jdk-headless
Sau khi cài đặt, kiểm tra phiên bản Java:
> java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-8u265-b01-0ubuntu2~20.04-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
> ./bin/spark-shell
20/10/08 12:27:26 WARN Utils: Tên máy chủ của bạn, PCMICRO-27VTFD1 giải quyết thành địa chỉ loopback: 127.0.1.1; thay thế bằng 192.168.0.109 (trên giao diện eth0)
20/10/08 12:27:26 WARN Utils: Đặt SPARK_LOCAL_IP nếu bạn cần liên kết đến một địa chỉ khác
20/10/08 12:27:26 WARN NativeCodeLoader: Không thể tải thư viện hadoop-native dành cho nền tảng của bạn... đang sử dụng các lớp java tích hợp ở nơi phù hợp
Sử dụng cấu hình log4j mặc định của Spark: org/apache/spark/log4j-defaults.properties
Đặt mức nhật ký mặc định là "WARN".
Để điều chỉnh mức nhật ký, sử dụng sc.setLogLevel(newLevel). Đối với SparkR, sử dụng setLogLevel(newLevel).
Giao diện Web của Spark context có sẵn tại
Spark context có sẵn dưới dạng 'sc' (master = local[*], app id = local-1602131252287).
Spark session có sẵn dưới dạng 'spark'.
Chào mừng bạn đến với
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ phiên bản 3.0.1
/_/
Sử dụng phiên bản Scala 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_265)
Nhập biểu thức để đánh giá.
Nhập :help để biết thêm thông tin.
scala>
Khởi động thành công.
Theo ví dụ nhanh trên trang chính thức: Thực hiện:
scala> val textFile = spark.read.textFile("README.md")
textFile: org.apache.spark.sql.Dataset[String] = [value: string]
scala> textFile.count()
res0: Long = 108
Số 108 là gì? Mở tập tin README.md có thể thấy tập tin này có tổng cộng 108 dòng.
scala> textFile.filter(line => line.contains("Spark")).count()
res3: Long = 19
Cú pháp rất rõ ràng, không cần chú thích cũng hiểu được ý nghĩa. Tuyệt vời!
Việc chọn ngôn ngữ nào để sử dụng làm API cho Spark luôn là câu hỏi khiến tôi băn khoăn:
So sánh câu lệnh chức năng tương tự giữa phiên bản Scala và Python:
scala> textFile.filter(line => line.contains("Spark")).count()
python> textFile.filter(textFile.value.contains("Spark")).count()
Về tính dễ đọc, Scala rõ ràng tốt hơn. Tuy nhiên, trang chính thức không đưa ra ví dụ về shell Java, có lẽ không có phiên bản shell dành cho Java, vì vậy việc chọn Scala dường như là lựa chọn tốt hơn. Tuy nhiên, xem xét đoạn mã ứng dụng tự chứa của phiên bản Java:
long numBs = logData.filter(s -> s.contains("b")).count();
Cú pháp của Java cũng rất dễ đọc. Đồng thời, Java còn có những ưu điểm sau:
Do đó, tôi vẫn quyết định sử dụng Java làm ngôn ngữ luyện tập cho Spark.