截止到今天,我已经在博客中给大家介绍了hadoop的本地模式、伪分布式搭建,并且在《Hadoop》之"踽踽独行"(四)中也总结了在CentOS6.5平台上搭建的hadoop2.7.3集群的步骤。在那篇文章中,会涉及到一些原理,比如节点之间的SSH无密码登录,时间同步,防火墙设置以及在多节点之间的文件传输等等。当然,那样的集群搭建很适合理解搭建原理。
现在呢,hadoop集群的搭建原理,我们也知道了,因此,我们可以通过一些手段,来快速的搭建hadoop多节点的完全分布式集群。
完全分布式集群(Fully-Distributed Cluster)的原理:
Hadoop的守护进程运行在由多台主机搭建的集群上,是真正的生产环境。我们需要在所有的主机上安装JDK和Hadoop,组成相互连通的网络。在主机间设置SSH免密码登录,把各从节点生成的公钥添加到主节点的信任列表。
1、VMware软件
2、操作平台:CentOS-6.10-x86_64-bin-DVD1.iso
3、jdk-8u172-linux-x64.tar.gz
4、hadoop-2.7.3.tar.gz
第一步:在VMware上安装一台CentOS6.10虚拟机,命名为CentOS_6.10_64_Fully_master。设置主机名为master。
第二步:如果没有在第一步中创建普通用户,那么就可以root身份创建一个普通用户michael。
[root@master ~]# useradd michael
[root@master ~]# passwd michael
New password:
第三步:配置网络服务。配置NAT模式下的静态IP。我配置的ip为:192.168.80.10,你的ip需要查看你自己机器上的VMnet8虚拟网卡。测试虚拟机与物理机是否互通。不会配置的话可以查看文章《Linux系统》之"皮毛系列"(七) 网络通信设置.
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
.........
ONBOOT=yes #修改成yes,开机自动启用
..........
BOOTPROTO=static #修改成static/none
..........
IPADDR=192.168.80.10 #追加IP地址,设置成与VMnet8虚拟网卡同一段位的地址
NETMASK=255.255.255.0 #追加子网掩码,
GATEWAY=192.168.80.2 #追加网关,设置成VMnet8提供的网关,一般结尾都是2
DNS1=192.168.80.2 #追加DNS1,设置成与网关一致即可
第四步:修改/etc/hosts文件。在里面追加
[root@master ~]# vim /etc/hosts
192.168.80.10 master #绑定好名称节点的ip与host
192.168.80.11 slave1 #绑定好数据节点的ip和host,这些为克隆linux做准备
192.168.80.12 slave2
192.168.80.13 slave3
192.168.80.10 slave4
第五步:关闭防火墙
[root@master michael]# chkconfig iptables off #永久关闭
[root@master michael]# chkconfig iptables --list #查看状态
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
第六步:配置SSH无密码登录。到这一步一定要切回普通用户michael。之前都是root身份。
[michael@master ~]$ ssh-keygen -t rsa #一路回车下去
[michael@master ~]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys #更名成authorized_keys
[michael@master ~]$ chmod 600 ~/.ssh/authorized_keys #修改权限为0600
第七步:准备jdk和hadoop安装包。
在~/目录下创建目录apps,将jdk-8u172-linux-x64.tar.gz和hadoop-2.7.3.tar.gz 上传到 ~/apps/目录下。
第八步:解压jdk和hadoop。(普通用户身份)
#解压软件包
[michael@master apps]$ tar -zxv -f jdk-8u172-linux-x64.tar.gz
[michael@master apps]$ tar -zxv -f hadoop-2.7.3.tar.gz
#创建软链接
[michael@master apps]$ ln -s jdk1.8.0_172/ jdk
[michael@master apps]$ ln -s hadoop-2.7.3 hadoop
#删除软件包,释放空间
[michael@master apps]$ rm jdk-8u172-linux-x64.tar.gz
[michael@master apps]$ rm hadoop-2.7.3.tar.gz
第九步:配置jdk和hadoop的环境变量
[michael@master apps]$ vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export JAVA_HOME=/home/michael/apps/jdk #jdk env
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export HADOOP_HOME=/home/michael/apps/hadoop #hadoop env
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
[michael@master apps]$ source ~/.bash_profile #导入到当前bash,使环境变量生效
到此为止,基本需求已经安装完毕,建议重启,使防火墙设置生效
第一步:在hadoop的根目录~/apps/hadoop/下创建一个目录tmp,用于设置配置文件信息和存储以后产生的数据
[michael@master hadoop]$ pwd
/home/michael/apps/hadoop
[michael@master hadoop]$ mkdir tmp
第二步:修改core-site.xml
fs.defaultFS #默认文件系统名称,用于指定host,post
hdfs://master:9000
hadoop.tmp.dir #指定临时文件的存储路径
file:/home/michael/apps/hadoop/tmp
第三步:修改hdfs-site.xml
dfs.replication #用于指定副本个数
3
dfs.namenode.name.dir #用于指定namenode存储路径
file:/home/michael/apps/hadoop/tmp/dfs/name
dfs.datanode.data.dir #用于指定datenode存储路径
file:/home/michael/apps/hadoop/tmp/dfs/data
第四步:修改mapred-site.xml。此目录下没有该文件,我们需要将mapred-site.xml.template 复制一份,改成此名,然后再修改。
mapreduce.framework.name #使用yarn运行框架
yarn
mapreduce.jobhistory.address # Server IPC host:port
master:10020
mapreduce.jobhistory.webapp.address
master:19888 # Server Web UI host:port
第五步:修改yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
master
第六步:修改hadoop-env.sh。打开此文件,重新设置JAVA_HOME的值,否则不能启动。
[michael@master hadoop]$ vim ~/apps/hadoop/etc/hadoop/hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/home/michael/apps/jdk
第七步:修改slaves文件。打开此文件,删除默认的localhost,增加四个数据节点
[michael@master hadoop]$ vim ~/apps/hadoop/etc/hadoop/slaves
slave1
slave2
slave3
slave4
第八步:修改yarn-env.sh。我们最好也重新设置一下此文件的java_home。
# exportJAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/home/michael/apps/jdk #增加内容
if ["$JAVA_HOME" != "" ]; then
主机名master的虚拟机上完成了基本需求设置和配置hadoop这两大步,剩下的就是克隆多个虚拟机,然后分别进行网络配置和修改成主机名为slave1,slave2,slave3,slave4了。
关闭虚拟机master,然后右键点击master>>管理>>克隆>>下一步>>下一步>>创建完整克隆>>命名为:CentOS_6.10_64_Fully_slave1>>等待完成。
第一步:修改网卡信息
修改/etc/udev/rules.d/70-persistent-net.rules。注释掉eth0这一行,然后将eth1的name属性改为eth0。即如下:
[michael@master ~]$ vim /etc/udev/rules.d/70-persistent-net.rules
..........
#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:79:95:88", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:78:66:9f", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
然后记住新的eth0的MAC地址,去修改/etc/sysconfig/network-scripts/ifcfg-eth0里的信息,因此一会要重启虚拟机,所以重启网络服务可以不进行。
ONBOOT=yes
.............
BOOTPROTO=static
HWADDR=00:0C:29:78:66:9f #改成新的MAC地址
..........
IPADDR=192.168.80.11 #改成192.168.80.11
NETMASK=255.255.255.0
GATEWAY=192.168.80.2
DNS1=192.168.80.2
第二步:修改主机名
打开/etc/sysconfig/network文件,修改主机名为slave1
[michael@master ~]$ vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=slave1 #改为slave1
第三步:重启机器。
再重复上面三步,分别配置主机名:
虚拟机名:CentOS_6.10_64_Fylly_slave2,主机名:slave2,ip:192.168.80.12。
虚拟机名:CentOS_6.10_64_Fylly_slave3,主机名:slave3,ip:192.168.80.13。
虚拟机名:CentOS_6.10_64_Fylly_slave4,主机名:slave4,ip:192.168.80.14。
原理分析:因为是克隆,所有的克隆机器中就已有了jdk和hadoop,也不需要再生成公钥和私钥了,这些克隆机器上已经有了一对公钥和私钥。即master虚拟机上的那一对。可以直接进行无密登录。
这里有个建议:因为是同一套公钥和私钥,建议在master虚拟机上ssh一下所有的克隆机器,测试一下是否是无密登录。全部测试完,就ok了。(不连一遍的话,有可能对下面的操作有影响)
第一步:格式化集群
[michael@master ~]$ hdfs namenode -format
#这一步是格式化namenode,用于创建dfs/name/fsimage和edit文件
第二步:启动集群
[hyxy@master ~]$ start-all.sh
#使用这个脚本,启动所有的守护线程,如:namenode,datenode,resourcemanager,datamanager,secondarynamenode
第三步:检查守护线程
在master虚拟机下运行jps指令,应该至少有四个线程
[michael@master ~]$ jps
7845 Jps
6901 SecondaryNameNode
6709 NameNode
7047 ResourceManager
在slave虚拟机下运行jps指令,应该至少有三个线程
[michael@slave1 ~]$ jps
4262 Jps
3837 NodeManager
3726 DataNode
或者,在虚拟机内的浏览器上输入master:50070 / master:8088
再或者,在物理机的浏览器上输入192.168.80.10:50070 /192.168.80.10:8088
第四步:测试项目
测试就再累述了。可以参考《Hadoop》之"踽踽独行"(七)中的第三部分:程序测试。
------------------------------大功告成,如有疑问,敬请留言----------------------------------------