在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
首先要保证每台机器上都装了SSH服务器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH协议的一个免费开源实现。现在的linux发行版一般都默认安装了SSH的,开机的时候你可以观察下是否有名字为sshd的守护程序启动,如果没有,则需要安装OpenSSH软件。
以本文中的3台机器为例,现在hadoop0是主节点,它需要主动发起SSH连接到hadoop1,对于SSH服务来说,hadoop0就是SSH客户端,而hadoop1, hadoop2则是SSH服务端,因此在hadoop1,hadoop2上需要确定sshd服务已经启动。简单的说,在hadoop0上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到hadoop1上,这样,比如当hadoop0向hadoop1发起ssh连接的时候,hadoop1上就会生成一个随机数并用hadoop0的公钥对这个随机数进行加密,并发送给hadoop0,hadoop0收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop1,hadoop1确认解密的数无误后就允许hadoop0进行连接了。这就完成了一次公钥认证过程。
·配置SSH过程
需要关闭SELinux,关闭SELinux的方法:修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。如果不想重启系统,使用命令setenforce 0
注:setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux
以下是配置 SSH 的无密码公钥认证的过程。对于本文中的3台机器,首先在hadoop1上生成密钥对,如代码清单 1 所示:
[root@hadoop0 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a8:97:55:d3:95:d6:fe:f5:08:ca:4c:6e:24:62:b4:22 root@hadoop0
命令最后的rsa只是个代号,你可以取你自己喜欢的名字。这个命令将为 hadoop0 上的当前用户 root 生成其密钥对,密钥对的保存路径使用缺省的 /root/.ssh/id_rsa, 要求输入passphrase 的时候,直接回车。这样生成的证书以及公钥将存储在 /root/.ssh 目录,形成两个文件 id_rsa,id_rsa.pub。
然后将 id_rsa.pub文件的内容复制到每一台机器(包括hadoop0)的/root/.ssh/authorized_keys文件的尾部。
若机器上不存在这个/root/.ssh/authorized_keys文件,可以自行创建一个。请注意 id_rsa.pub 文件的内容是长长的一行,复制时需注意,不要遗漏字符或混入了多余换行符。
接下来可以做一下 SSH 连接测试,从 hadoop0 分别向 hadoop0, hadoop1, hadoop2,发起 SSH 连接请求,确保不需要输入密码就能 SSH 连接成功。注意第一次 SSH 连接时会出现如下提示信息:
The authenticity of host [homer06] can't be established. The key fingerprint is:
74:32:91:f2:9c:dc:2e:80:48:73:d4:53:ab:e4:d3:1a
Are you sure you want to continue connecting (yes/no)?
请输入 yes, 这样 OpenSSH 会把连接过来的这台主机的信息自动加到 /root/.ssh/know_hosts 文件中去,第二次再连接时,就不会有这样的提示信息了。
然后你会发现不需要输入密码就可以建立ssh连接了,恭喜你,配置成功了,不过,别忘了测试本机ssh hadoop1。
Tip:
这里提供我使用的一种可行的方式:
将id_rsa.pub的内容复制
/home/hadoop/.ssh/authorized_keys文件中。
[root @ hadoop0:.ssh]# cat /root/.ssh/id_dsa.pub >>/root/.ssh/authorized_keys
[root @ hapoop0:.ssh]# scp authorized_keys hapoop1:/root /.ssh/
[root @ hapoop0:.ssh]# scp authorized_keys hapoop2:/root/.ssh/
此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即hadoop2,hadoop3机器上hadoop帐户的密码,当然,你也可以用其他方法将authorized_keys文件拷贝到其他机器上。
[root @hadoop1:.ssh]# chmod 640 authorized_keys
[root @hadoop2:.ssh]# chmod 640 authorized_keys
这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
l 安装部署Hadoop
首先在hadoop0上部署hadoop软件,解压到/usr/local/hadoop-0.20.2,更名为hadoop。
A ) 修改环境变量
在/usr/local/hadoop/conf目录下的hadoop-env.sh中设置hadoop需要的环境变量,其中JAVA_HOME是必须设定的变量。HADOOP_HOME变量可以设定也可以不设定,如果不设定,HADOOP_HOME默认的是bin目录的父目录。我的设置如下:
B ) 修改masters文件
打开masters文件,该文件用来指定NameNode,内容如下:
Hadoop0(IP)
C ) 修改slaves文件
如前所述,在hadoop1(NameNode)的hadoop-config/目录下,打开slaves文件,该文件用来指定所有的DataNode,一行指定一个主机名。即本文中的hadoop2、hadoop3,因此slaves文件看起来应该是这样的:
Hadoop1(IP)
Hadoop2(IP)
Tip:
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
D ) 修改core-site.xml
在hadoop的安装目录下的src目录中分别找到
core-default.xml,hdfs-default.xml,
mapred-default.xml三文件,然后copy到hadoop-config/目录下,这三个文件包含Hadoop的所有配置项,然后把这个分别改名为core-site.xml,hdfs-site.xml,
mapred-site.xml,我们根据需要修改如下:(注意:下面的配置文件中不要有中文或中文的符号,否则报错)
修改core-site.xml为:
hadoop.tmp.dir
/usr/local/hadoop/tmp
fs.defaultFS
hdfs://(master IP):9000
Tip:
fs.default.name是NameNode的URI。hdfs://主机名:端口
E ) 修改hdfs-site.xml为
Tip:
dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
F ) 修改mapred-site.xml为
Tip:
mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。