五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化軟件的部署
文章目錄
- 五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化軟件的部署
- 1.作用
- 主要作用(通俗說法)
- 對實戰項目有什么用?(直接舉例)
- 2.集群化軟件
- 3.集群化環境前置準備
- 配置多臺/Linux虛擬機
- 準備主機映射名
- 配置 SSH 免密登錄(key 方式)
- 安裝JDK環境(之前有寫過)
- scp命令
- 4.約定與準備
- 通用基線(一次執行,后面所有組件通用)
- ZooKeeper(單機先跑通)
- Kafka(KRaft 模式,不依賴 ZK,最省心)
- Hadoop(HDFS + YARN,單機偽分布式)
- HBase(先用 Standalone,最快上手)
- Spark(Standalone)
- Flink(Standalone)
- 常見坑與秒級排查
1.作用
一句話:集群=把多臺 Linux 服務器擰成“一臺大機器”,讓系統更穩、更快、能隨時加機器頂住流量,還能不停機維護。
主要作用(通俗說法)
- 不怕宕機(高可用):一臺掛了,其他頂上;服務不中斷。
- 能扛流量(橫向擴展):來了更多用戶,就多加幾臺機器分擔。
- 跑得更快(并行/分片):把任務或數據切成多份同時處理。
- 維護不打擾(滾動升級):一臺臺升級、發版,用戶基本無感。
- 數據更安全(多副本/容災):同一份數據放多處,單點壞了不丟。
對實戰項目有什么用?(直接舉例)
- Web/接口服務:Nginx/HAProxy 做負載均衡,多副本應用 → 高并發不炸。
- 緩存:Redis Sentinel/Cluster → 會話共享、熱點數據加速且可自動切主。
- 消息隊列:RabbitMQ 集群 + quorum 隊列 → 異步削峰,節點故障不丟消息。
- 搜索/日志:Elasticsearch 多節點 → 搜索快、日志檢索穩定不怕單點。
- 數據庫主備/讀寫分離:MySQL 主從或集群 → 宕機可切換,讀性能提升。
2.集群化軟件
分類 | 主要用途(一句話) | 常見軟件(代表) | 典型場景 |
---|---|---|---|
計算/調度 | 統一調度作業與資源、彈性伸縮 | Kubernetes、YARN、Ray、Dask | 應用編排、批處理/AI 任務調度 |
消息與流 | 解耦與削峰、流式數據管道 | Kafka、Pulsar、RocketMQ | 日志/埋點、訂單事件、實時 ETL |
批處理/交互式 SQL | 大數據 SQL 查詢與離線分析 | Hive、Trino(Presto)、Impala | 數倉離線報表、即席查詢 |
實時計算 | 低延遲流計算與復雜事件處理 | Flink、Spark Streaming、Storm | 實時看板、風控、告警 |
分布式存儲/數據庫 | 海量數據存儲與高并發讀寫/分析 | HDFS、Ceph/MinIO、ClickHouse/Doris、Cassandra/TiDB | 數據湖文件、OLAP 分析、彈性數據庫 |
數據湖表格式 | 為數據湖提供 ACID/時光回溯/模式演進 | Iceberg、Delta Lake、Hudi | 統一湖倉表、增量寫入與回滾 |
數據集成/采集/CDC | 異構系統數據同步與變更捕獲 | Kafka Connect/Debezium/Flink CDC、NiFi、Logstash/Fluentd/Filebeat | 庫表同步、日志采集、實時入湖 |
元數據/權限/安全 | 數據資產、血緣與權限治理 | Hive Metastore、Atlas/DataHub、Ranger、Kerberos | 數據目錄、合規審計、統一認證 |
協調/注冊/配置 | 一致性、服務發現與配置中心 | ZooKeeper、etcd、Consul、Nacos/Apollo | 分布式鎖、服務注冊、動態配置 |
網關/負載均衡/服務網格 | 北向入口與流量治理 | Nginx、HAProxy、Envoy、Istio | 反向代理、限流熔斷、灰度發布 |
監控/日志/可觀測 | 指標監控、日志檢索與告警 | Prometheus+Grafana、ELK/EFK、Loki | 系統健康、故障定位、告警聯動 |
3.集群化環境前置準備
配置多臺/Linux虛擬機
-
虛擬機關機,左側欄新建一個名為“虛擬機集群”的文件夾,右鍵,選擇管理中的克隆,創建出一個完整的克隆虛擬機(狀態任選,按它默認給的就可以但要選擇完整克隆),命名按序號(node1)就可以。創建成功后放入剛剛新建的文件夾中。
-
克隆出兩臺虛擬機:node2、node3(左側目錄顯示 node1 / node2 / node3)。
-
啟動 node1,把主機名改為
node1
,并把 IP 固定為192.168.88.131
:hostnamectl set-hostname node1 vim /etc/sysconfig/network-scripts/ifcfg-ens33 # 在文件中設置: IPADDR="192.168.88.131"# 重啟網絡 systemctl restart network # 或: systemctl stop network && systemctl start network
-
啟動 node2 與 node3,做相同配置:
node2 主機名node2
,IP192.168.88.132
;
node3 主機名node3
,IP192.168.88.133
。 -
在 FinalShell 中分別創建到 node1、node2、node3 的連接;提示里建議為了簡單起見使用 root 用戶登錄。
準備主機映射名
1)Windows 上添加(如果你用 Windows 作為運維機)
- 以管理員身份打開記事本,編輯:
C:\Windows\System32\drivers\etc\hosts
- 追加三行:
192.168.88.131 node1
192.168.88.132 node2
192.168.88.133 node3
- 保存即可(若權限不夠,先把文件拷到桌面改好再拷回去并覆蓋)。這里是你自己設置的固定ip地址
2)Linux 上添加(3 臺都要加)
sudo -i
cat >> /etc/hosts <<'EOF'
192.168.88.131 node1
192.168.88.132 node2
192.168.88.133 node3
EOF
3)設置每臺機器的主機名(可選但推薦)
在 node1/node2/node3 分別執行對應主機名:
# node1 上
hostnamectl set-hostname node1
# node2 上
hostnamectl set-hostname node2
# node3 上
hostnamectl set-hostname node3
重新登錄后 hostname
應顯示正確。
4)驗證
ping -c 2 node1
ping -c 2 node2
ping -c 2 node3
能通就說明映射生效。
配置 SSH 免密登錄(key 方式)
- SSH服務是一種用于遠程登錄的安全認證協議
- 通過Finalshell遠程連接到Linux,就是使用SSH服務
假設你想從 node1 免密到 node2、node3(也可以反向同理)。
1)在 node1 生成密鑰(用哪個賬號免密就在哪個賬號執行)
# 不要設置密碼短語,全部回車即可
ssh-keygen -t ed25519 -C "node1-key"
# 如果系統太老不支持 ed25519,用:
# ssh-keygen -t rsa -b 4096 -C "node1-key"
2)把公鑰拷到 node2、node3
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@node2
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@node3
# 若是普通用戶,替換 root 為你的用戶名
如果沒有 ssh-copy-id
,用手動方式:
# 在 node1 上
cat ~/.ssh/id_ed25519.pub
# 復制輸出的整行,粘貼到 node2/node3 的 ~/.ssh/authorized_keys 里
# 并在 node2/node3 上確保權限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3)測試免密
ssh node2 # 應該直接登錄而不再要密碼
exit
ssh node3
exit
三、常見問題排查
-
權限問題(最常見)
在目標機(被登錄的那臺)確保:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R $(whoami):$(whoami) ~/.ssh
-
sshd 配置禁止了密碼或公鑰
查看/etc/ssh/sshd_config
:PubkeyAuthentication yes PasswordAuthentication yes # 你已能免密后可改為 no 提升安全 PermitRootLogin yes # 若用 root 登錄才需要;生產建議禁用
修改后重啟:
# CentOS/Rocky/AlmaLinux systemctl restart sshd # Ubuntu/Debian systemctl restart ssh
-
防火墻/SELinux
-
端口 22 要放行(或你修改的端口):
# firewalld firewall-cmd --add-service=ssh --permanent firewall-cmd --reload
-
SELinux 先確認狀態:
getenforce
若為
Enforcing
且你做了自定義目錄存放.ssh
,需正確上下文或暫時設為Permissive
進行排查(生產環境建議按規范修正上下文)。
-
-
known_hosts 沖突:IP/主機名復用導致警告,按提示到
~/.ssh/known_hosts
刪除對應行或:ssh-keygen -R node2 ssh-keygen -R 192.168.88.132
-
端口非 22:連接時加
-p PORT
,或在~/.ssh/config
中寫別名:cat >> ~/.ssh/config <<'EOF' Host node2HostName 192.168.88.132User rootPort 22 Host node3HostName 192.168.88.133User rootPort 22 EOF chmod 600 ~/.ssh/config
安裝JDK環境(之前有寫過)
scp命令
本地 -> 遠程scp [選項] local_path user@host:/remote/path遠程 -> 本地scp [選項] user@host:/remote/path local_path遠程A -> 遠程B(走本機中轉)scp -3 [選項] userA@hostA:/path userB@hostB:/path
選項 | 作用 | 典型用法 | 備注/注意 |
---|---|---|---|
-r | 遞歸復制目錄 | scp -r ./conf root@h:/etc/app/ | 最常用;別忘了目標目錄要有寫權限 |
-P <port> | 指定 SSH 端口(大寫 P) | scp -P 2222 file root@h:/opt/ | 常被寫成小寫 -p (那是“保留屬性”) |
-i <key> | 指定私鑰 | scp -i ~/.ssh/id_rsa pkg.tgz root@h:/opt/ | 等價于 -o IdentityFile=... |
-C | 壓縮傳輸 | scp -C big.iso root@h:/data/ | 慢鏈路有用;會增加 CPU 消耗 |
-p | 保留時間戳/權限/ACL | scp -p app.sh root@h:/usr/local/bin/ | 與 rsync -a 類似的效果之一 |
-q | 靜默模式 | scp -q file root@h:/tmp/ | 關掉進度條/提示 |
-o <k=v> | 傳遞任意 SSH 配置項 | scp -o StrictHostKeyChecking=no file root@h:/opt/ | 可設置 ConnectTimeout 、ProxyCommand 、ForwardAgent 等 |
-J <jump> | 跳板機(ProxyJump) | scp -J bastion@10.0.0.10 pkg.tgz root@10.0.0.21:/opt/ | 支持多跳:-J a,b,c |
-l <kbps> | 限速(Kbit/s) | scp -l 5000 file root@h:/data/ | 5000≈5Mb/s≈0.625MB/s |
-v | 調試輸出(可疊加) | scp -vvv file root@h:/opt/ | 排查“連不上/卡住”很有用 |
-4 / -6 | 強制用 IPv4 / IPv6 | scp -4 file root@h:/opt/ | 解決 DNS 雙棧解析導致的連接問題 |
-F <file> | 指定 ssh_config | scp -F ./ssh_config file hostA:/opt/ | 配合項目專用配置 |
-S <ssh_path> | 指定 ssh 程序 | scp -S /usr/local/bin/ssh file host:/ | 罕用;自定義 ssh 客戶端 |
-3 | 遠程A→遠程B,經由本機中轉 | scp -3 user1@A:/a.log user2@B:/tmp/ | 走兩段鏈路,慢;但不需兩端互通 |
-T | 關閉嚴格文件名檢查 | scp -T host:'~/dir/*' . | 允許遠端通配符展開;有風險(謹慎) |
-c <cipher> | 指定加密算法 | scp -c aes128-gcm@openssh.com ... | 極少用;一般讓 ssh 自協商即可 |
-B | 批處理模式(禁止交互) | scp -B file host:/opt/ | 常與密鑰/Agent 搭配,腳本中用 |
-O | 使用舊版 SCP 協議 | scp -O file host:/opt/ | 新版 OpenSSH 默認走 SFTP;兼容老服務器時用 |
- 遠程到遠程時若想不經本機中轉,用
rsync -e ssh
的“pull/push”到一端執行,會更快;或在一端使用scp
拉/推另一端。 - 需要斷點續傳/只傳差異時,選
rsync -avzP
更合適;scp
不支持續傳。 - 路徑含空格請用引號:
"path with space"
;遠端路徑也要加引號:host:"/tmp/my file.txt"
。
4.約定與準備
- 軟件裝到 /opt,數據放 /data。
- 使用 Apache 官方存檔源(穩定、可復現)。
- 需要可訪問外網。
- 版本:ZooKeeper 3.8.4、Kafka 3.6.1(KRaft)、Hadoop 3.3.6、HBase 2.4.17、Spark 3.5.1(hadoop3)、Flink 1.17.2(scala_2.12)。
通用基線(一次執行,后面所有組件通用)
做什么:裝工具+JDK、創建目錄、加環境變量(PATH)。
yum -y install epel-release wget curl tar xz unzip java-1.8.0-openjdk java-1.8.0-openjdk-devel lsof net-tools nc
mkdir -p /opt /datacat >/etc/profile.d/bigdata.sh <<'ENV'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export ZK_HOME=/opt/zookeeper
export KAFKA_HOME=/opt/kafka
export HADOOP_HOME=/opt/hadoop
export HBASE_HOME=/opt/hbase
export SPARK_HOME=/opt/spark
export FLINK_HOME=/opt/flink
export PATH=$ZK_HOME/bin:$KAFKA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$FLINK_HOME/bin:$PATH
ENV
source /etc/profile.d/bigdata.sh
小貼士:如果有防火墻,需要按端口清單放行:ZK(2181)、Kafka(9092)、Hadoop(9870/8088)、HBase(16010)、Spark(7077/8080)、Flink(8081)。
ZooKeeper(單機先跑通)
做什么:下載→配置→啟動→驗證。
cd /opt
wget -q https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
tar -xzf apache-zookeeper-3.8.4-bin.tar.gz && mv apache-zookeeper-3.8.4-bin zookeeper
mkdir -p /data/zkcat > /opt/zookeeper/conf/zoo.cfg <<'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk
clientPort=2181
EOF/opt/zookeeper/bin/zkServer.sh start
echo ruok | nc 127.0.0.1 2181 # 返回 imok 即成功
變成三節點怎么做:在 zoo.cfg
末尾加
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
并在每臺寫入 /data/zk/myid
(分別是 1/2/3),然后分別啟動。
Kafka(KRaft 模式,不依賴 ZK,最省心)
做什么:下載→改監聽地址→初始化存儲→啟動→發消息測試。
cd /opt
wget -q https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz
tar -xzf kafka_2.13-3.6.1.tgz && mv kafka_2.13-3.6.1 kafka
mkdir -p /data/kafka
IP=$(hostname -I | awk '{print $1}')
CFG=/opt/kafka/config/kraft/server.properties
cp -f $CFG $CFG.bak# 關鍵配置:監聽與對外通告地址、日志目錄
sed -ri "s@^#?listeners=.*@listeners=PLAINTEXT://${IP}:9092@" $CFG
sed -ri "s@^#?advertised.listeners=.*@advertised.listeners=PLAINTEXT://${IP}:9092@" $CFG
sed -ri "s@^log.dirs=.*@log.dirs=/data/kafka/logs@" $CFG# 初始化元數據(只第一次)
CID=$(/opt/kafka/bin/kafka-storage.sh random-uuid)
echo "$CID" >/data/kafka/cluster-id
/opt/kafka/bin/kafka-storage.sh format -t "$CID" -c $CFG# 啟動(后臺)
nohup /opt/kafka/bin/kafka-server-start.sh $CFG >/var/log/kafka.out 2>&1 &# 驗證:建 topic,發/收消息
/opt/kafka/bin/kafka-topics.sh --bootstrap-server ${IP}:9092 --create --topic demo --partitions 1 --replication-factor 1
/opt/kafka/bin/kafka-console-producer.sh --broker-list ${IP}:9092 --topic demo &
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server ${IP}:9092 --topic demo --from-beginning
變成三節點怎么做:三臺都按上面裝;server.properties
中設置唯一的 node.id
、controller.quorum.voters
(KRaft 集群參數),或直接用“依賴 ZK 的老模式”,在每臺把 zookeeper.connect
指向你的 ZK 集群。
Hadoop(HDFS + YARN,單機偽分布式)
做什么:下載→設置 JAVA_HOME→寫 4 個配置→格式化→啟動→驗證。
cd /opt
wget -q https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -xzf hadoop-3.3.6.tar.gz && mv hadoop-3.3.6 hadoop
echo "export JAVA_HOME=$JAVA_HOME" >> /opt/hadoop/etc/hadoop/hadoop-env.sh
mkdir -p /data/hadoop/nn /data/hadoop/dncat >/opt/hadoop/etc/hadoop/core-site.xml <<'EOF'
<configuration><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property>
</configuration>
EOFcat >/opt/hadoop/etc/hadoop/hdfs-site.xml <<'EOF'
<configuration><property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>file:/data/hadoop/nn</value></property><property><name>dfs.datanode.data.dir</name><value>file:/data/hadoop/dn</value></property>
</configuration>
EOFcat >/opt/hadoop/etc/hadoop/yarn-site.xml <<'EOF'
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
</configuration>
EOFcat >/opt/hadoop/etc/hadoop/mapred-site.xml <<'EOF'
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
EOF/opt/hadoop/bin/hdfs namenode -format -force
/opt/hadoop/sbin/hadoop-daemon.sh start namenode
/opt/hadoop/sbin/hadoop-daemon.sh start datanode
/opt/hadoop/sbin/yarn-daemon.sh start resourcemanager
/opt/hadoop/sbin/yarn-daemon.sh start nodemanager# 驗證:能不能在 HDFS 操作目錄;能否打開 Web UI
/opt/hadoop/bin/hdfs dfs -mkdir -p /tmp && /opt/hadoop/bin/hdfs dfs -ls /
# NameNode UI: http://localhost:9870
# YARN UI: http://localhost:8088
變成三節點怎么做:把 fs.defaultFS
寫成 hdfs://node1:9000
,在 node1 寫 workers
列出三臺主機;再用 start-dfs.sh
/start-yarn.sh
(需要 SSH 免密)。
HBase(先用 Standalone,最快上手)
做什么:下載→簡單配置→啟動→用 shell 驗證。
cd /opt
wget -q https://archive.apache.org/dist/hbase/2.4.17/hbase-2.4.17-bin.tar.gz
tar -xzf hbase-2.4.17-bin.tar.gz && mv hbase-2.4.17 hbase
cat >/opt/hbase/conf/hbase-site.xml <<'EOF'
<configuration><property><name>hbase.cluster.distributed</name><value>false</value></property>
</configuration>
EOF/opt/hbase/bin/start-hbase.sh
echo "status" | /opt/hbase/bin/hbase shell
# 試寫一行
echo "create 't1','cf'; put 't1','r1','cf:c1','v'; scan 't1'" | /opt/hbase/bin/hbase shell
變成分布式怎么做:先跑好 HDFS + ZooKeeper,把 hbase-site.xml
改為:
ini復制編輯hbase.rootdir = hdfs://node1:9000/hbase
hbase.cluster.distributed = true
hbase.zookeeper.quorum = node1,node2,node3
然后 start-hbase.sh
。
Spark(Standalone)
做什么:下載→啟動 master+worker→跑官方示例。
cd /opt
wget -q https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz
tar -xzf spark-3.5.1-bin-hadoop3.tgz && mv spark-3.5.1-bin-hadoop3 spark/opt/spark/sbin/start-master.sh
/opt/spark/sbin/start-worker.sh spark://localhost:7077/opt/spark/bin/spark-submit --master spark://localhost:7077 \--class org.apache.spark.examples.SparkPi \/opt/spark/examples/jars/spark-examples_2.12-3.5.1.jar 100
# Master UI: http://localhost:8080
變成三節點怎么做:在 node1 的 /opt/spark/conf/slaves
寫上 node2
、node3
,三臺都裝好后在 node1 執行 start-master.sh
+ start-slaves.sh
。
Flink(Standalone)
做什么:下載→配置 masters/workers→啟動→跑示例。
cd /opt
wget -q https://archive.apache.org/dist/flink/flink-1.17.2/flink-1.17.2-bin-scala_2.12.tgz
tar -xzf flink-1.17.2-bin-scala_2.12.tgz && mv flink-1.17.2 flinkecho "localhost:8081" > /opt/flink/conf/masters
echo "localhost" > /opt/flink/conf/workers/opt/flink/bin/start-cluster.sh
/opt/flink/bin/flink run /opt/flink/examples/batch/WordCount.jar \--input /opt/flink/README.txt --output /tmp/wc.out
# Dashboard: http://localhost:8081
變成三節點怎么做:在 masters
寫 node1:8081
,在 workers
寫 node2
、node3
,三臺都裝好后在 node1 執行 start-cluster.sh
。
常見坑與秒級排查
- 端口不通:
ss -lntp | egrep '2181|9092|9870|8088|16010|7077|8080|8081'
看監聽;放行防火墻。 - Kafka 外網/跨機連不上:
advertised.listeners
要寫別人能訪問到的 IP/域名。 - Hadoop 報 JAVA_HOME:確認已寫入
hadoop-env.sh
。 - HBase 分布式連不上:確認 HDFS、ZK 正常,
hbase.rootdir
、quorum
寫對。