Cài đặt và cấu hình Apache Spark 3.5 trên Ubuntu 24.04
Chúng ta cần tải về và cấu hình Apache Spark phiên bản 3.5 để làm động cơ xử lý dữ liệu cho Iceberg. Sử dụng bản pre-built cho Hadoop 3.x để đảm bảo tương thích với HDFS hoặc Local Filesystem.
Tải Spark về thư mục /opt và giải nén. Đảm bảo quyền truy cập cho user hiện tại.
sudo apt update && sudo apt install -y java-openjdk-17-jdk curl wget
sudo mkdir -p /opt/spark
cd /opt/spark
wget https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
tar -xzf spark-3.5.0-bin-hadoop3.tgz
sudo chown -R $USER:$USER spark-3.5.0-bin-hadoop3
Thiết lập biến môi trường SPARK_HOME để Spark có thể tìm thấy các thư viện và script cần thiết.
echo "export SPARK_HOME=/opt/spark/spark-3.5.0-bin-hadoop3" >> ~/.bashrc
echo "export PATH=$PATH:$SPARK_HOME/bin" >> ~/.bashrc
source ~/.bashrc
Kiểm tra phiên bản Spark đã cài đặt. Kết quả mong đợi là hiển thị thông tin phiên bản 3.5.0 và đường dẫn đến thư mục bin.
spark-submit --version
Cấu hình thư viện Apache Iceberg cho Spark
Để Spark có thể đọc và ghi bảng Iceberg, chúng ta cần thêm các dependency (JAR) của Iceberg Spark vào cấu hình. Chúng ta sẽ sử dụng Spark 3.5 nên cần Iceberg Spark version 1.4.1 hoặc cao hơn để tương thích tốt nhất.
Tải các JAR file cần thiết: iceberg-spark-runtime và iceberg-api về thư mục jars của Spark.
mkdir -p $SPARK_HOME/jars
cd $SPARK_HOME/jars
wget https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.4.1/iceberg-spark-runtime-3.5_2.12-1.4.1.jar
wget https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-api/1.4.1/iceberg-api-1.4.1.jar
Thay thế cấu hình mặc định của Spark trong spark-defaults.conf để thêm các package cần thiết vào classpath. Điều này giúp Spark tự động load Iceberg mà không cần chỉ định --packages trong mỗi lần chạy script.
Đường dẫn file: /opt/spark/spark-3.5.0-bin-hadoop3/conf/spark-defaults.conf
cat > $SPARK_HOME/conf/spark-defaults.conf
Khởi tạo thư mục warehouse (nơi lưu trữ metadata và data files của Iceberg) và cấp quyền.
sudo mkdir -p /data/iceberg-warehouse
sudo chown -R $USER:$USER /data/iceberg-warehouse
Verify: Chạy spark-shell để kiểm tra xem Iceberg có được load đúng không. Nếu không có lỗi ClassNotFoundException, cấu hình thành công.
spark-shell --conf "spark.sql.extensions=org.apache.iceberg.spark.SparkSessionCatalog" --conf "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog" --conf "spark.sql.catalog.spark_catalog.type=spark" --conf "spark.sql.catalog.spark_catalog.warehouse=/data/iceberg-warehouse"
Khởi tạo bảng mẫu đầu tiên bằng Apache Iceberg qua Spark Catalog
Bây giờ chúng ta sẽ tạo một bảng Iceberg đơn giản để lưu dữ liệu mẫu. Chúng ta sẽ sử dụng Spark Catalog (local) để quản lý metadata thay vì Hive Metastore để đơn giản hóa môi trường single-node.
Sử dụng Spark SQL để tạo bảng 'users' với schema gồm id, name, email và timestamp. Lưu ý cú pháp CREATE TABLE AS SELECT hoặc CREATE TABLE với định dạng ICEBERG.
Đường dẫn script SQL: /tmp/create_iceberg_table.sql
cat > /tmp/create_iceberg_table.sql
Chạy script SQL này thông qua spark-sql để tạo bảng.
spark-sql < /tmp/create_iceberg_table.sql
Chèn dữ liệu mẫu vào bảng vừa tạo để kiểm tra khả năng ghi (write) của Iceberg.
spark-sql -e "INSERT INTO default.users VALUES (1, 'Nguyen Van A', 'a@example.com', '2024-01-01 10:00:00'), (2, 'Tran Thi B', 'b@example.com', '2024-01-02 11:00:00');"
Verify: Truy vấn lại bảng để đảm bảo dữ liệu đã được ghi và đọc chính xác.
spark-sql -e "SELECT * FROM default.users;"
Cấu hình Local Filesystem làm storage backend cho Iceberg
Trong môi trường phát triển hoặc single-node, Local Filesystem là backend nhanh nhất và dễ quản lý nhất. Iceberg lưu trữ metadata (văn bản JSON) và data files (Parquet) trực tiếp vào thư mục warehouse đã cấu hình.
Đảm bảo thư mục warehouse đã được cấu hình đúng trong spark-defaults.conf (đã làm ở phần trên). Nếu muốn thay đổi vị trí, cập nhật lại biến spark.sql.catalog.spark_catalog.warehouse.
Cấu hình thêm các tham số tối ưu hóa cho Local Filesystem: kích thước file Parquet và partitioning.
Đường dẫn file: /tmp/spark_iceberg_config.conf
cat > /tmp/spark_iceberg_config.conf
Sử dụng cấu hình này để tạo một bảng mới có partition theo ngày (created_at) để minh họa cách Iceberg quản lý data files trên Local FS.
spark-sql --conf spark.sql.parquet.compressionCodec=snappy --conf spark.sql.files.maxPartitionBytes=134217728 -e "
CREATE TABLE IF NOT EXISTS default.sales (
order_id BIGINT,
amount DECIMAL(10,2),
sale_date DATE
) USING iceberg
PARTITIONED BY (year(sale_date), month(sale_date));"
Chèn dữ liệu mẫu vào bảng sales với các ngày khác nhau để tạo nhiều partition file.
spark-sql --conf spark.sql.parquet.compressionCodec=snappy -e "
INSERT INTO default.sales VALUES
(101, 150.50, '2023-01-15'),
(102, 200.00, '2023-02-20'),
(103, 300.75, '2023-03-10'),
(104, 120.00, '2023-01-25');"
Verify: Kiểm tra cấu trúc thư mục thực tế trên disk để thấy Iceberg đã tổ chức dữ liệu như thế nào (manifest list, metadata log, data files).
find /data/iceberg-warehouse -type d | sort
Kiểm tra tính toàn vẹn của metadata và data files trong Iceberg
Iceberg lưu trữ metadata trong các file .metadata.json và data trong các file Parquet. Việc kiểm tra tính toàn vẹn đảm bảo rằng catalog không bị lỗi và các file dữ liệu có thể đọc được.
Thao tác 1: Sử dụng Iceberg CLI (nếu đã cài) hoặc Spark SQL để liệt kê các snapshot của bảng. Điều này xác nhận metadata đang hoạt động tốt.
spark-sql -e "SELECT * FROM default.sales__history;"
Thao tác 2: Kiểm tra file metadata trực tiếp trên filesystem. File mới nhất thường có tên chứa timestamp.
ls -lt /data/iceberg-warehouse/default/sales/metadata/ | head -n 1
Thao tác 3: Chạy lệnh ALTER TABLE để thêm một column mới (Schema Evolution). Đây là tính năng cốt lõi của Iceberg. Nếu thành công, nghĩa là metadata và data files đang đồng bộ và toàn vẹn.
spark-sql -e "ALTER TABLE default.sales ADD COLUMN status STRING DEFAULT 'active';"
Verify: Kiểm tra schema của bảng sau khi ALTER và đọc dữ liệu cũ xem có hiển thị cột mới (với giá trị default) không.
spark-sql -e "DESCRIBE default.sales;"
spark-sql -e "SELECT order_id, amount, status FROM default.sales LIMIT 2;"
Thao tác 4: Thực hiện lệnh EXPLAIN để xem execution plan của Iceberg, đảm bảo Spark đang sử dụng đúng engine Iceberg thay vì Spark SQL native.
spark-sql -e "EXPLAIN SELECT * FROM default.sales;"
Điều hướng series:
Mục lục: Series: Xây dựng Data Lakehouse với Apache Iceberg, Trino và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và yêu cầu hệ thống
Phần 3: Triển khai Trino (PrestoSQL) để truy vấn Data Lake »