一、 su命令
建议不要使用root账户直接登录系统,主要考虑的是系统安全问题。通常的做法是使用su命令切换到root账户,完成需要的工作。如果su命令没有任何参数,默认登录的就是root账户,输入密码后会启动一个root用户的进程。su可以使一般用户拥有超级用户或其他用户的权限,也可以使超级用户以一般用户的身分执行命令。但一般用户使用该命令时必须输入root用户或其他用户的口令。执行exit命令退出当前用户的登陆。
执行su命令切换到root用户的PATH环境变量值:
[[email protected] yarn]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bin |
执行su–命令切换到root用户的PATH环境变量值:
[[email protected] ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin |
1.1 su命令的常用方法
使用su命令切换用户主要有两种方式,这两种方式略有不同,命令格式如下:
下面这种方式切换用户后,环境变量不是全部改变,如LOGNAME,登录用户名称,所以不是正真意义上的登录。
su su root su yarn |
下面的方式会发生正真的登录,环境变量全部会更新。
su - su -l su --login su - root su - yarn su -l yarn |
对于su命令,常用的方式是切换用户执行某个命令,当命令执行结束后立即返回当前用户,通常是root用户切换到其他普通用户,使用普通用户的权限执行命令,当命令执行结束后立即返回当前root用户,原因是root用户转换成普通用户不需要输入普通用户的密码,常在脚本中使用,如下命令格式:
su - yarn -c "cd /home/yarn ; cp /mnt/hgfs/share/jdk*.gz /home/yarn" |
参数-c后面跟着命令,注意:命令要使用双引号。
二、 sudo命令
在普通用户没有权限执行某个命令时,通常的做法是使用su命令,切换到root权限完成
操作,但是这样存在的问题是,当多个用户都使用root权限时,存在系统安全问题,很难确定某个用户的具体操作。另外,在编写脚本时,如果遇到普通用户不具备的权限时,就需要使用root用户的权限,在这种情况下,通过su命令输入密码的方式就无法实现了。对于上面两个问题的解决办法是使用sudo命令。
2.1 sudo的特点
sudo命令可以使用root用户或者其他用户的身份执行命令,但是需要在/etc/sudoers文件中进行配置,此文件只有root用户有权限进行编辑,如果没有在/etc/sudoers文件中配置,在使用sudo命令时会提示警告信息,另外要输入使用sudo命令的用户的密码。
[[email protected] ~]$ sudo mkdir /usr/local/syslog We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for yarn: yarn 不在 sudoers 文件中。此事将被报告。 [[email protected] ~]$ |
配置sudo命令的使用权限必须编辑/etc/sudoers文件,此文件只有root用户才可以修改,并且建议使用visudo命令进行编辑。为什么要使用visudo命令进行编辑有两个原因,一是防止两个有root权限的用户同时修改。二是语法检查。所以建议用visudo命令来编辑/etc/sudoers文件。
root用户使用visudo命令打开/etc/sudoers文件:
… ## Allow root to run any commands anywhere root ALL=(ALL) ALL … |
可以看到root用户拥有所有的权限,只有将使用sudo命令的用户添加到下面就可以了,如将yarn用户添加到配置文件中。
… ## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn ALL=(ALL) ALL … |
配置完成后,保存退出,yarn用户就有了使用sudo命令执行所有命令的权限。
[[email protected] ~]$ sudo mkdir /usr/local/syslog [sudo] password for yarn: [[email protected] ~]$ cd /usr/local [[email protected] local]$ ls bin games lib man sbin src vmware-tools-distrib etc include libexec pdsh-2.26 share syslog |
当然,可以通过配置文件/etc/suduers限制用户执行sudo命令的权限,如有通过sudo执行某些命令的权限,而不是所有命令的权限,如下设置:用户yarn只能在NameNode主机上执行mkdir命令和touch命令。
在/etc/sudoers文件只设置创建目录和创建文件的权限:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=/bin/mkdir,/bin/touch |
下面测试用户yarn使用sudo命令的权限:
[[email protected] local]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: [[email protected] local]$ ls bin games libexec pdsh-2.26 share syslogs etc include lib man sbin src vmware-tools-distrib [[email protected] local]$ sudo touch /usr/local/syslogs/syslog.log [[email protected] local]$ cd /usr/local/syslogs [[email protected] syslogs]$ ls syslog.log [[email protected] syslogs]$ sudo rm -f syslog.log 对不起,用户 yarn 无权以 root 的身份在 NameNode 上执行 /bin/rm -f syslog.log。 |
对sudo命令配置说明,第一列是使用sudo命令的用户名称,如果不在此文件中配置就没有使用sudo命令的权限。第二列是用户有权使用sudo命令的主机名称,如果是ALL,说明在所有的主机上都可以使用sudo命令,也可以指定特定的主机,如果要指定多个主机,需要使用逗号分隔。第三列小括号中的ALL代表可以以所有用户的身份执行命令,也可以指定特定的用户,如果是多个用户可以使用逗号分隔。第四列是有权使用sudo命令执行的命令,要使用命令的全路径,如果不使用全路径存在安全问题,因为有同名的脚本,使用root权限执行某个同名的脚本,对系统存在安全隐患。如果是ALL有权执行所有的命令,也可以指定特定的命令,如果是多个命令要使用逗号分隔。
root ALL=(ALL) ALL yarn NameNode,DataNode1=(hadoop) /bin/mkdir,/bin/touch |
如果就一台服务器单一的主机,只要配置主机上的/etc/sudoers文件就可以了,如果是集群,就需要在每个主机上对/etc/sudoers文件进行配置,在特定的主机上用户可以通过sudo命令执行特定的命令。如果在所有的主机上用户的权限都相同,只需要在一台主机上进行配置,然后将此文件拷贝到其他主机上就可以了,可以使用pscp命令,后面的内容会涉及到。
将NameNode主机上配置好的/etc/sudoers文件拷贝到DataNode1主机上。
[[email protected] ~]# pdcp -w DataNode1 "/etc/sudoers" "/etc/sudoers" |
另外,sudo命令不可以使用ssh命令直接远程执行,ssh命令后面的内容会说明,这里只是简单的介绍。要先使用ssh命令远程到要执行sudo命令的主机上,然后在执行sudo命令,如下例子。
[[email protected] ~]$ ssh DataNode1 "sudo mkdir /usr/local/syslogs" sudo:抱歉,您必须拥有一个终端来执行 sudo [[email protected] ~]$ ssh DataNode1 Last login: Thu Oct 27 11:10:40 2016 from 192.168.230.153 [[email protected]DataNode1 ~]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: [[email protected] ~]$ |
下面的例子是用户yarn使用hadoop用户的身份执行命令,注意:在执行sudo命令是要使用参数-u来指定使用的用户名称。
下面的配置是用户yarn在NameNode主机上可以使用hadoop用户的身份执行指定的命令。
root ALL=(ALL) ALL yarn NameNode=(hadoop) /bin/mkdir,/bin/touch |
修改配置文件后,yarn用户只能使用hadoop用户的身份执行后面设置的命令,下面执行命令:
[[email protected] local]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: 对不起,用户 yarn 无权以 root 的身份在 NameNode 上执行 /bin/mkdir /usr/local/syslogs。 |
当执行命令时,系统提示警告信息,所以要使用参数-u来执行执行命令的用户身份,如下方式,但是需要注意的是执行命令创建文件的权限还要受到hadoop用户的权限限制:
[[email protected] local]$ sudo -u hadoop mkdir /home/hadoop/data [[email protected] local]$ cd /home/hadoop -bash: cd: /home/hadoop: 权限不够 [[email protected] local]$ su hadoop 密码: [[email protected] local]$ cd /home/hadoop [[email protected] ~]$ ls data [[email protected] ~]$ |
需要注意的是每次执行sudo命令都要使用参数-u来指定用户身份,默认情况下指定的是root用户的身份。可以在/etc/sudoers配置文件中进行默认身份用户设定,设定完成后执行sudo命令时就不需要使用参数-u了,如下设置:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(hadoop) /bin/mkdir,/bin/touch Defaults:yarn runas_default=hadoop |
[[email protected] local]$ sudo mkdir /home/hadoop/dir [sudo] password for yarn: [[email protected] local]$ su hadoop 密码: [[email protected] local]$ cd [[email protected] ~]$ ll 总用量 8 drwxr-xr-x. 2 hadoop hadoop 4096 10月 27 12:08 data drwxr-xr-x. 2 hadoop hadoop 4096 10月 27 12:15 dir |
在上面的例子中,每次执行sudo命令都需要输入执行sudo命令的用户的密码,这很不方便,如在脚本中使用某个用户的身份执行命令时就无法输入密码,可以进行配置在执行sudo命令时不需要输入用户密码,需要在配置文件中添加NOPASSWD关键字,如下配置:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(root) NOPASSWD: /bin/mkdir,/bin/touch |
上面的配置是yarn用户可以在NameNode主机上使用root用户的身份执行两个命令,但是不需要输入执行sudo命令的用户yarn的密码,如下测试。
[[email protected] ~]$ sudo mkdir /usr/local/syslogs [[email protected] ~]$ cd /usr/local [[email protected] local]$ ls bin games libexec pdsh-2.26 share syslogs etc include lib man sbin src vmware-tools-distrib |
需要注意的是,使用visudo命令对/etc/sudoers文件进行配置时,如果语法错误保存退出时会有提示信息到控制台,如下信息:
visudo:>>> /etc/sudoers:syntax error 在行 99 附近<<< 现在做什么? |
键入e是重新编辑/etc/sudoers文件,键入x是不保存退出,键入Q是保存并退出。如果语法错误没有修改保存并退出,那么sudo将不会再运行,直到错误被纠正。
通常情况下用户执行sudo命令要记录日志,用于检查某个用户执行了什么命令在哪台主机上等信息。但是sudo命令的日志记录不是自动创建的,需要root用户配置并启动。
使用root用户权限在/etc/sudoers文件中进行配置,如下:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(root) NOPASSWD: /bin/mkdir,/bin/touch ##配置sudo命令默认日志文件 Defaults logfile=/var/log/sudo |
测试日志文件记录的sudo命令的执行信息:
[[email protected] local]$ sudo mkdir /usr/local/syslogs mkdir: 无法创建目录"/usr/local/syslogs": 文件已存在 [[email protected] local]$ sudo mkdir /usr/local/syslog ... [[email protected] log]# cat sudo Oct 27 14:22:33 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ; COMMAND=/bin/mkdir /usr/local/syslogs Oct 27 14:22:48 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ; COMMAND=/bin/mkdir /usr/local/syslog |
配置sudo日志文件后,普通用户执行的sudo命令都会记录日志,root用户可以查看日志文件,知道那个用户执行了什么命令,主要是为了系统安全。日志文件只有root有查看权限。
三、 SSH免认证登录
SSH(secureshell),是一个系统管理工具,能够让用户访问远程计算机上的Shell进程,并且可以执行各种命令,SSH使用加密通道来传输网络数据,使用加密技术确认访问用户的身份,并且可以将主机间的通信加密,可以有效防止陌生主机的网络攻击。
单机模式下是没有Hadoop守护进程,所以不需要配置SSH。在伪分布式和完全分布式情况下必须启动Hadoop守护进程,然而启动Hadoop守护进程的前提是已经成功安装了SSH。Hadoop运行过程中需要登录启动远程节点上的Hadoop守护进程,也就是说NameNode是通过SSH来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候无需输入密码,因此需要安装配置SSH,这样NameNode使用SSH无密码登录并启动其它节点上的DataNode进程。
3.1 安装SSH工具软件
首先检查系统是否已经安装下面的软件,如果没有安装,需要进行安装。
用下面的命令查看系统是否安装了SSH服务和RSYNC服务
rpm -qa | grep openssh rpm -qa | grep rsync |
rsync是远程数据同步工具,可以同步多台主机间的文件。
如果没有安装两个服务,采用下面命令安装,但是安装需要连接外网。
安装命令是:
yum install ssh yum install rsync |
3.2 NameNode无密码登录DataNode1
在Hadoop启动阶段,NameNode节点需要连接到远程所有的数据节点DataNode上来启
动数据节点的守护进程。需要在NameNode上生成一个密钥对,包括一个公钥和一个私
钥,要将公钥复制到所有的DataNode节点上。当NameNode通过SSH服务连接DataNode
时,DataNode就会生成一个随机数并用NameNode的公钥对随机数进行加密,并发送给
NameNode。NameNode收到加密后的字符串后再用私钥解密,并将解密后的字符串回传
给DataNode,DataNode确认无误之后就允许NameNode进行连接了。这就是一个公钥
认证过程,不需要用户手工输入密码。
3.2.1 在NameNode上生成密码对
Linux系统上哪个用户配置SSH无密码登录,其他用户是不能共享的,所以,如果需要多个用户都实现SSH无密码登录远程机器,那么这些用户都有生成密码对并且进行配置。在我们的例子中,root用户需要远程复制安装软件,将多台机器同步安装配置软件,所以root用户需要配置SSH无密码登录认证,而启动Hadoop服务需要使用yarn用户,所以yarn用户也需要进行配置SSH无密码登录认证。
集群中所有的节点目录结构必须相同,具有相同的用户。注意:使用yarn用户和root用户分别生成密码对,命令如下:
ssh-keygen -t rsa ssh-keygen -t rsa -f ~/.ssh/id_rsa |
注意:在生成密码对的过程中,问是否设置密码和文件生成目录,直接回车,不设置密码。使用root用户和yarn用户将生成的密码公钥复制到要远程登录的DataNode上,文件目录默认。命令如下:
ssh-copy-id -i /root/.ssh/id_rsa.pub DataNode1 ssh-copy-id -i /home/yarn/.ssh/id_rsa.pub DataNode1 ssh-copy-id -i /root/.ssh/id_rsa.pub localhost ssh-copy-id -i /home/yarn/.ssh/id_rsa.pub localhost |
注意:将生成的公钥复制到数据节点上需要对/etc/hosts文件进行配置,将所有的数据节点的ip和主机名按行进行配置,需要root用户权限,命令如下:
vi /etc/hosts … 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.230.153 NameNode 192.168.230.154 DataNode1 … |
还可以采用下面的方式,但是没有上面的方式简洁。
ssh-keygen -t rsa -f ~/.ssh/id_rsa scp ~/.ssh/id_rsa.pub [email protected]:~/ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh |
3.3 SSH远程常用方法
3.3.1 连接到远程主机
可以通过ssh命令远程到其他主机,前提是配置了SSH无密码认证,通过下面的命令直接远程到其他主机上进行命令操作。ssh命令后面可以跟IP地址或者主机名称,但是主机名称和IP的对应需要在/etc/hosts文件中进行配置。
[[email protected] local]# ssh DataNode1 Last login: Wed Oct 26 17:55:44 2016 from 192.168.230.153 [[email protected] ~]# pwd /root [[email protected] local]$ ssh DataNode1 Last login: Wed Oct 26 18:28:38 2016 from 192.168.230.1 [[email protected] ~]$ pwd /home/yarn … [[email protected] local]# ssh [email protected] Last login: Wed Oct 26 19:39:38 2016 from 192.168.230.153 [[email protected] local]# ssh [email protected] Last login: Wed Oct 26 19:49:01 2016 from 192.168.230.153 [[email protected] local]# ssh [email protected] [email protected]‘s password: |
通过ssh命令远程其他主机,一旦认证成功,将会为用户返回一个shell连接。
3.3.2 SSH服务的默认端口号
SSH服务器默认在端口22上运行。如果SSH服务器指定的是其他的端口号。可以使用-p参数进行指定端口号,如下方式。
[[email protected] local]# ssh DataNode1 -p 22 Last login: Wed Oct 26 19:49:29 2016 from 192.168.230.153 [[email protected] ~]# |
3.3.3 在当前主机执行远程命令
可以在当前主机中执行远程命令,命令格式如下:
ssh 主机名 | [email protected]主机名 | [email protected] "命令" ssh 主机名 | [email protected]主机名 | [email protected] "命令" |
如下例子:
[[email protected] local]# ssh DataNode1 "echo OK" OK [[email protected] local]# ssh DataNode1 "echo $USER" yarn [[email protected] local]# |
如果想要在远程机器上一次执行多条命令,命令要用分号分隔,注意:命令要使用双引号,如下例子:
[[email protected] local]# ssh DataNode1 "cd /home/yarn ; mkdir logs ; cd logs ; touch syslog.log" [[email protected] local]# ssh DataNode1 "cd /home/yarn ; rm -rf logs" [root[email protected] local]# |
3.3.4 在脚本中使用SSH
可以在脚本中使用ssh命令,如:在集群中所有的机器上创建日志目录,并在目录中创建日志文件,首先,我们先创建一配置文件,用来保存集群中所有的主机名称或IP地址。
主机配置文件hosts,文件内容如下,注意:每个主机名称占用一行。
NameNode DataNode1 |
脚本createLogs.sh:
#!/bin/bash # 使用ssh命令为所有的主机创建日志文件 for line in `cat hosts` do echo "开始为主机:$line创建日志目录和日志文件..." ssh $line "cd /usr/local ; mkdir logs ; cd logs ; touch syslog.log" done ~ |
脚本执行会使用ssh命令远程创建目录和文件。
四、 pdsh概述
以搭建一个Hadoop集群为例,通常情况下多台机器具有有同样的配置,同样的目录结构,如:JDK的安装目录和环境变量配置文件,Hadoop的安装目录和配置文件。通过手工配置效率较低。
pdsh是一个开源的工具,可以在多个远程机器上并行执行命令,pdsh的全称是paralleldistributed shell(并行的分布式Shell)。pdsh主要用于大批量服务器的配置、部署、文件复制等操作。在使用pdsh远程操作时,需要配置本地主机和远程主机间的ssh无密码登录服务。另外,pdsh还附带了pdcp命令,此命令可以将本地文件批量复制到远程的多台主机上,在搭建集群环境时是非常有用。
pdsh可以通过多种方式在远程主机上运行命令,默认是rsh方式,另外也支持ssh、mrsh、qsh、mqsh、krb4、xcpu等多种rcmd模块,这个可以在运行命令时通过参数指定。我们指定ssh服务为远程登录服务。
4.1 pdsh安装
我们还是将pdsh工具安装到/usr/local目录下,当然也可以是其他目录,如果/opt目录等等。首先将pdsh安装包pdsh-2.26.tar.bz2从共享文件夹拷贝到/usr/local目录下,注意:拷贝安装过程必须使用root用户权限。
cd /usr/local su cp /mnt/hgfs/share/pdsh/pdsh-2.26.tar.bz2 . |
使用root权限在/usr/local目录下解压文件:
tar -jxvf pdsh-2.26.tar.bz2 |
解压完成后,生成一个目录pdsh-2.26,进入目录中,分别指向下面三条命令,注意:安装pdsh工具软件需要使用c编译器gcc,如果没有安装,pdsh不能安装成功,需要首先安装gcc编译器。
检查系统是否安装了gcc编译器:
[[email protected] ~]$ rpm -qa | grep gcc gcc-4.4.7-17.el6.i686 libgcc-4.4.7-17.el6.i686 |
如果没有安装gcc-4.4.7-17.el6.i686,要首先安装,安装过程需要外网,安装命令如下:
yum install gcc |
安装过程需要几分钟时间,直到命令行提示符出现,可以在执行上面的rpm命令检查是否安装成功。gcc安装成功后,就可以安装pdsh工具软件了,按照下面的命令顺序执行。
cd pdsh-2.26 ./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines make make install |
在执行configure脚本时,“--with-ssh”参数表示启用ssh模块,而“--with-dshgroups”表示启用主机组支持,启用此参数后,就可以将一组主机列表写入一个文件并放到~/.dsh/group或/etc/dsh/group目录下,然后通过pdsh的“-g”参数进行调用。最后的参数“--with-machines”是“--with-dshgroups”参数的扩展,通过将所有要管理的主机列表都写入指定的/etc/pdsh/machines文件中,接着通过pdsh的“-a”参数调用,最终完成所有主机的便捷管理。
检测是否安装成功,使用下面的命令。
pdsh -v |
如果显示使用信息,说明安装成功。
4.2 pdsh基本命令
4.2.1 pdsh命令
在一个集群中,从一台主机上可以通过ssh命令远程到其他主机上执行命令,如果集群机器很多,可以通过在脚本中使用ssh命令的方式执行,但是ssh命令还是有局限的,如一台机器执行结束后另一台机器才能开始执行,而pdsh命令可以并行在多台机器上同时执行相同的命令,当然pdsh底层使用的还是ssh或其他的远程方式,如rsh等等。
pdsh命令格式:
pdsh [-参数选项] 命令 |
下面将pdsh命令常用参数进行举例说明。
参数-h:显示pdsh命令的使用说明:
[[email protected] ~]$ pdsh -h Usage: pdsh [-options] command ... -S return largest of remote command return values -h output usage menu and quit -V output version information and quit -q list the option settings and quit -b disable ^C status feature (batch mode) -d enable extra debug information from ^C status -l user execute remote commands as user -t seconds set connect timeout (default is 10 sec) -u seconds set command timeout (no default) -f n use fanout of n nodes -w host,host,... set target node list on command line -x host,host,... set node exclusion list on command line -R name set rcmd module to name -M name,... select one or more misc modules to initialize first -N disable hostname: labels on output lines -L list info on all loaded modules and exit -g groupname target hosts in dsh group "groupname" -X groupname exclude hosts in dsh group "groupname" -a target all nodes available rcmd modules: ssh,exec (default: ssh) |
参数-w:指定要执行的远程主机,可以指定多个,每个主机用逗号隔开,可以是主机名也可以是IP地址。
[[email protected] ~]$ pdsh -w NameNode,DataNode1 "cd /home/yarn ; mkdir data" [[email protected] ~]$ pdsh -w 192.168.230.153,192.168.230.154 "cd /home/yarn ; mkdir data" |
通常的做法是,将主机名称配置到文件中,因为主机很多的情况下,采用上面的方式命令会很长。上面的命令方式适合对单一的远程主机进行操作。下面采用配置文件的方式实现上面命令的功能。
主机配置文件hosts:
NameNode DataNode1 |
或者采用主机IP地址的方式:
192.168.230.153 192.168.230.154 |
注意:将hosts文件放在执行pdsh命令的目录下,如:在/home/yarn目录下创建一个目录job,将hosts文件拷贝到job目录下,在job目录下执行pdsh命令。
pdsh -w ^hosts "cd /home/yarn ; mkdir data" |
查看主机上的IP和主机名称:
[[email protected] job]$ pdsh -w ^hosts "echo $HOSTNAME" 192.168.230.153: NameNode 192.168.230.154: NameNode [[email protected] job]$ |
参数-R:指定远程工具名称,pdsh默认是rsh,我们在安装pdsh时已经重新指定了ssh,当然可以使用-R参数重新指定。
pdsh -w ^hosts -R ssh "cd /home/yarn ; mkdir data" |
参数-a:通过-a参数可以指定所有的远程主机,在pdsh命令中使用此参数,pdsh默认会查看/etc/pdsh/目录下的machines文件中的主机列表,目录名称和文件名称在执行configure脚本时可以修改,通过“--with-machines”参数进行指定。
./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines |
我们就以默认情况举例,首先使用root用户权限在/etc目录下创建pdsh目录,在此目录下创建文件machines文件,文件中是主机名称,一行一个,也可以使用IP地址,保存后退出。
su cd /etc mkdir pdsh cd pdsh vi machines NameNode DataNode1 :wq |
执行pdsh命令:
[[email protected] ~]$ pdsh -a "cd /home/yarn ; touch pdsh" |
命令执行后会在两个主机上创建文件pdsh,当使用-a参数时,就不需要使用-w参数,系统会从/etc/pdsh目录下读取machines文件中的主机名称执行命令。
参数-x: 此参数和-w参数功能正好相反,用来指定不执行命令的多个或单个主机,使用方式如-w参数。
采用主机名称的方式,NameNode主机执行命令,DataNode1主机不执行命令:
[[email protected] ~]$ pdsh -w NameNode -x DataNode1 "cd /home/yarn ; touch syslogs" |
如果要是有多个主机执行命令,多个主机除外,可以采用配置文件的形式,还是上面的例子,将NameNode写入hosts1文件,DataNode1写入hosts2文件,以下面的方式执行。
[[email protected] job]$ echo NameNode > hosts1 [[email protected] job]$ echo DataNode1 > hosts2 [[email protected] job]$ cat hosts1 NameNode [[email protected] job]$ pdsh -w ^hosts1 -x ^hosts2 "cd /home/yarn ; touch file" |
4.2.2 pdcp命令
如果配置整个集群,要求所有的机器安装相同的软件,如果逐一拷贝效率较低,通常的做法是将所有要安装的软件拷贝到一台主机上,通过pdcp命令同步拷贝到其他机器上。pdcp命令格式:
pdcp [-参数] “源文件1” [源文件2...] 目标 |
下面将pdcp命令常用参数进行举例说明,参数的用法和pdsh命令大多相同。
参数-w:指定要拷贝文件的远程主机,多个主机用逗号隔开,可以是主机名也可以是IP地址。
[[email protected] ~]$ pdcp -w DataNode2 "syslogs" "/home/yarn" |
也可以将主机名称或IP写入到一个配置文件,使用方式如pdsh命令。
[[email protected] ~]$ pdcp -w ^hosts "syslogs" "/home/yarn" |
如果拷贝的是一个目录,需要加上参数-r。
[[email protected] ~]$ pdcp -w ^hosts -r "job" "/home/yarn" |
需要注意的是,pdcp命令后面是两个或多个参数,要用空格分隔,建议将参数使用双引号。
参数-x和-w正好相反,用法与pdsh命令相同。
$ pdcp -w DataNode2 -x NameNode "job/hosts1" "job/hosts2" "/home/yarn" |
参数-a的用法与pdsh命令相同,要在/etc/pdsh/machines文件中配置主机名称或IP地址,因为pdcp命令会读取此文件的主机信息。
[[email protected] ~]$ pdcp -a "sys" "/home/yarn" |
4.2.3 使用pdsh工具为集群所有的主机安装配置JDK
首先要在所有的主机上安装pdsh工具软件,如果只使用pdsh命令,其他主机不需要安装pdsh软件,但是pdcp命令需要目标主机也安装pdsh软件才能拷贝成功。下面的例子是集群安装JDK并配置环境变量。
首先将JDK安装包拷贝到NameNode主机上,因为JDK要安装在/usr/local目录下,这个目录只有root用户采用权限,所以脚本的执行者是root用户,这是通用的做法。在root用户的工作目录/root下创建一个目录job,将JDK安装包和脚本文件都放置在这个目录下,同样,主机名称配置文件也放置在这个目录下。
# yarn用户登录,然后切换成root用户 su # 进入到root用户的工作目录 cd /root # 创建job目录 mkdir job # 进入到job目录 cd job # 将JDK文件拷贝到当前目录 cp /mnt/hgfs/share/jdk*.gz . # 编辑主机配置文件 vi hosts NameNode DataNode1 :wq # 编辑执行脚本 vi install_jdk.sh |
install_jdk.sh脚本:
#!/bin/bash # 在NameNode主机上执行的脚本,将JDK安装包先拷贝到各个数据节点上的/usr/local目录下 # 然后在各节点使用tar命令安装JDK,安装完成将JDK安装包删除,然后在/etc/prfile.d目录下配置JDK环境变量 # 安装配置完成后,执行 jdk="jdk-8u51-linux-i586.tar.gz" jdkpath="/usr/local" JAVA_HOME="$jdkpath/jdk1.8.0_51" JRE_HOME="$jdkpath/jdk1.8.0_51/jre" echo "删除JDK相关软件包..." pdsh -w ^hosts "rpm -e --nodeps tzdata-java-2012j-1.el6.noarch" 2>/dev/null pdsh -w ^hosts "rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.i686" 2>/dev/null pdsh -w ^hosts "rpm -e --nodeps java-1.7.0-openjdk-1.7.0.9-2.3.4.1.el6_3.i686" 2>dev/null echo "拷贝$jdk到数据节点..." pdcp -w ^hosts $jdk $jdkpath echo "在各节点安装$jdk..." pdsh -w ^hosts "tar -xzf $jdkpath/$jdk -C $jdkpath/" echo "删除各节点上的$jdk安装包..." pdsh -w ^hosts "rm -f $jdkpath/$jdk" echo "配置JDK环境变量..." pdsh -w ^hosts "echo export JAVA_HOME=$jdkpath/jdk1.8.0_51 >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export JRE_HOME=$jdkpath/jdk1.8.0_51/jre >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib >> /etc/profile.d/java.sh" pdsh -w ^hosts "source /etc/profile.d/java.sh" |
需求:将NameNode主机和DataNode1主机上的JDK卸载,环境变量文件删除。