本文搭建了一个由三节点(master、slave1、slave2)构成的Hadoop完全分布式集群(区别单节点伪分布式集群),并通过Hadoop分布式计算的一个示例测试集群的正确性。
本文集群三个节点基于三台虚拟机进行搭建,节点安装的操作系统为Centos7(yum源),Hadoop版本选取为2.5.2。
1、基础集群的搭建
2、集群网络配置
开启虚拟机,修改配置文件 输入如下命令
ls -l /etc/sysconfig/network-scripts/ifcfg-ens33
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=2fd4e3fc-509d-47b2-a833-e55f360a4661
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.4.110
NETMASK=255.255.255.0
GATEWAY=192.168.4.100
DNS1=8.8.8.8
DNS2=8.8.8.4
需要修改的地方有:
BOOTPROTO=static#dhcp改为static(修改)
ONBOOT=yes#开机启用本配置,一般在最后一行(修改)
IPADDR=192.168.4.110 #静态IP(增加)
GATEWAY=192.168.4.100 #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)
NETMASK=255.255.255.0#子网掩码(增加)
#DNS1=8.8.8.8
重启网卡
service network restart
3、集群SSH免密登陆设置
3.1 创建hadoop用户
为三个节点分别创建相同的用户hadoop,并在以后的操作均在此用户下操作,操作如下:
#useradd -m hadoop
#passwd hadoop
为hadoop添加sudo权限,切换到root用户
#visudo
在该行root ALL=(ALL) ALL下添加hadoop ALL=(ALL) ALL保存后退出,并切换回hadoop用户
#su hadoop
注意事项:三个节点的用户名必须相同,不然以后会对后面ssh及hadoop集群搭建产生巨大影响
3.2 hosts文件设置
为了不直接使用IP,可以通过设置hosts文件达到ssh slave1这样的的效果(三个节点设置相同)
$sudo vim /etc/hosts
在文件尾部添加如下行,保存后退出:
192.168.4.110 master
192.168.4.120 slave1
192.168.4.130 slave2
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
注意事项:不要在127.0.0.1后面添加主机名,如果加了master,会造成后面hadoop的一个很坑的问题,在slave节点应该解析出masterIP的时候解析出127.0.0.1,造成hadoop搭建完全正确,但是系统显示可用节点一直为0。
3.3 hostname修改
centos7默认的hostname是localhost,为了方便将每个节点hostname分别修改为master、slave1、slave2(以下以master节点为例)。
$sudo hostnamectl set-hostname master
重启terminal,然后查看:$hostname
3.3 ssh设置
设置master节点和两个slave节点之间的双向ssh免密通信,下面以master节点ssh免密登陆slave节点设置为例,进行ssh设置介绍(以下操作均在master机器上操作):
[在master节点设置完后,登录slave1、slave2到节点分别进行设置]
首先生成master的rsa密钥:$ssh-keygen -t rsa
设置全部采用默认值进行回车
将生成的rsa追加写入授权文件:$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
给授权文件权限:$chmod 600 ~/.ssh/authorized_keys
进行本机ssh测试:$ssh master正常免密登陆后所有的ssh第一次都需要密码,此后都不需要密码
将master上的authorized_keys传到slave1
sudo scp ~/.ssh/id_rsa.pub hadoop@slave1:~/
登陆到slave1操作:$ssh slave1输入密码登陆
$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
修改authorized_keys权限:$chmod 600 ~/.ssh/authorized_keys
退出slave1:$exit
进行免密ssh登陆测试:$ssh slave1
4、java安装
目的:hadoop是基于Java的,所以要安装配置Java环境(三个节点均需要操作,以下以master节点为例)
下载并安装:$sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
验证是否安装完成:$java -version
配置环境变量,修改~/.bashrc文件,添加行: export JAVA_HOME=/usr/lib/jvm/java-1.8.0
使环境变量生效:$source ~/.bashrc
5、Hadoop安装配置
目的:获得正确配置的完全分布式Hadoop集群(以下操作均在master主机下操作)
安装前三台节点都需要需要关闭防火墙和selinux
$sudo systemctl stop firewalld.service
$sudo systemctl disable firewalld.service
5.1 Hadoop安装
首先在master节点进行hadoop安装配置,之后使用scp传到slave1和slave2。
下载Hadoop二进制源码至master,下载地址,并将其解压在~/ 主目录下
$tar -xvf ~/hadoop-2.5.2.tar -C ~/
$mv ~/hadoop-2.5.2/* ~/hadoop/
5.2 Hadoop的master节点配置
配置hadoop的配置文件core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves(都在~/hadoop/etc/hadoop文件夹下)
$cd ~/hadoop/etc/hadoop
$vim core-site.xml其他文件相同,以下为配置文件内容:
1.core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop/tmp</value>
</property>
</configuration>
2.hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
</configuration>
3.mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.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>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
5.slaves
slave1
slave2
5.3 Hadoop的其他节点配置
此步骤的所有操作仍然是在master节点上操作,以master节点在slave1节点上配置为例
复制hadoop文件至slave1:$scp -r ~/hadoop hadoop@slave1:~/
5.4 Hadoop环境变量配置
配置环境变量,修改~/.bashrc文件,添加行(每个节点都需要此步操作,以master节点为例):
#hadoop environment vars
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
使环境变量生效:$source ~/.bashrc
6、Hadoop启动
格式化namenode:$hadoop namenode -format
启动hadoop:$start-all.sh
master节点查看启动情况:$jps
19218 NameNode
21476 Jps
19563 ResourceManager
19420 SecondaryNameNode
slave1节点查看启动情况:$jps
16949 Jps
15213 DataNode
15343 NodeManager
slave2节点查看启动情况:$jps
16949 Jps
15213 DataNode
15343 NodeManager
Web浏览器输入127.0.0.1:50070,查看管理界面
7、Hadoop集群测试
目的:验证当前hadoop集群正确安装配置
本次测试用例为利用MapReduce实现wordcount程序
生成文件testWordCount:$echo "My name is Xie PengCheng. This is a example program called WordCount, run by Xie PengCheng " >> testWordCount
创建hadoop文件夹wordCountInput:$hadoop fs -mkdir /wordCountInput
将文件testWordCount上传至wordCountInput文件夹:$hadoop fs -put testWordCount /wordCountInput
执行wordcount程序,并将结果放入wordCountOutput文件夹:$hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount /wordCountInput /wordCountOutput
注意事项:/wordCountOutput文件夹必须是没有创建过的文件夹
查看生成文件夹下的文件:$hadoop fs -ls /wordCountOutput
在output/part-r-00000可以看到程序执行结果:hadoop fs -cat /wordCountOutput/part-r-00000
My 1
PengCheng 1
PengCheng. 1
This 1
WordCount, 1
Xie 2
a 1
by 1
called 1
example 1
is 2
name 1
program 1
run 1
问题纪录:
Centos7 开机黑屏-启动命令行模式
1、在图形界面下单击鼠标右键,选择“Konsole”;
2、 获取当前系统启动模式,输入:systemctl get-default
3、查看配置文件, cat /etc/inittab
4、通过以上显示,目前系统为命令行模式
更改模式命令:systemctl set-default graphical.target 由命令行模式更改为图形界面模式
systemctl set-default multi-user.target 由图形界面模式更改为命令行模式
5、更改后验证是否正确 shutdown -r now