Hadoop集群配置文件分发工具config-dispatcher.sh .

转自:http://blog.youkuaiyun.com/rzhzhz/article/details/7056775

 

此工具(config-dispatcher.sh)用于分发Hadoop集群的配置文件,可省去一个一个替换的麻烦,希望能给大家带来便利!
注:另外Hadoop集群文件分发工具(file-dispatcher.sh)见http://blog.youkuaiyun.com/rzhzhz/article/details/7056761
脚本如下:
 
#!/usr/bin/env bash
#此工具为Hadoop配置文件(conf目录下)分发工具
#把本地(namenode)配置文件分发到指定机器(datanode)
#前提是指定机器(datanode)的目录结构必须与本地(namenode)目录一致

# Environment Variables
#
#   HADOOP_SLAVES    File naming remote hosts.
#     Default is ${HADOOP_CONF_DIR}/slaves.
#   HADOOP_CONF_DIR  Alternate conf dir. Default is ${HADOOP_HOME}/conf.
#   HADOOP_SLAVE_SLEEP Seconds to sleep between spawning remote commands.
#   HADOOP_SSH_OPTS Options passed to ssh when running remote commands.
#   FILE_PATH 分发文件列表文件 默认为 ${HADOOP_CONF_DIR}/configs,配置的文件名必须为${HADOOP_CONF_DIR}目录下的文件名
#  
##
usage="Usage: config-dispatcher.sh [--files <filelist>]"

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`
. "$bin"/hadoop-config.sh
# get arguments
FILE_PATH=""
if [ $# -eq 2 ] && [ $1 = "--files" ] ;then
    echo $2
    FILE_PATH=$2;
elif [ $# -eq 0 ] ;then
    FILE_PATH="${HADOOP_CONF_DIR}/configs";
else
  echo $usage
  exit 1;
fi
# If the slaves file is specified in the command line,
# then it takes precedence over the definition in
# hadoop-env.sh. Save it here.
HOSTLIST=$HADOOP_SLAVES
if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then
  . "${HADOOP_CONF_DIR}/hadoop-env.sh"
fi
echo "加载待分发的机器列表..."
if [ "$HOSTLIST" = "" ]; then
  if [ "$HADOOP_SLAVES" = "" ]; then
    export HOSTLIST="${HADOOP_CONF_DIR}/slaves"
  else
    export HOSTLIST="${HADOOP_SLAVES}"
  fi
fi
if [ "$HOSTLIST" = "" ];then
  echo "请配置待分发的机器..."
  exit 0;
else
   echo "待分发的机器如下:"  
   for hostname in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`;
   do
 echo $hostname
   done
fi

echo "从$FILE_PATH文件加载待分发的配置文件名..."
export CONFIGLIST="$FILE_PATH"
echo "待分发配置文件如下:"
   for configname in `cat "$CONFIGLIST"|sed  "s/#.*$//;/^$/d"`;
   do
 echo $configname
   done

#开始分发
for configname in `cat "$CONFIGLIST"|sed  "s/#.*$//;/^$/d"`;
   do
 for hostname in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`;
       do
  echo "分发 ${HADOOP_CONF_DIR}/$configname 至 $hostname:${HADOOP_CONF_DIR} "
                scp ${HADOOP_CONF_DIR}/$configname $hostname:${HADOOP_CONF_DIR}
       done
   done
 
wait
 
大家可拷贝文件内容至config-dispatcher.sh (自己新建)文件并置于hadoop/bin目录下,在指定的文件下(默认为hadoop/conf/configs)配置要分发的配置文件名,然后就可以直接像启动hadoop集群一样启用此工具了,具体用法可参考代码或hadoop/bin/config-dispatcher.sh --h获得帮助
 
<think>嗯,用户遇到了Hadoop启动时hdfs-config.sh不可执行的问题。我需要先理解这个错误的原因。根据引用[5]中的情况,用户可能长时间未使用集群,导致权限或配置发生了变化。首先,hdfs-config.sh这个脚本需要可执行权限,如果权限不正确,就会出现无法执行的错误。那解决方法应该是检查并修改文件权限,比如用chmod命令加上执行权限。 另外,用户提到使用的是Hadoop 3.3.0,可能和引用中的3.3.1或3.1.3版本有差异,但基本处理方式应该类似。需要确认脚本所在的路径是否正确,比如在Hadoop安装目录的sbin下。还要检查环境变量是否配置正确,确保Hadoop的bin和sbin目录在PATH中,这样启动脚本时才能正确找到相关文件。 另外,用户可能没有正确格式化NameNode,尤其是在长时间未启动集群的情况下,可能需要重新格式化,但要注意格式化会清除数据。所以需要提醒用户谨慎操作,并备份数据。此外,防火墙或SELinux设置也可能影响脚本的执行,需要检查这些安全设置是否阻止了脚本运行。 还有,查看日志文件是关键,比如检查hadoop-root-namenode-*.log,里面可能有更详细的错误信息,帮助进一步诊断问题。最后,可能需要检查Hadoop配置文件,如hdfs-site.xml和core-site.xml,确保配置参数正确,特别是端口号和路径设置。</think>### 解决Hadoop启动时`hdfs-config.sh`不可执行的问题 #### 问题分析 当启动Hadoop集群时遇到`hdfs-config.sh cannot execute`错误,通常与文件权限、路径配置或脚本兼容性相关。结合引用内容,可能的原因包括: 1. **权限不足**:`hdfs-config.sh`文件未赋予可执行权限[^3][^4]。 2. **环境变量未配置**:Hadoop的`sbin`目录未添加到系统`PATH`中[^1][^4]。 3. **脚本路径错误**:Hadoop安装目录配置错误,导致无法找到脚本[^3][^5]。 4. **文件系统损坏**:长期未使用集群,导致配置文件或脚本状态异常。 --- #### 解决方案步骤 1. **检查文件权限** - 进入Hadoop安装目录的`sbin`子目录: ```bash cd /opt/module/hadoop-3.3.0/sbin ``` - 赋予`hdfs-config.sh`可执行权限: ```bash chmod +x hdfs-config.sh ``` - 同时检查其他关键脚本(如`start-dfs.sh`、`stop-dfs.sh`)的权限,确保均为可执行。 2. **验证环境变量** - 编辑`~/.bashrc`或`/etc/profile`,添加以下内容: ```bash export HADOOP_HOME=/opt/module/hadoop-3.3.0 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ``` - 使配置生效: ```bash source ~/.bashrc ``` 3. **检查Hadoop安装完整性** - 确认Hadoop解压后的目录结构包含完整的`sbin`子目录(参考引用[3]中的解压目录示例)。 - 如果安装包损坏,重新下载并解压Hadoop 3.3.0: ```bash wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz tar -zxvf hadoop-3.3.0.tar.gz ``` 4. **格式化NameNode(谨慎操作)** - 若长期未使用集群,可能需要重新格式化(注意:会清除HDFS数据): ```bash hdfs namenode -format ``` - 之后重新启动集群: ```bash start-dfs.sh && start-yarn.sh ``` 5. **检查防火墙/SELinux** - 关闭防火墙(临时): ```bash systemctl stop firewalld ``` - 禁用SELinux: ```bash setenforce 0 ``` 6. **查看日志定位问题** - 检查Hadoop日志文件(通常在`$HADOOP_HOME/logs/`目录): ```bash tail -100f hadoop-root-namenode-*.log ``` --- #### 注意事项 - 格式化NameNode会清除HDFS所有数据,操作前需确认数据已备份或无价值[^5]。 - 若使用非root用户操作,需确保用户对Hadoop目录有完整权限[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值