Yêu cầu cấu hình phần cứng tối thiểu và Chuẩn bị hệ thống Ubuntu 24.04
Yêu cầu phần cứng và tài nguyên
Để triển khai Apache Hudi trên môi trường đơn nút hoặc cụm nhỏ cho mục đích phát triển và kiểm thử, cấu hình tối thiểu cần đáp ứng các thông số sau:
CPU: Tối thiểu 4 Core (khuyến nghị 8 Core trở lên để chạy Spark Executor hiệu quả).
RAM: Tối thiểu 8GB (khuyến nghị 16GB+ để phân bổ đủ bộ nhớ cho HDFS NameNode, DataNode và Spark Driver/Executor).
Disk: Tối thiểu 50GB trống, khuyến nghị sử dụng SSD để tăng tốc độ I/O cho các thao tác compaction và upsert.
Mạng: Kết nối LAN ổn định với băng thông đủ lớn để truyền tải dữ liệu giữa các node nếu triển khai cụm.
Cài đặt và cập nhật Ubuntu 24.04
Trước tiên, cần đảm bảo hệ điều hành đã được cài đặt sạch và cập nhật các gói phần mềm mới nhất để tránh xung đột thư viện.
Thực hiện lệnh cập nhật repository và nâng cấp các gói hệ thống:
sudo apt update && sudo apt upgrade -y
Kết quả mong đợi: Hệ thống hiển thị danh sách các gói được cập nhật, không có lỗi về repository hoặc dependency.
Cài đặt các công cụ nền tảng cần thiết cho môi trường Linux server (build-essential, git, curl, vim, wget):
sudo apt install -y build-essential git curl wget vim net-tools
Kết quả mong đợi: Các công cụ được cài đặt thành công, sẵn sàng để tải về và biên dịch các phần mềm tiếp theo.
Thiết lập tên miền (hostname) và cấu hình file hosts để các dịch vụ có thể nhận diện nhau qua địa chỉ IP và tên máy chủ. Giả sử hostname là 'hudi-node':
sudo hostnamectl set-hostname hudi-node
Kết quả mong đợi: Tên máy chủ thay đổi thành 'hudi-node' khi chạy lệnh 'hostname'.
Cập nhật file /etc/hosts để ánh xạ IP đến hostname. Thay thế 192.168.1.100 bằng địa chỉ IP thực tế của máy bạn:
echo "192.168.1.100 hudi-node" | sudo tee -a /etc/hosts
Kết quả mong đợi: File /etc/hosts được cập nhật, lệnh 'ping hudi-node' trả về đúng địa chỉ IP.
Cài đặt Java JDK 17 và Cấu hình biến môi trường
Tải và cài đặt OpenJDK 17
Apache Hudi và Spark 3.5 yêu cầu phiên bản Java 17 trở lên. Ubuntu 24.04 mặc định có thể chưa có JDK 17 trong repository chính, nên chúng ta cần thêm PPA hoặc cài đặt trực tiếp từ Oracle/Adoptium. Ở đây sử dụng OpenJDK 17 từ repository HWE (Hardware Enablement) hoặc cài đặt trực tiếp:
sudo apt install -y openjdk-17-jdk openjdk-17-jre
Kết quả mong đợi: Gói openjdk-17-jdk được cài đặt thành công.
Cấu hình biến môi trường JAVA_HOME
Cần chỉ định rõ ràng đường dẫn JDK cho các ứng dụng Hadoop và Spark. Xác định đường dẫn thực tế của JDK:
readlink -f /usr/bin/java
Kết quả mong đợi: Trả về đường dẫn tuyệt đối, ví dụ: '/usr/lib/jvm/java-17-openjdk-amd64/bin/java'. Đường dẫn thư mục gốc là '/usr/lib/jvm/java-17-openjdk-amd64'.
Tạo file cấu hình biến môi trường tại /etc/environment để áp dụng cho toàn hệ thống:
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" | sudo tee -a /etc/environment
Kết quả mong đợi: Biến JAVA_HOME được thêm vào file /etc/environment.
Để biến có hiệu lực ngay lập tức cho phiên làm việc hiện tại (không cần logout/login):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Kiểm tra lại biến môi trường:
echo $JAVA_HOME
Kết quả mong đợi: Trả về '/usr/lib/jvm/java-17-openjdk-amd64'.
Verify phiên bản Java:
java -version
Kết quả mong đợi: Hiển thị 'openjdk version "17.0.x"' và 'OpenJDK Runtime Environment'.
Cài đặt Apache Hadoop 3.3 và Cấu hình HDFS
Tải và giải nén Apache Hadoop
Apache Hudi yêu cầu một hệ thống lưu trữ phân tán, ở đây chúng ta dùng HDFS từ Apache Hadoop 3.3.3. Tải xuống và giải nén vào thư mục /opt:
cd /opt && wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz
tar -xzf hadoop-3.3.3.tar.gz
Kết quả mong đợi: Thư mục 'hadoop-3.3.3' xuất hiện trong /opt.
Cấu hình biến môi trường HADOOP_HOME
Thêm biến môi trường HADOOP_HOME vào file ~/.bashrc để thuận tiện cho việc chạy các lệnh Hadoop từ shell:
echo "export HADOOP_HOME=/opt/hadoop-3.3.3" >> ~/.bashrc
echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" >> ~/.bashrc
source ~/.bashrc
Kết quả mong đợi: Có thể chạy lệnh 'hadoop version' mà không cần chỉ định đường dẫn đầy đủ.
Cấu hình file core-site.xml
File này định nghĩa nơi lưu trữ mặc định của HDFS và cổng NameNode. Tạo file cấu hình tại $HADOOP_HOME/etc/hadoop/core-site.xml:
cat > /opt/hadoop-3.3.3/etc/hadoop/core-site.xml
Kết quả mong đợi: File được tạo thành công, HDFS sẽ lưu dữ liệu tại /var/hadoop/tmp nếu không cấu hình khác, và NameNode chạy trên cổng 9000.
Cấu hình file hdfs-site.xml
Cấu hình số lượng replica (mặc định là 3, nhưng trên single node cần giảm xuống 1) và đường dẫn lưu trữ dữ liệu (DataNode) cùng metadata (NameNode):
cat > /opt/hadoop-3.3.3/etc/hadoop/hdfs-site.xml
Kết quả mong đợi: File được tạo, HDFS sẽ lưu metadata và data vào các thư mục riêng biệt để dễ quản lý.
Cấu hình file hadoop-env.sh
Chỉ định đường dẫn JAVA_HOME trong file cấu hình môi trường của Hadoop để đảm bảo HDFS chạy đúng phiên bản Java:
echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" | sudo tee -a /opt/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
Kết quả mong đợi: File hadoop-env.sh được cập nhật.
Format và Khởi động HDFS
Tạo thư mục lưu trữ và cấp quyền cho user hiện tại:
sudo mkdir -p /var/hadoop/namenode /var/hadoop/datanode /var/hadoop/tmp
sudo chown -R $USER:$USER /var/hadoop
Kết quả mong đợi: Các thư mục được tạo và thuộc về user hiện tại (không phải root) để tránh lỗi permission khi Hadoop chạy.
Format NameNode (chỉ chạy 1 lần duy nhất, nếu chạy lại sẽ mất toàn bộ dữ liệu cũ):
hdfs namenode -format -force
Kết quả mong đợi: Xuất hiện dòng "The following entries will be removed from the fsimage" và "ClusterID: ..." cùng "SUCCESS".
Khởi động HDFS bằng script shell:
start-dfs.sh
Kết quả mong đợi: Xuất hiện danh sách các tiến trình đang chạy: NameNode, DataNode, SecondaryNameNode.
Verify HDFS bằng cách kiểm tra trạng thái DataNode:
hdfs dfsadmin -report
Kết quả mong đợi: Hiển thị "Cluster Summary", "Live datanodes: 1", "Dead datanodes: 0".
Cài đặt Apache Spark 3.5 và Tích hợp với HDFS
Tải và cài đặt Apache Spark
Apache Spark 3.5 cần được tải về phiên bản "pre-built for Hadoop 3.x" để tương thích với HDFS 3.3. Tải xuống vào /opt:
cd /opt && 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
Kết quả mong đợi: Thư mục 'spark-3.5.0-bin-hadoop3' xuất hiện.
Cấu hình biến môi trường SPARK_HOME
Thêm biến môi trường SPARK_HOME vào ~/.bashrc:
echo "export SPARK_HOME=/opt/spark-3.5.0-bin-hadoop3" >> ~/.bashrc
echo "export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin" >> ~/.bashrc
source ~/.bashrc
Kết quả mong đợi: Lệnh 'spark-shell' hoặc 'spark-submit' chạy được từ bất kỳ đâu.
Cấu hình spark-env.sh
Cấu hình biến môi trường cho Spark, bao gồm JAVA_HOME và bộ nhớ tối đa cho Driver:
cat > /opt/spark-3.5.0-bin-hadoop3/conf/spark-env.sh
Kết quả mong đợi: File spark-env.sh được tạo, Spark sẽ biết cách gọi Java và phân bổ bộ nhớ.
Cấu hình slaves file (workers)
Trên môi trường single node, file này cần chỉ định tên máy chủ để Spark biết nơi chạy Executor:
echo "hudi-node" > /opt/spark-3.5.0-bin-hadoop3/conf/slaves
Kết quả mong đợi: File slaves được tạo với nội dung là hostname của máy.
Khởi động và Verify Spark Standalone Mode
Khởi động Spark Master:
start-master.sh
Kết quả mong đợi: Xuất hiện dòng "Spark Master started on port 7077" và URL truy cập web UI.
Khởi động Spark Worker (để chạy Executor):
start-slaves.sh
Kết quả mong đợi: Xuất hiện dòng "Starting Spark worker" và "Successfully started Spark worker".
Kiểm tra trạng thái Spark bằng lệnh spark-class:
spark-submit --master local[2] --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_2.12-3.5.0.jar 10
Kết quả mong đợi: Spark chạy xong, in ra kết quả tính toán số Pi (ví dụ: "Pi is roughly 3.14...") và không có lỗi về HDFS hoặc Java.
Kiểm tra khả năng đọc ghi HDFS của Spark:
hdfs dfs -put /opt/hadoop-3.3.3/etc/hadoop/core-site.xml /user/test-core-site.xml
spark-submit --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_2.12-3.5.0.jar 10 2>&1 | grep -i "success"
Kết quả mong đợi: Dữ liệu được đưa vào HDFS thành công và Spark có thể truy cập được.
Verify môi trường hoàn chỉnh bằng cách kiểm tra các biến môi trường và dịch vụ:
echo "JAVA_HOME: $JAVA_HOME" && echo "HADOOP_HOME: $HADOOP_HOME" && echo "SPARK_HOME: $SPARK_HOME" && jps
Kết quả mong đợi: Các biến hiển thị đúng đường dẫn, lệnh jps hiển thị: NameNode, DataNode, SecondaryNameNode, Master, Worker, Jps.
Điều hướng series:
Mục lục: Series: Triển khai Database Lakehouse với Apache Hudi và Ubuntu 24.04
Phần 2: Cài đặt và cấu hình Apache Hudi trên cụm Ubuntu »