版本信息:Centos7 + Hadoop 2.7.2
Hadoop + Spark 集群搭建系列文章,建议按顺序参考:
Hadoop 2.7.2 集群搭建-预备工作 (不用点了,就是本文)
一般设置
Hadoop集群最好所有节点创建专门的用户组,使用相同的用户名,且所有节点上安装的Hadoop及相关目录,最好要保持完全一致的目录结构,这样规范而不容易出错。经过简单设置好,集群拓扑结构为3台Centos7电脑:
master:1台,主机名master,用户名liuyao
slave:2台,主机名分别是slave1和slave2,用户名liuyao
JDK配置
Centos7自带jdk,环境变量位置使用which java
不好找,可以试试locate dt.jar
:
[liuyao@master ~]$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
[liuyao@master ~]$ which java
/usr/bin/java
[liuyao@master ~]$ locate dt.jar
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/lib/dt.jar
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.101-2.6.6.1.el7_2.x86_64/lib/dt.jar
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/lib/dt.jar
/usr/share/java/tomcat/jasper-jdt.jar
设置jdk环境变量,在/etc/profile添加:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64
建议此时在各节点的 /etc/hadoop/hadoop-env.sh 文件里把export JAVA_HOME=${JAVA_HOME}
也改成上面那个代码(注意,各节点的JAVA_HOME可能还不一样),因为后面启动 hadoop 时很可能会警告: JAVA_HOME is not set。
SSH配置
Hadoop各主机(守护进程)之间通信需要使用SSH,SSH登录分为口令登录和公钥登录(无密钥登录)。
hosts文件配置
为了方便,使SSH时不必输入IP,则可以选择在 /etc/hosts 文件里添加节点名及其IP,添加后的效果如下:
101.X.XX.XX0 master
101.X.XX.XX1 slave1
101.X.XX.XX2 slave2
修改之后,下文类似ssh liuyao@101.X.XX.XX1
都可以改成ssh slave1
即可,一是slave1已在hosts里配置好IP,二是两主机用户名都一样,可省略。不过下文为说明问题,用户名和IP都保留。
口令登录
[liuyao@master .ssh]$ ssh liuyao@101.X.XX.XX1
The authenticity of host '101.X.XX.XX1 (101.X.XX.XX1)' can't be established.
ECDSA key fingerprint is 16:b0:c9:da:66:17:c9:93:2e:4d:7c:dd:13:18:bd:9e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '101.X.XX.XX1' (ECDSA) to the list of known hosts.
liuyao@101.X.XX.XX1's password:
Last login: Thu Jul 14 15:32:31 2016 from localhost
[liuyao@slave1 ~]$
主机A第一次ssh到某个主机B时,无法确认主机B的真实性,只知道它的公钥指纹,系统警告是否继续连接?确认连接后,主机B及其公钥信息会添加到主机A的~/.ssh/known_hosts文件里,下次连接就跳过警告。
公钥登录
公钥登录即为无密码登录
使用ssh-keygen -t -p -f
生成rsa类型的密钥,口令为空,放置在~/.ssh/处,私钥为id_rsa,公钥为id_rsa.pub
[liuyao@master ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
无密码SSH方法1:使用ssh-copy-id user@hostB
把当前主机A的公钥共享给主机B(此处为localhost),主机B收到后生成~/.ssh/authorized_keys文件,里面有主机A的公钥。
[liuyao@master ~]$ ssh-copy-id localhost
无密码SSH方法2: 手动生成相关文件并追加内容
[liuyao@master ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
输入下面指令进行检测,若无需密码,则配置成功
[liuyao@master ~]$ ssh localhost
Last login: Thu Jul 14 14:30:54 2016
[liuyao@master ~]$
若不成功,要需要修改相关配置文件并重启服务sshd
[liuyao@master ~]$ sudo vi /etc/ssh/sshd_config
# 去掉/etc/ssh/sshd_config文件里下面三行前面的注释
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
[liuyao@master ~]$ service sshd restart
注意:以上以liuyao普通用户举例说明实现公钥登录的方法,root还没实现公钥登录,若Hadoop安装配置需要以root用户来操作(比如Hadoop安装在/usr/local/或/opt/目录下,有时就需要root来操作),则还需要为root用户实现公钥登录。本人为了省事,所有Hadoop和Spark以及相关配置都安装配置在
/home/liuyao/00Hadoop/
里,包括namenode和datanode的本地文件目录,这样可以使绝大多数操作都不需要root权限,也就不需要再为root用户实现公钥登录了。
文件说明
[liuyao@master ~]$ cd ~/.ssh/
[liuyao@master .ssh]$ ls
[liuyao@master .ssh]$
# 经过口令登录和公钥登录之后……
[liuyao@master ~]$ cd ~/.ssh/
[liuyao@master .ssh]$ ls
authorized_keys id_rsa id_rsa.pub known_hosts
注意:初始时是没有这4个文件的,经过以上口令登录和公钥登录等操作后才一一生成。
id_rsa和id_rsa.pub
当前主机用户的私钥和公钥,用ssh-keygen生成,其中公钥用来发给别的主机可实现无密码SSH连通。
authorized_keys
当前主机为被登录者,文件存放登录者公钥:公钥登录(无密码登录)时,remote client A–SSH–>localhost B,A的公钥。当A要SSH到B时,B随机生成字符串给A,A使用自己的私钥加密字符串返回给B,B使用A的公钥解密后与之前的随机字符串匹配,匹配成功即为登录成功。
# slave2主机ssh到master主机,进行公钥登录设置,slave2的公钥发给master主机authorized_keys文件里
[liuyao@slave2 .ssh]$ ssh-copy-id liuyao@101.X.XX.XX0
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
liuyao@101.X.XX.XX0's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'liuyao@101.X.XX.XX0'"
and check to make sure that only the key(s) you wanted were added.
[liuyao@slave2 .ssh]$ ssh liuyao@101.X.XX.XX0
Last login: Thu Jul 14 18:36:39 2016 from 101.X.XX.XX2
[liuyao@master ~]$
# 主机master的authorized_keys文件里有localhost和两个slave主机的公钥信息
[liuyao@master .ssh]$ cat authorized_keys
ssh-rsa …… liuyao@localhost.localmain
ssh-rsa …… liuyao@slave1
ssh-rsa …… liuyao@slave2
known_hosts
当前主机为登录者,文件存放被登录者公钥:口令登录时,localhost A–SSH–>remote host B,B的公钥。当A要SSH到B时,A用B的公钥来加密密码传输给B,B收到加密的密码后用自己的私钥解密,密码正确即为登录成功。
# 当前主机的known_hosts文件里有添加的3个主机及其公钥信息:localhost、101.X.XX.XX1和101.X.XX.XX2
[liuyao@master .ssh]$ cat known_hosts
localhost ecdsa-sha2-nistp256 ……
101.X.XX.XX1 ecdsa-sha2-nistp256 ……
101.X.XX.XX2 ecdsa-sha2-nistp256 ……
注意!注意!以上设置需要在集群各节点里配置(配置内容和方法一样,可以采用复制配置文件的方法),以下Hadoop安装和配置先只在master里进行,后面有需要的时候再配置slaves里的Hadoop(其实是直接把master的hadoop文件夹复制过去)。
Hadoop安装和环境设置
在Hadoop官网上下载稳定版的Hadoop 2.7.2,解压后放置在/home/liuyao/00Hadoop下,教材和网上会选择放在/usr/local/或/opt/下,我之所以选择放在liuyao用户目录上,是因为:
- 这样不需要拥有root权限即可进行某些关键操作
- 各节点之前互相SSH通信都可以使用liuyao这一普通用户
[liuyao@master ~]$ cd /home/liuyao/03Software/04BigData/
[liuyao@master 04BigData]$ tar xzf hadoop-2.7.2.tar.gz --directory=/home/liuyao/00Hadoop/
配置Hadoop环境变量
注意:这个步骤需要在集群各节点里都配置!
[root@master hadoop-2.7.2]$ vi /etc/profile
# 在文件中添加以下两行
export HADOOP_INSTALL=/home/liuyao/00Hadoop/hadoop-2.7.2
export PATH=$PATH:${HADOOP_INSTALL}/bin:${HADOOP_INSTALL}/sbin
输入以下命令判断Hadoop是否工作
[liuyao@master ~]$ hadoop version
Hadoop 2.7.2
……
参考
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html