1. Tải và cài đặt Apache Flink phiên bản tương thích Java 17
Chọn phiên bản và tải về
Chúng ta cần tải phiên bản Apache Flink 1.18.x trở lên để đảm bảo hỗ trợ native cho Java 17. Ở đây mình chọn bản 1.18.0, bản ổn định nhất cho kiến trúc Standalone.
Mục đích là lấy binary package đã được build sẵn, không cần compile từ source code.
Kết quả mong đợi: File .tar.gz nằm trong thư mục /opt/flink.
sudo apt-get update
sudo apt-get install -y wget curl
cd /opt
wget https://archive.apache.org/dist/flink/flink-1.18.0/flink-1.18.0-bin-scala_2.12.tgz
Giải nén file vừa tải về. Tên thư mục sau khi giải nén phải khớp với tên file để các script mặc định hoạt động đúng.
Tại sao: Các script khởi động trong Flink thường giả định thư mục cài đặt nằm ở $FLINK_HOME. Việc đặt đúng tên giúp tránh lỗi đường dẫn.
Kết quả mong đợi: Thư mục /opt/flink-1.18.0 được tạo ra.
sudo tar -xzf flink-1.18.0-bin-scala_2.12.tgz
sudo mv flink-1.18.0-bin-scala_2.12 flink
Cấp quyền truy cập
Đổi chủ sở hữu thư mục Flink cho user hiện tại để tránh phải gõ sudo liên tục khi chỉnh sửa config.
Tại sao: User root đã tạo thư mục, nếu user thường chạy script sẽ bị lỗi Permission Denied khi ghi log hoặc tạo socket.
Kết quả mong đợi: Bạn có thể cd vào /opt/flink và chỉnh sửa file mà không cần sudo.
sudo chown -R $USER:$USER /opt/flink
cd /opt/flink
2. Cấu hình file flink-conf.yaml
Chỉnh sửa JobManager và TaskManager
Tập tin flink-conf.yaml là nơi định nghĩa toàn bộ hành vi của cluster. Chúng ta cần cấu hình RAM cho JobManager và TaskManager, cùng với địa chỉ IP để chúng liên lạc với nhau.
Tại sao: Mặc định Flink chạy với 1GB RAM, không đủ cho bài tập streaming sau này. Cần chỉ định rõ IP để TaskManager biết connect về JobManager ở đâu.
Kết quả mong đợi: File được lưu, các tham số memory và hostname được cập nhật.
Đường dẫn: /opt/flink/conf/flink-conf.yaml
Hãy mở file này bằng nano hoặc vim và thay thế nội dung cũ bằng cấu hình dưới đây. Lưu ý: thay YOUR_SERVER_IP bằng địa chỉ IP thực của máy Ubuntu (kiểm tra bằng lệnh hostname -I).
jobmanager.rpc.address: YOUR_SERVER_IP
jobmanager.memory.process.size: 1024m
taskmanager.memory.process.size: 2048m
taskmanager.numberOfTaskSlots: 2
parallelism.default: 2
high-availability: false
Giải thích các tham số:
- jobmanager.rpc.address: Địa chỉ IP để TaskManager và Web UI tìm thấy JobManager.
- jobmanager.memory.process.size: Tổng bộ nhớ cấp cho tiến trình JobManager (bao gồm heap và off-heap).
- taskmanager.memory.process.size: Tổng bộ nhớ cấp cho tiến trình TaskManager.
- taskmanager.numberOfTaskSlots: Số slot tính toán trên mỗi TaskManager instance.
- high-availability: Tắt HA mode vì đây là Standalone đơn giản, chưa cần ZooKeeper.
Cách verify: Chạy lệnh cat để xem lại nội dung file.
cat /opt/flink/conf/flink-conf.yaml | grep -E "jobmanager.rpc.address|memory.process.size|numberOfTaskSlots"
3. Cấu hình file workers
Chỉ định TaskManager trên các node
File workers dùng để liệt kê các máy chủ sẽ chạy TaskManager. Trong môi trường Standalone đơn máy (single node), chúng ta vẫn cần khai báo localhost hoặc IP của máy.
Tại sao: Nếu không có file này hoặc để trống, Flink sẽ không khởi tạo bất kỳ TaskManager nào, dẫn đến cluster không thể chạy job.
Kết quả mong đợi: File workers chứa địa chỉ IP của máy chủ hiện tại.
Đường dẫn: /opt/flink/conf/workers
Tạo file mới hoặc sửa file cũ (nếu có) với nội dung dưới đây. Thay YOUR_SERVER_IP bằng IP thực tế của bạn.
YOUR_SERVER_IP
Lưu ý: Mỗi dòng là một node. Nếu bạn muốn chạy 2 TaskManager trên cùng 1 máy để test độ tải, bạn có thể lặp lại dòng này 2 lần. Tuy nhiên, với cấu hình slot ở bước trước (2 slots), chỉ cần 1 dòng là đủ.
Cách verify: Kiểm tra xem IP có được ghi đúng không.
cat /opt/flink/conf/workers
4. Cài đặt và chuẩn bị script khởi động
Kiểm tra script mặc định
Flink đã cung cấp sẵn các script trong thư mục bin. Chúng ta không cần tự viết script mới, chỉ cần đảm bảo quyền thực thi.
Tại sao: Các script start-cluster.sh và start-jobmanager.sh đã được viết sẵn logic để đọc file config và workers, gọi JVM với các tham số phù hợp.
Kết quả mong đợi: Các script có quyền +x (executable).
cd /opt/flink/bin
chmod +x start-cluster.sh start-jobmanager.sh stop-cluster.sh
Định nghĩa biến môi trường FLINK_HOME
Các script trong Flink phụ thuộc vào biến môi trường FLINK_HOME để tìm đường dẫn đến thư mục conf và lib. Nếu không set, script có thể chạy chậm hoặc báo lỗi không tìm thấy file.
Tại sao: Giúp script biết chính xác nơi chứa cấu hình, tránh việc phải gõ đường dẫn tuyệt đối mỗi lần chạy.
Kết quả mong đợi: Biến FLINK_HOME trỏ đến /opt/flink trong session hiện tại.
export FLINK_HOME=/opt/flink
echo $FLINK_HOME
Cách verify: Chạy lệnh echo $FLINK_HOME và kiểm tra output có phải là /opt/flink không.
5. Khởi động Cluster và truy cập Web UI
Chạy lệnh khởi động
Sử dụng script start-cluster.sh để khởi động đồng thời JobManager và TaskManager.
Tại sao: Script này tự động đọc file workers để spawn TaskManager và đọc flink-conf.yaml để spawn JobManager. Đây là cách chuẩn để chạy Standalone.
Kết quả mong đợi: Xuất hiện thông báo "JobManager started" và "TaskManager started", kèm theo PID của các tiến trình.
cd /opt/flink/bin
./start-cluster.sh
Để chắc chắn TaskManager đã connect thành công về JobManager, hãy chạy lệnh kiểm tra trạng thái cluster.
./flink list-jobs
./flink list-slots
Cách verify: Lệnh list-slots phải hiển thị tổng số slot (2) và số slot đang sử dụng (0). Nếu không thấy slot, TaskManager chưa kết nối.
Truy cập Flink Web UI
Mở trình duyệt web trên máy tính (hoặc SSH tunnel nếu server ở xa) và truy cập địa chỉ mặc định của JobManager.
Tại sao: Web UI là giao diện quản lý chính để submit job, xem log, và monitor tài nguyên.
Kết quả mong đợi: Giao diện Flink Dashboard hiện ra, hiển thị trạng thái "Running" và 1 TaskManager.
open http://YOUR_SERVER_IP:8081
Lưu ý: Nếu bạn đang SSH vào server từ xa, bạn cần mở port 8081 trên firewall của Ubuntu để truy cập từ mạng bên ngoài.
sudo ufw allow 8081/tcp
Cách verify: Trên Web UI, nhìn vào phần "Task Managers", đảm bảo có 1 TaskManager online và tổng số slots là 2.
6. Kiểm tra và Verify toàn bộ môi trường
Đảm bảo tiến trình đang chạy
Sử dụng lệnh ps để xác nhận cả JobManager và TaskManager đều đang chạy trên hệ thống.
Tại sao: Web UI có thể tải chậm, việc kiểm tra tiến trình hệ thống giúp xác nhận nhanh lỗi khởi động (ví dụ: lỗi RAM, lỗi port).
Kết quả mong đợi: Thấy 2 tiến trình java chứa từ khóa "JobManager" và "TaskManager".
ps -ef | grep flink | grep -v grep
Kiểm tra cổng mạng
Đảm bảo JobManager đang lắng nghe trên cổng 8081 (Web UI) và cổng RPC (mặc định 6123).
Tại sao: Nếu cổng không mở, Web UI sẽ không vào được và TaskManager không thể connect về JobManager.
Kết quả mong đợi: Các cổng 8081 và 6123 hiện trạng LISTEN.
sudo netstat -tlnp | grep -E "8081|6123"
Đến đây, môi trường Apache Flink Standalone Cluster trên Ubuntu 24.04 đã sẵn sàng để thực hiện các bước tiếp theo: cấu hình Kafka Source/Sink.
Điều hướng series:
Mục lục: Series: Triển khai Database Streaming với Apache Flink và Ubuntu 24.04
« Phần 2: Cài đặt và cấu hình ZooKeeper cho môi trường phân tán
Phần 4: Cấu hình source và sink cho Apache Kafka trên Ubuntu »