使用pdsh在集群执行命令(hadoop适用)

本文介绍如何使用pdsh工具批量在集群节点执行命令,包括安装、验证安装、集群实践以及常见FAQ。重点展示了如何通过pdsh与ssh结合实现Hadoop集群的批量启动和关闭操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速了解

这个小工具作用就是批量在集群节点执行命令,比如我想在 node_1至node_9上执行hostname命令:

 

 

/usr/bin/pdsh -R ssh -w node_[1-9] hostname

 

  • -R:指定传输方式,默认为rsh,本例为ssh,如果希望ssh传输需要另行安装pdsh-rcmd-ssh,如果希望ssh无密码访问需要提前配置好。
  • -w:指定待执行命令host,也可以这样配置,node_[1-9, 35,22]
  • command:本例为hostname

 

安装

 

 

# 官方tarball方式:
http://sourceforge.net/projects/pdsh/
wget http://cdnetworks-kr-2.dl.sourceforge.net/project/pdsh/pdsh/pdsh-2.26/pdsh-2.26.tar.bz2
tar -jxf pdsh-2.26.tar.bz2 && cd pdsh-2.26
./configure --with-ssh --without-rsh && make && make install

#yum安装(32位机器我没有找到源,64为机器可以使用rpmforce的源)
yum install pdsh 

 

验证安装:

 

pdsh -V

 如果rcmd modules的值中有ssh说明安装成功了。

 

hadoop集群上的实践

CDH3已经不推荐使用start-all.sh, stop-all.sh管理集群,而是推荐使用script(/etc/init.d/hadoop-0.20-*)方式独立运行集群,这样做的好处是可以把hadoop分为hdfs和mapred两种用户,更好管理权限,但是直到CDH3u1都没有支持批量方式启动、关闭jobtracker和datanode,so,我们可以用pdsh + ssh + shell 实现这个start-all.sh和stop-all.sh的功能,附上我写的脚本,把它放到PATH里,就可以方便使用了:

 

 

sudo /etc/init.d/hadoop-0.20-namenode start
sudo /etc/init.d/hadoop-0.20-jobtracker start
/usr/bin/pdsh -R ssh -w CHN-DG-3-5I[3,4,8,9] "sudo /etc/init.d/hadoop-0.20-datanode start"
/usr/bin/pdsh -R ssh -w CHN-DG-3-5I[3,4,8,9] "sudo /etc/init.d/hadoop-0.20-tasktracker start"

 

FAQ:

Q:使用pdsh执行集群命令有些集群出现错误:“sudo: sorry, you must have a tty to run sudo”

A:找到问题集群,切换大root用户,执行“visudo”,注释掉“Defaults    requiretty”

 

Q: 执行 pdsh -R ssh ...时候报错:“ssh Bad configuration option: ConnectTimeout”,但执行ssh命令是可以的。

A:安装最新版本openssh吧

 

参考:

http://bbs.chinaunix.net/thread-2002080-1-1.html

 

<think>好的,我现在需要帮助用户解决如何配置高可用Hadoop集群以及在运行stop-dfs.sh时遇到的PID文件缺失问题。用户还提供了之前的引用内容,我需要综合这些信息来给出详细的解答。 首先,用户提到了高可用(HA)集群的配置教程。根据引用[3],PID文件默认存储在/tmp目录下,但该目录会被系统清理,导致PID文件丢失,这可能与用户遇到的stop-dfs.sh问题相关。因此,在配置HA时,需要特别注意PID文件的存储位置,避免使用临时目录。 接下来,用户的问题还涉及stop-dfs.sh脚本运行时出现的PID文件缺失警告。根据之前的回答和引用[1]、[3],PID文件丢失可能是因为进程未正常生成PID文件,或者/tmp目录被清理,或者配置不一致。需要确保所有节点的HADOOP_PID_DIR配置正确,并且目录权限合适。 用户提供的引用[2]提到了Hadoopshell命令和格式化集群的方法,但当前问题主要涉及HA配置和PID问题,所以可能需要较少关注这部分,除非在配置过程中需要用到这些命令。引用[4]展示了如何同步配置文件到多个节点,这在HA配置中确实很重要,特别是在多节点环境中保持配置一致性。 现在需要将高可用配置步骤和PID问题解决方案结合起来。高可用配置通常涉及JournalNode、ZooKeeper和ZKFC等组件,这些组件的PID文件也可能存在同样的问题,所以需要统一配置HADOOP_PID_DIR。 需要分步骤说明HA集群的配置,包括修改配置文件如hdfs-site.xml和core-site.xml,配置JournalNodes,设置ZooKeeper,以及配置故障转移控制器。同时,在每个步骤中强调PID目录的设置,避免使用/tmp,并确保所有节点配置一致,如引用[4]中的方法同步配置文件。 在解决PID文件缺失问题时,需要检查HADOOP_PID_DIR的配置,确保目录存在且权限正确,手动清理残留PID,以及优雅地停止和启动服务。可能还需要指导用户如何检查日志,如引用[1]中提到的日志路径,以诊断问题。 最后,生成的相关问题需要围绕HA配置和PID问题,例如如何验证HA是否正常工作,如何同步配置文件,如何处理启动失败的情况等。这些问题可以帮助用户进一步理解和排查可能遇到的问题。 需要确保回答结构清晰,步骤详细,并且参考之前的引用内容,特别是关于PID目录配置和权限管理的地方。同时,保持语言口语化,避免使用Markdown格式,但按照用户的要求,使用中文回答,并遵循系统级指令中的格式要求,如数学表达式的格式和引用标识。</think>### **高可用Hadoop集群配置与stop-dfs.sh PID文件问题解决方案** --- #### **一、高可用(HA)Hadoop集群配置步骤** **1. 核心组件与架构** 高可用集群需包含以下组件: - **双NameNode**(Active/Standby) - **JournalNode集群**(至少3节点,存储EditLog) - **ZooKeeper集群**(实现自动故障转移) - **ZKFC**(ZooKeeper Failover Controller) **2. 配置文件修改** **步骤1:配置`hdfs-site.xml`** ```xml <!-- 启用HA --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 定义NameNode ID --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- JournalNode地址 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/data/hadoop/journalnode</value> <!-- 需预先创建目录并赋权[^3] --> </property> <!-- 故障转移代理 --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> ``` **步骤2:配置`core-site.xml`** ```xml <!-- ZooKeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <!-- 统一命名空间 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> <!-- 替代单NameNode的IP:Port --> </property> ``` **步骤3:配置JournalNode启动** 在所有JournalNode节点执行: ```bash hadoop-daemon.sh start journalnode # 确保日志无JAVA_HOME错误[^1] ``` **步骤4:初始化HA状态** 在**Active NameNode**上执行: ```bash hdfs namenode -format hdfs zkfc -formatZK # 初始化ZooKeeper数据 ``` **步骤5:同步配置文件** 使用引用[4]方法批量同步配置: ```bash for ip in {node1,node2,node3}; do scp /usr/local/hadoop/etc/hadoop/*.xml $ip:/usr/local/hadoop/etc/hadoop/ done ``` --- #### **二、stop-dfs.sh PID文件缺失问题解决** **1. 根本原因** - **PID目录配置问题**:默认使用`/tmp`目录存储PID文件(易被系统清理)[^3] - **权限不一致**:启动用户与停止用户权限不同(如root vs普通用户) - **进程异常终止**:直接`kill -9`导致未清理PID文件 **2. 解决方案** **步骤1:统一PID存储路径** 在所有节点的`hadoop-env.sh`中修改: ```bash export HADOOP_PID_DIR=/usr/local/hadoop/pids # 创建目录并赋权[^3] chmod 755 /usr/local/hadoop/pids ``` **验证配置一致性**: ```bash pdsh -w node[1-3] "grep HADOOP_PID_DIR /usr/local/hadoop/etc/hadoop/hadoop-env.sh" ``` **步骤2:清理残留进程与PID文件** ```bash # 在所有节点执行 pkill -9 -f "NameNode|DataNode|JournalNode|ZKFC" rm -rf $HADOOP_PID_DIR/*.pid ``` **步骤3:优雅重启服务** ```bash start-dfs.sh # 观察PID文件生成情况 stop-dfs.sh # 验证是否正常终止 ``` **步骤4:日志分析** 检查NameNode日志(路径参考引用[1]): ```bash tail -f $HADOOP_PREFIX/logs/hadoop-*-namenode-*.log # 搜索关键字"PidFile"或"PID" ``` --- #### **三、关键注意事项** 1. **PID目录权限**: ```bash chown -R hadoop:hadoop $HADOOP_PID_DIR # 用户需与启动用户一致[^3] ``` 2. **ZooKeeper健康检查**: ```bash echo stat | nc node1 2181 # 验证ZooKeeper状态 ``` 3. **HA验证命令**: ```bash hdfs haadmin -getServiceState nn1 # 查看NameNode状态(Active/Standby) ``` --- ### **相关问题** 1. 如何通过ZooKeeper监控Hadoop HA集群的状态? 2. JournalNode数据损坏时如何恢复HDFS高可用性? 3. Hadoop集群中如何实现动态节点扩展时的配置同步? 4. 使用`kill -9`强制终止Hadoop进程会导致哪些数据一致性问题? --- [^1]: 需检查JAVA_HOME配置与日志路径 [^3]: PID目录需避免使用临时路径 [^4]: 多节点配置同步是HA集群稳定的关键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值