1. Cài đặt và Cấu hình OpenJDK 17 hoặc 21
1.1 Cài đặt OpenJDK từ repository Ubuntu
Apache Pinot yêu cầu JDK 17 trở lên để chạy ổn định. Ubuntu 24.04 mặc định có sẵn OpenJDK 17 hoặc 21 trong kho lưu trữ chính thức. Chúng ta sẽ cài đặt phiên bản ổn định nhất hiện có.
Tại sao: Pinot sử dụng nhiều tính năng mới của Java (như Record, Pattern Matching) chỉ có trong JDK 17+. Việc thiếu JDK đúng phiên bản sẽ gây lỗi khởi động ngay lập tức.
Kết quả mong đợi: Biến môi trường java và javac hoạt động, hiển thị phiên bản 17 hoặc 21.
sudo apt update
sudo apt install -y openjdk-17-jdk
java -version
1.2 Cấu hình biến môi trường JAVA_HOME
Pinot cần biết đường dẫn tuyệt đối đến thư mục JDK thông qua biến JAVA_HOME. Nếu không thiết lập, các script khởi động của Pinot sẽ không tìm thấy runtime Java.
Tại sao: Các tool quản lý dịch vụ (systemd) và script shell của Pinot đều dựa vào biến này để tìm JRE. Thiết lập toàn cục giúp tránh lỗi "JAVA_HOME not set".
Kết quả mong đợi: Biến echo $JAVA_HOME trả về đường dẫn thư mục JDK (ví dụ: /usr/lib/jvm/java-17-openjdk-amd64).
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
echo $JAVA_HOME
Để biến này tồn tại vĩnh viễn sau khi reboot, ta cần thêm vào file cấu hình toàn cục.
echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" | sudo tee /etc/profile.d/java.sh
sudo chmod +x /etc/profile.d/java.sh
source /etc/profile.d/java.sh
1.3 Verify kết quả cài đặt Java
Kiểm tra lại phiên bản và đường dẫn để đảm bảo môi trường đã sẵn sàng.
java -version
which java
echo $JAVA_HOME
2. Triển khai Apache Zookeeper
2.1 Tạo user và thư mục cho Zookeeper
Zookeeper là hệ thống phân phối dịch vụ cấu hình và đồng bộ hóa. Nó cần chạy dưới một user riêng biệt để đảm bảo bảo mật và quản lý quyền file.
Tại sao: Chạy service dưới root là rủi ro bảo mật cao. User riêng biệt giúp kiểm soát quyền truy cập vào thư mục data và log.
Kết quả mong đợi: User zookeeper được tạo và sở hữu thư mục /var/lib/zookeeper.
sudo useradd -r -s /bin/false zookeeper
sudo mkdir -p /var/lib/zookeeper
sudo mkdir -p /var/log/zookeeper
sudo chown -R zookeeper:zookeeper /var/lib/zookeeper
sudo chown -R zookeeper:zookeeper /var/log/zookeeper
2.2 Tải và cấu hình Zookeeper
Chúng ta sẽ tải bản phát hành ổn định của Zookeeper (ví dụ 3.8.3), giải nén và cấu hình file zoo.cfg.
Tại sao: Zookeeper cần file cấu hình để biết nơi lưu data, port lắng nghe và chế độ chạy (standalone hoặc ensemble). File này là cốt lõi của cluster.
Kết quả mong đợi: File zoo.cfg tồn tại với cấu hình chính xác, sẵn sàng cho bước khởi động.
cd /opt
sudo wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz
sudo tar -xzf apache-zookeeper-3.8.3-bin.tar.gz
sudo mv apache-zookeeper-3.8.3-bin zookeeper
sudo chown -R zookeeper:zookeeper /opt/zookeeper
Bây giờ ta tạo file cấu hình zoo.cfg với nội dung hoàn chỉnh cho chế độ standalone (đủ cho môi trường dev/test hoặc single node).
sudo nano /opt/zookeeper/conf/zoo.cfg
Dán nội dung sau vào file (chú ý đường dẫn dataDir phải trùng với thư mục đã tạo ở bước 2.1):
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
admin.enableServer=false
maxClientCnxns=60
4lw.commands.whitelist=stat,ruok
Tạo file myid cần thiết nếu chạy ensemble, nhưng ở đây ta dùng standalone nên không bắt buộc, tuy nhiên để chuẩn hóa ta sẽ tạo file myid = 1.
echo "1" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid
2.3 Tạo file systemd service cho Zookeeper
Để Zookeeper chạy tự động khi khởi động server và quản lý dễ dàng, ta cần tạo unit file cho systemd.
Tại sao: Chạy trực tiếp bằng script zkServer.sh sẽ mất khi đóng terminal. Systemd đảm bảo service tự khởi động lại nếu bị crash.
Kết quả mong đợi: Service zookeeper được nhận diện bởi systemd và có thể điều khiển bằng systemctl.
sudo nano /etc/systemd/system/zookeeper.service
Dán nội dung hoàn chỉnh của file service:
[Unit]
Description=Apache ZooKeeper Service
After=network.target
Wants=network-online.target
[Service]
Type=forking
User=zookeeper
Group=zookeeper
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Environment=ZOO_LOG4J_PROP=INFO,ROLLINGFILE
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
2.4 Khởi động và Verify Zookeeper
Khởi động service và kiểm tra trạng thái.
sudo systemctl daemon-reload
sudo systemctl enable zookeeper
sudo systemctl start zookeeper
sudo systemctl status zookeeper
Verify bằng cách kiểm tra port 2181 và gửi lệnh kiểm tra sức khỏe (ruok).
ss -tlnp | grep 2181
echo ruok | nc localhost 2181
Kết quả mong đợi: Trạng thái service là active (running) và lệnh nc trả về imok.
3. Cài đặt và Cấu hình Apache Kafka
3.1 Tải và cấu hình Kafka
Kafka là nguồn dữ liệu stream (streaming data source) cho Pinot. Pinot sẽ subscribe vào các topic của Kafka để ingest dữ liệu.
Tại sao: Kafka đóng vai trò là buffer và source cho data pipeline. Nó cần được cấu hình để connect với Zookeeper (đã cài ở phần 2).
Kết quả mong đợi: Kafka được tải về, giải nén và file server.properties đã được cấu hình đúng broker.id và connect string.
cd /opt
sudo wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz
sudo tar -xzf kafka_2.13-3.6.1.tgz
sudo mv kafka_2.13-3.6.1 kafka
sudo chown -R root:root /opt/kafka
Sửa file cấu hình server.properties để chỉ định đúng Zookeeper connection string và các thông số cơ bản.
sudo nano /opt/kafka/config/server.properties
Thay đổi các dòng sau (giữ nguyên các dòng khác, chỉ sửa các thông số quan trọng này):
broker.id=0
listeners=PLAINTEXT://localhost:9092
advertised.listeners=PLAINTEXT://localhost:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/var/lib/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
Tạo thư mục log cho Kafka và cấp quyền.
sudo mkdir -p /var/lib/kafka-logs
sudo chown root:root /var/lib/kafka-logs
3.2 Tạo file systemd service cho Kafka
Tương tự Zookeeper, ta cần systemd để quản lý Kafka.
Tại sao: Đảm bảo Kafka chạy background và tự động khởi động lại nếu lỗi.
Kết quả mong đợi: Service kafka sẵn sàng để start.
sudo nano /etc/systemd/system/kafka.service
Dán nội dung file service:
[Unit]
Description=Apache Kafka Broker
After=network.target zookeeper.service
Requires=zookeeper.service
[Service]
Type=forking
User=root
Environment=KAFKA_HEAP_OPTS=-Xmx1G -Xms1G
Environment=KAFKA_HOME=/opt/kafka
Environment=KAFKA_LOG4J_OPTS=-Dlog4j.logDir=/var/log/kafka
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh /opt/kafka/config/server.properties
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
3.3 Khởi động và Verify Kafka
Khởi động Kafka sau khi Zookeeper đã chạy.
sudo systemctl daemon-reload
sudo systemctl enable kafka
sudo systemctl start kafka
sudo systemctl status kafka
Tạo topic mẫu mà Pinot sẽ sử dụng để ingest dữ liệu.
sudo /opt/kafka/bin/kafka-topics.sh --create --topic pinot-test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
Verify danh sách topic đã tạo.
sudo /opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
Kết quả mong đợi: Service kafka là active (running) và danh sách topic hiển thị pinot-test-topic.
3.4 Kiểm tra kết nối từ Kafka Console Producer
Thử gửi một dòng dữ liệu mẫu vào topic để đảm bảo pipeline Kafka-Zookeeper hoạt động tốt trước khi kết nối với Pinot.
echo '{"timestamp": "2024-01-01T00:00:00", "region": "US", "revenue": 1500}' | sudo /opt/kafka/bin/kafka-console-producer.sh --topic pinot-test-topic --bootstrap-server localhost:9092
Kết quả mong đợi: Không có lỗi (error message) nào xuất hiện trên terminal, dữ liệu được gửi thành công.
Điều hướng series:
Mục lục: Series: Triển khai Database ACID với Apache Pinot trên 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 Apache Pinot Controller và Server »