0.前言
Spark集群搭建在Hadoop集群之上,而Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到 NameNode。
下面简单介绍下SSH基本原理
1)SSH基本原理
SSH之所以能够保证安全,原因在于它采用了公钥加密。过程如下:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
根据SSH运行原理,再来了解下SSH无密码登入原理。
2)SSH无密码登入原理
Master(NameNode | JobTracker)要实现无密码公钥认证,连接到Worker(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Worker上。当Master通过SSH连接Worker时,Worker就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Worker,Worker确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
总结:简单来说就是在每台电脑上生成一对密钥,包括一个公钥和一个私钥,然后把所有机器的公钥整合在一起,变成一个公钥集(其实是整合到一个文件里),并把这个公钥集发给所有机器。然后任何一台机器要访问其他机器时,都会用这个公钥来解密从发送者那里用私钥加密后发来的加密请求,就相当于机器用公钥自动输了密码,所以实现了无密码登入。
1.具体操作分4步
1.1 安装ssh
注意:如果你的Ubuntu没有安装SSH,请首先安装SSH
Ubuntu下安装ssh:apt-get install ssh(非root用户前面加sudo)
1.2 生成秘钥对
输入指令:ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
因为.ssh文件在/root/目录下,所以也可以:
ssh-keygen -t dsa -P ” -f /root/.ssh/id_dsa
从截图提示可以看出,这个命令生成了一个id_dsa(私钥)文件,和一个id_dsa.pub(公钥)文件。可以进入cd /root/.ssh,用ls命令查看。
先在Master和所有Worker节点完成上述2步。
1.3 用cat命令追加公钥
回到Master节点操作。
输入指令:cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
这部完成之后,就可以ssh登入本机来看是否已经可以无密码登入本机了。如下图,已经可以无密码登入啦。
1.4 ssh无密码登入所有机器
上面步骤里的这个authorized_keys文件就相当于一个公钥集文件了。只要把所有机器的公钥按上面的第三步都追加到这个authorized_keys文件里,然后复制给所有机器,放到/root/.ssh目录里,相当于每台机器都有了所有机器的公钥。原理请看前言。
分为4小步骤(针对我时4台虚拟机,如果再多,重复操作就好)
1).把Master上/root/.ssh目录下的authorized_keys文件,复制到worker1节点的/root/.ssh目录下,在用cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys命令,把worker1生成的公钥加入到这个authorized_keys文件中。
2).再把上步骤Worker1上/root/.ssh目录下的authorized_keys文件,复制到worker2节点的/root/.ssh目录下,在用cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys命令,把worker2生成的公钥加入到这个authorized_keys文件中。
3).再把上步骤Worker2上/root/.ssh目录下的authorized_keys文件,复制到worker3节点的/root/.ssh目录下,在用cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys命令,把worker3生成的公钥加入到这个authorized_keys文件中。这时的authorized_keys文件就包含4台机器所有的公钥了。
4).最后把Worker3上/root/.ssh目录下的authorized_keys文件复制到Master,Worker1,Worker2的/root/.ssh目录下,覆盖原来的authorized_keys文件。
我在虚拟机中做这步,本想用scp命令把Master节点已经生成的authorized_keys文件发送到Worker上的/root/.ssh目录里,但是密码一直不能输入正确,不知道为什么。所有最后直接用U盘拷贝authorized_keys文件,来操作。
到这里就完成了ssh无密码登入了。登入Worker1来验证下:
本文前言部分参考博客:
http://www.cnblogs.com/lanxuezaipiao/p/3525554.html
XianMing