主要思想
1.选定一台机器作为 Master
2.在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
3.在 Master 节点上安装 Hadoop,并完成配置
4.在其他 Slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
5.将 Master 节点上的 /usr/local/hadoop 目录复制到其他 Slave 节点上
6.在 Master 节点上开启 Hadoop
环境
本教程采用CentOS6.7 64位,安装Hadoop版本为2.7.3,Java版本为1.8.0。
其他linux版本也类似,只是命令行不同而已。
集群环境为:Master Slave1 Slave2
创建hadoop用户
我选择为单独创建一个用户来搭建hadoop和spark集群。
添加用户(用管理员权限)
#adduser hadoop
设置用户密码,按提示输入两次
#passwd hadoop
为hadoop用户赋予管理员权限,以管理员身份执行如下命令:
#visudo #找到对应位置(中间)添加hadoop ALL=(ALL) ALL
修改用户组,使其属于root组,修改完毕后可使用su-获得管理员权限,命令如下:
#usermod -g root hadoop
为了区分各节点现修改主机名(改为Master):
$vim /etc/sysconfig/network #改为HOSTNAME=Master
然后修改自己所用节点的IP映射:
$sudo vim /etc/hosts
例如本教程使用的三个节点的名称与对应的IP关系如下:
192.168.139.134 Master
192.168.139.135 Slave1
192.168.139.135 Slave2
/etc/hosts原有的不要删除,在底部增加IP关系即可。在其它节点上也要对/etc/hosts和/etc/sysconfig/network这两个文件进行修改,修改完成后可用如下命令测试是否相互ping通,如果可以相互ping通,则配置成功,否则配置失败。
$ping Master -3 #只ping3次,否则按ctrl+c 中断。
$ping Slave1 -3
$ping Slave2 -3
安装Java环境
笔者未用OpenJDK7,选择的是java1.8.0。下载的是jdk-8u101-linux-x64.tar.gz,目前最新版下载地址是jdk-8u111-linux-x64.tar.gz。
我选择用windows下载后使用WinSCP传给linux系统hadoop用户,下面是解压命令:
$sudo tar -xvf jdk-8u101-linux-x64.tar.gz -C /usr/local #我的安装目录是/usr/local
配置JAVA_HOME环境:
$vim ~/.bashrc
在文件最前端添加如下内容(JDK的安装路径):
export JAVA_HOME=/usr/local/jdk1.8.0_101
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
使该环境变量生效,执行如下代码:
source ~/.bashrc #使该变量生效
检验是否配置正确:
$java -version #若不为java1.8.0,建议重启。
安装SSH、配置SSH免密码登陆
首次执行如下命令是对提示输入密码(如果有yes/no选择请选择yes)。
$ssh localhost
首先退出刚才的ssh,然后利用ssh-keygen生成密钥,并将密钥加入到授权中,代码如下:
$exit
$cd ~/.ssh
$ssh-keygen -t rsa #会有提示,每一步都按回车就可以
$cat ./id_rsa.pub >> ./authorized_keys #加入授权
此时再用ssh localhost命令,无需密码就可以直接登陆了,如图所示:
安装Hadoop2.7.3
同jdk-8u101-linux-x64.tar.gz一样,我选择用windows下载后使用WinSCP传给linux系统hadoop用户。
笔者选择将hadoop安装在/usr/local/目录中:
$sudo tar -zxf ~/hadoop-2.7.3.tar.gz -C /usr/local #解压至/usr/local
$cd /usr/local
$sudo mv ./hadoop-2.7.3/ ./hadoop #修改文件名为hadoop
$sudo chown -R hadoop ./hadoop #修改文件权限为hadoop
解压后即可使用,输入如下命令检查hadoop是否可用,成功则显示Hadoop版本信息:
$cd /usr/local/hadoop
$./bin/hadoop version
配置Hadoop PATH变量
这样配置后可以在任意目录中使用hdfs等命令,这一步只需要在Master节点上进行配置。
$vim ~/.bashrc #添加如下代码块
#在开头添加如下代码块
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
保存后务必执行source ~/.bashrc 使变量设置生效。
以上所有步骤在三台机器上都需要完成,更改用户名时注意为Slave1和Slave2
下面为集群配置:
SSH无密码登陆子节点
这个操作的前提是Master节点和所有子节点都完成ssh localhost免密码登陆本机,然而下面的操作是要让Master节点可以无密码SSH登陆到各个Slave节点上。
首先生成Master节点的公钥,在Master节点的终端上执行(因为改过主机名,所有还需要删除原有的再重新生成一次):
$cd ~/.ssh
$rm ./id_rsa* #删除原有的公钥
$ssh-keygen -t rsa
$cat ./id_rsa.pub >> ./authorized_keys
验证让Master节点无密码SSH本机,在Master节点上执行ssh Master,可能需要输入yes,成功后执行exit返回原来的终端。
将Master节点上的公钥传输Slave1节点:
$scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ #scp为secure copy
接着在Slave1节点上,将ssh公钥加入授权:
$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$rm ~/id_rsa.pub
在Slave2节点上也要执行相同的操作即将Master公钥传输到Slave2节点、在Slave2节点上加入授权这两步。
在Master节点上执行如下命令:
$ssh Slave1
结果为:终端标题以及命令符变为Slave1,此时执行的命令相当于在Slave1节点上执行的,可执行exit退回到原来的Master终端。[hadoop@Slave1 ~]
配置集群/分布式环境
集群配置需要修改/usr/local/hadoop/etc/hadoop中的5个配置文件,分别如下:
- slaves
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
1.slaves文件,将作为Master的主机名写入该文件,每行一个。
修改命令如下:
$cd /usr/local/hadoop/etc/hadoop
$vim slaves
笔者的Slaves文件为:
Slave1
Slave2
2.文件core-site.xml改为一下配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary direct ories.</description>
</property>
</configuration>
3.文件hdfs-site.xml,dfs.replication为Slave节点的个数,笔者为2:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dif</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
4.文件mapred-site.xml需要重命名,然后配置修改为如下:
重命名命令如下:
$cd /usr/local/hadoop/etc/hadoop
$sudo mv ./mapred-site.xml.template ./mapred-site.xml
修改内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
5.文件yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置好以后,需要将Master节点上/usr/local/hadoop文件夹复制到各个Slave节点上,如果在Master节点上跑过伪分布式模式,建议先删除之前的临时文件。在Master节点上执行:
$cd /usr/local
$sudo rm -r ./hadoop/tmp #删除临时文件
$sudo rm -r ./hadoop/logs/* #删除日志文件
$tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩后复制
$cd ~
$scp ./hadoop.master.tar.gz Slave1:/home/hadoop
在Slave1节点上执行:
$sudo rm -r /usr/local/hadoop #如果存在,删除旧的
$sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
$sudo chown -R hadoop /usr/local/hadoop
同样在Slave2上执行同样的操作。
关闭防火墙
CentOS系统默认开启了防火墙,在开启集群之前,需要关闭每个节点的防火墙。有防火墙会导致ping得通,但是telnet端口不通,从而导致了DataNode启动了,但是live datanode 为0的情况。
CentOS 6.x关闭防火墙命令如下:
$sudo service iptables stop #关闭防火墙服务
$sudo chkconfig iptables off #禁止防火墙开机自启
启动集群
首次启动需要先在Master节点上执行NameNode的格式化:
$hdfs namenode -format #首次运行需要,之后不需要
接着在Master节点上,启动hadoop,命令如下:
$start-dfs.sh
$start-yarn.sh
$mr-jobhistory-daemon.sh start historyserver
通过jps命令可以查看各个节点所启动的进程。正确应该有如下进程:
- NameNode
- ResourceManager
- Jps
- SecondaryNameNode
- JobHistoryServer
缺少一个进程都不对。
在Slave节点上应该看到:
- Jps
- DataNode
- NodeManager
另外可以在Master节点上执行 hdfs dfsadmin -report 查看DataNode是否正常启动,如果Live datanode 不为0 且为子节点的个数,则说明启动成功。
也可用WebUI查看DataNode的状态,如下所示:
关闭Hadoop集群也是在Master节点上执行的:
$stop-yarn.sh
$stop-dfs.sh
$mr-jobhistory-daemon.sh stop historyserver