这个小工具作用就是批量在集群节点执行命令,比如我想在 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
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"
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吧