在 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" ]; then
echo "用法: $0 [文件|目录]"
echo "示例: $0 core-site.xml"
echo " $0 etc/hadoop/"
exit 1
fi
# 获取要同步的源路径
SRC_PATH="$SRC_DIR/$1"
# 检查源文件/目录是否存在
if [ ! -e "$SRC_PATH" ]; then
echo "错误: $SRC_PATH 不存在!"
exit 1
fi
# 读取从节点列表并同步
echo "开始同步到以下节点:"
cat "$SLAVES_FILE"
echo "------------------------"
while read -r slave; do
echo "正在同步到 $slave..."
# 使用 rsync 同步文件,保留权限和时间戳
rsync -avz --delete "$SRC_PATH" "$slave:$SRC_DIR/"
if [ $? -eq 0 ]; then
echo "✓ $slave 同步完成"
else
echo "✗ $slave 同步失败"
fi
echo "------------------------"
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"; then
echo "⚠️ 无法连接到 $slave,跳过..."
continue
fi