Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。
一、安装和启动SSH(root)
所以我们需要两个服务:ssh和rsync是否已经安装,可以通过下面命令查看:
rpm –qa | grep openssh
rpm –qa | grep rsync
如果没有安装ssh和rsync,可以通过下面命令进行安装:
yum install ssh 安装SSH协议
yum install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件)
service sshd restart 启动服务
二、确认本机sshd的配置文件(root)
vi /etc/ssh/sshd_config
找到以下内容,并去掉注释符"#"
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
测试SSH
$ ssh localhost
回车会提示你输入密码,因为此时我们还没有生成证书。
以下操作使用hadoop用户
三、配置Master无密码登录本机
1、SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。
2、Master机器上生成密码对
在Master节点上执行以下命令:
ssh-keygen –t rsa
无密码密钥对,询问其保存路径时直接回车采用默认路径。
生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。(.ssh默认为隐藏目录)
查看"/home/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对:id_rsa和id_rsa.pub,后者为公钥。
导入公钥,把id_rsa.pub追加到授权的key文件中。
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
修改authorized_keys文件权限
CentOS默认新生成的文件权限为:-rw-rw-r--,即自己和群组用户都可以重写该文件,这被认为是不够安全的。如上图,由于此前我的主机上并未存在authorized_keys文件,现在由于重定向输出新建了该文件,因此该文件的默认权限为-rw-rw-r--仍旧不够安全。需把群组中的w权限去掉。可使用命令:chmod 644 authorized_keys。网上的资料中,都是直接chmod 600 authorized_keys,即群组和其他用户连读取文件内容的权限都没有,当然这样是最安全的,但是系统只要求到除了自己之外其他所有用户均不能改动文件就可以了。
chmod 600 authorized_keys
重启SSH服务,才能使刚才设置有效。
service sshd restart
测试无密码登录本机,如下图,master.hadoop已经能够使用ssh无密码登录本机了。
四、配置Slave无密码登录本机
重复上述步骤,完成slave01、slave02的SSH配置。
测试各自本机的SSH无密码登录。
五、配置所有Slave无密码登录Master
用scp命令,把公钥文件发放给master。
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/
slave01上:scp .ssh/id_rsa.pub hadoop@master:/home/hadoop/id_rsa_01.pub
slave02上:scp .ssh/id_rsa.pub hadoop@master:/home/hadoop/id_rsa_02.pub
这二行执行完后,回到master中,查看下/home/hadoop目录,应该有二个新文件id_rsa_01.pub、id_rsa_02.pub,然后在master上,导入这二个公钥。
cat id_rsa_01.pub >> .ssh/authorized_keys
cat id_rsa_02.pub >> .ssh/authorized_keys
导入成功后删除id_rsa_01.pub和id_rsa_02.pub文件,然后重新启动master的SSH服务。
service sshd restart
master机器上已经拥有了slave01和slave02的公钥,我们可以尝试slave01、slave02SSH无密码访问master。
我们就实现了所有的slave机器可以SSH无密码访问master。
六、配置Master无密码登录所有Slave
将master上的“最全”公钥,复制到所有的slave机器上。
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/
scp .ssh/authorized_keys hadoop@slave01:/home/hadoop/.ssh/authorized_keys
scp .ssh/authorized_keys hadoop@slave02:/home/hadoop/.ssh/authorized_keys
重新启动slave机器的SSH服务。
尝试master无密码SSH访问所有slave机器。
尝试slave无密码SSH访问其他slave机器。
实现了master机器SSH无密码访问所有的slave。
最终,实现了master无密码SSH访问slave,salve无密码SSH访问master,slave之间的无密码SSH访问。