在 Hadoop 集群環境中,確保各節點配置文件一致至關重要。以下是使用?rsync
?結合 SSH?實現集群文件同步的腳本方案,支持批量同步文件到所有節點:
1. 前提條件
- 所有節點已配置?SSH 免密登錄
- 主節點(NameNode)能通過主機名或 IP 訪問從節點
- 安裝?
rsync
(大多數 Linux 系統已預裝)
2. 集群節點配置
創建節點列表文件(如?/opt/hadoop/etc/hadoop/slaves
),每行包含一個從節點的主機名或 IP:
plaintext
slave1
slave2
slave3
3. 同步腳本實現
創建?sync_hadoop.sh
?腳本,用于將主節點的 Hadoop 配置同步到所有從節點:
bash
#!/bin/bash# Hadoop 同步腳本 - 將主節點配置同步到所有從節點
HADOOP_HOME="/opt/hadoop" # Hadoop 安裝目錄
SLAVES_FILE="$HADOOP_HOME/etc/hadoop/slaves" # 從節點列表文件
SRC_DIR="$HADOOP_HOME/etc/hadoop" # 源目錄(主節點配置)# 檢查是否提供參數
if [ -z "$1" ]; thenecho "用法: $0 [文件|目錄]"echo "示例: $0 core-site.xml"echo " $0 etc/hadoop/"exit 1
fi# 獲取要同步的源路徑
SRC_PATH="$SRC_DIR/$1"# 檢查源文件/目錄是否存在
if [ ! -e "$SRC_PATH" ]; thenecho "錯誤: $SRC_PATH 不存在!"exit 1
fi# 讀取從節點列表并同步
echo "開始同步到以下節點:"
cat "$SLAVES_FILE"
echo "------------------------"while read -r slave; doecho "正在同步到 $slave..."# 使用 rsync 同步文件,保留權限和時間戳rsync -avz --delete "$SRC_PATH" "$slave:$SRC_DIR/"if [ $? -eq 0 ]; thenecho "? $slave 同步完成"elseecho "? $slave 同步失敗"fiecho "------------------------"
done < "$SLAVES_FILE"echo "全部同步完成!"
4. 使用方法
-
同步單個文件(如?
core-site.xml
):bash
/opt/hadoop/bin/sync_hadoop.sh core-site.xml
-
同步整個目錄(如?
etc/hadoop/
):bash
/opt/hadoop/bin/sync_hadoop.sh etc/hadoop/
-
同步后重啟 Hadoop 服務:
bash
# 在主節點執行 stop-all.sh start-all.sh
5. 腳本優化建議
并行同步(提升效率)
修改腳本中的?rsync
?命令,使用?&
?符號讓每個節點的同步并行執行:
bash
# 并行版本(不等待前一個節點完成)
rsync -avz --delete "$SRC_PATH" "$slave:$SRC_DIR/" &
日志記錄
添加日志文件記錄每次同步操作:
bash
LOG_FILE="/var/log/hadoop_sync.log"
echo "$(date): 同步 $1 到 $slave" >> "$LOG_FILE"
錯誤處理
增加節點連通性檢查:
bash
# 檢查 SSH 連接
if ! ssh "$slave" "exit"; thenecho "?? 無法連接到 $slave,跳過..."continue
fi