Hadoop集群搭建
在介绍Hadoop集群搭建的步骤之前,先了解一下Hadoop2.x版本以后hadoop的组成。在2版本发布以前,hadoop由HDFS,Common、MapReduce三个部分组成,其中HDFS为Hadoop Distributed File System,负责文件和数据的存储,MapReduce则同时负责数据的计算和用于计算所需的集群资源的调度,Common作为辅助工具,由此可见,MapReduce既负责计算又负责资源调度,耦合度较高。所以到了2版本发布以后,Hadoop推出了Yarn,把资源调度的任务从MapReduce中剥离出来交由Yarn处理,所以Hadoop2版本以后,就由:HDFS、MapReduce、Yarn、Common四个部分组成。
1)HDFS作为分布式文件系统,由三个部分组成:namenode、datanode、second namenode。三个部分各司其职:
2)Yarn负责资源调度,我们知道集群由多台机器构成,集群总资源的调度,单个节点内资源的调度又属于不同的工作,因此,Yarn又分为Resourcemanager和nodemanager,分别负责集群资源调度和节点内资源的调度。
3)在默认情况下,一个集群会将同一份数据保存3份,因此需要三个DataNode,而nodemanager和DataNode为不能分开,所以一个五脏俱全的集群,需要六台机器,一台作namenode,一台作resourcemanager,一台作second namenode,然后三台DataNode和nodemanager。
一、准备工作
1、hadoop和jdk的tar包,因为MapReduce程序是由java写的,所以需要jdk做支撑。
2、一台纯净的虚拟机(本文以CentOS7为准)
①、创建普通用户hadoop1,vim /etc/sudoers中配置hadoop1 拥有sudo权限。
②、vim /etc/hosts文件,配置IP地址与主机名映射,以便集群中的机器可以通过主机名相互ping通,其功能类似于,输入www.baidu.com可以访问百度的服务器,而不用输入百度服务器的IP地址。
③、修改本机主机名,使用命令hostnamectl set-hostname 主机名,修改完成后可以使用hostname查看修改结果。此步骤每台机器都要执行
④、vim /etc/sysconfig/network-scripts/ifcfg-ens33,修改本机的IP地址和一些配置,此步骤每台机器都要执行。
需要注意的是,这一步在CentOS7和CentOS6中略有不同,与CentOS6 不同的是,CentOS7在克隆机器时,克隆出来的机器并不会继承源虚拟机的mac地址,而是动态生成一个Mac地址,因此不会产生Mac地址冲突,但是在CentOS6中,克隆机会继承源虚拟机的Mac地址,但是由于链路层链路层协议要求Mac地址唯一性,所以克隆机也会生成一个新的Mac地址,并且会使用新的那个Mac地址,这就导致在CentOS5的克隆机中/etc/udev/rules.d/70-persient-net.rules中会出现两段IP地址的情况,虽然虚拟机会采第二个,但是在这段Mac地址后面,同时也重新指定了本机的网关,也就是说,在物理层,由于两台机器采用了不同的网关,造成了两台机器不在同一网段的问题,但是由于源虚拟机和克隆机的IP地址的网络号相同,子网掩码也相同,在网络层,两台机器又处在了同一网段,前后冲突,所以在CentOS6中,除了删除文件中继承而来的那一段mac地址的内容,还要将新产生的Mac地址后面的网关改成与克隆机相同的网关,然后在将新产生的mac地址同步到ip上面的ip地址的配置文件中。总之记住一点:CentOS6的配置和CentOS7有别。
在CentOS6中搭建集群的具体步骤如下:
1. 创建第一台虚拟机,修改hostname文件:vim /etc/sysconfig/network。
2. 点击VMware查看ip地址(切勿使用类型为仅注意的网段):
3. 查看本地的DNS地址:
打开网络和共享中心:
查看DNS地址:
4. 修改虚拟机的ip配置文件:
5. 修改防火墙:service iptsbles stop,永久关闭:chkconfig iptables off。
6. 修改hosts文件
7. 拍快照记录当前状态,并关闭虚拟机。
8. 克隆虚拟机,修改/etc/sysconfig/network文件,修改/etc/udev/rules.d/70-persient-net.rules文件删除第一行继承来的记录,把第二行的eth1改为eth0,记录下UUID。
9. 修改ip配置文件的ip地址和UUID,重启。其他虚拟机重复8,9两步。
3、安装hadoop和jdk
①、删除CentOS自带的jdk,安装8版本,具体参考:https://www.cnblogs.com/happyflyingpig/p/8068020.html,配置完成后执行 source /etc/profile让配置立即生效。
4、修改hadoop配置文件
①、配置core-site.xml
fs.defaultFS即默认的文件系统,如果不修改文件系统,则会使用默认的文件系统,即Linux的文件系统。
这里的hadoop101是主机名,在配置这个运行时产生文件的存储目录之前,是没有data/tmp目录的,默认情况下运行时数据会被存放在本机文件系统的tmp目录中,即Linux的/tmp/目录下,但是这这个目录有一个问题:当存储空间不够用时,系统会自动来清除这个没目录下的内容,如果将hadoop运行时产生的数据存放在此目录中,是不安全的。所以这里需要另外指定运行时产生文件的存储目录。
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
②、配置:hadoop-env.sh
修改JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
③、配置:yarn-env.sh
修改JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
④、配置:yarn-site.xml,指定resourcemanager和日志聚集
日志文件是用来分析错误的文件,如果日志不聚集起来,那么当程序出错时,就需要到集群中具体的报错的那台机器上查看日志文件,而有了日志聚集,就可以在聚集日志中分析错误。
<!-- Reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop102</value> </property> <!—hadoop101是主机名,对应hosts文件中的IP地址 --> <!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日志保留时间设置7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
⑤、配置:mapred-env.sh
修改JAVA_HOME 路径:export JAVA_HOME=/opt/module/jdk1.8.0_144
⑥、配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
[atguigu@hadoop101 hadoop]$ mv mapred-site.xml.template mapred-site.xml [atguigu@hadoop101 hadoop]$ vi mapred-site.xml <!-- 指定MR运行在YARN上 ,在之前的配置中我们切换了hdfs默认的文件系统,这里切换了默认的资源调度器,为yarn--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
⑦、继续配置:mapred-site.xml
<!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop103:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop103:19888</value> </property>
⑧、配置:hdfs-site.xml
<property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定Hadoop辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop103:50090</value> </property>
⑨、配置:slaves文件
vim /opt/module/hadoop-2.7.2/etc/hadoop/slaves #datanode&nodemanager hadoop104 hadoop105 hadoop106
⑩、书写分发脚本
将分发脚本实际上使用的是rsync命令,相似功能的还有scp命令,两者区别放在本文末尾讲解。这里之所以将分发脚本写在/home/hadoop1/bin,是因为这个目录被设置成了环境变量。如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下。
[hadoop1@hadoop101 ~]$ mkdir bin [hadoop1@hadoop101 ~]$ cd bin/ [hadoop1@hadoop101 bin]$ touch xsync [hadoop1@hadoop101 bin]$ vi xsync #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if ((pcount==0)); then echo no args; exit; fi #2 获取文件名称 p1=$1 fname=`basename $p1` echo fname=$fname #3 获取上级目录的绝对路径 -P追踪绝对路径 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir #4 获取当前用户名称 user=`whoami` #5 循环 for((host=102; host<107; host++)); do echo ------------------- hadoop$host -------------- rsync -av $pdir/$fname $user@hadoop$host:$pdir done
对第三步的理解:
所以,在上面第三步中加了 -P 就是为了防止源目录是一个软连接,而软连接里面没有实质的内容。dirname 目录名:获取到的是一个 . ,而如果cd -P . 就会获取到此目录名所在的绝对路径。
最后修改脚本权限!
二、创建集群
在第一部准备工作完成后,可以拍一个快照,作为克隆机的模板。我们需要克隆六台机器的模板。克隆完成后,打开所有机器,需要单独配置IP地址配置文件和主机名。其他本机配置文件如hosts和profile使用分发脚本分发即可。
分发命令 xsync /etc/profile /etc/hosts /etc/sudoers
分发脚本本身:xsync /home/hadoop1/bin
分发software和module:xsync /opt
三、配置集群内机器无密登陆
在第二步分发文件时,会不停的输入密码,比较烦。
无密登陆的原理使用了非对称加密。
生成公钥和私钥:[hadoop1@hadoop101 ~]$ ssh-keygen -t rsa,然后使用分发脚本分发到每台机器上(这样做在生产环境比较危险,这里只是为了方便)。
一台机器是否能无密连另一台机器,要看另一台机器上是否有保存公钥的authorized_keys文件,这个文件仅仅保存了公钥文件,不包含机器的身份信息,如果没有此文件,即使是本机登陆本机,也需要密码。
在分发完成后就可以实现无密登陆了。
四、群起集群
(1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据,注意格式化后不需要统一hadoop-2.7.2文件目录,仅namenode格式化就行。
(2)启动HDFS
[atguigu@hadoop101 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop101 hadoop-2.7.2]$ jps
4166 NameNode
4482 Jps
[atguigu@hadoop103 hadoop-2.7.2]$ jps
3283 SecondaryNameNode
3364 Jps
(3)启动YARN
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
五、集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。给集群配置时间同步并不是面向hadoop的,而是面向kafka和hbase的,他们对时间的同步性要求比较高,高到毫秒级的误差都是不允许的,所以要配置集群时间同步,时间是同步的,但不一定是正确的,但kafka和habase并不关心正确性。
- 时间服务器配置(必须root用户)
类似于windows的时间是跟网络同步的,Linux也是跟网络同步的,这个同步的协议就叫ntp(网络时间协议)协议,但是这种同步是外网同步,同步性不是那么高,所以需要配置内网同步。
(1)检查ntp是否安装,一般来说mini包安装是没有的,需要手动安装一下。
[root@hadoop101 桌面]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
然后查看集群上所有机器的ntpd是否正在运行(service ntpd status),如果在运行则需要关闭
(2)修改ntp配置文件
[root@hadoop101 桌面]# vi /etc/ntp.conf
修改内容如下
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@hadoop101 桌面]# vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
[root@hadoop101 桌面]# service ntpd status
ntpd 已停
[root@hadoop101 桌面]# service ntpd start
正在启动 ntpd: [确定]
(5)设置ntpd服务开机启动
[root@hadoop101 桌面]# chkconfig ntpd on
2. 其他机器配置(必须root用户)
(1)在其他机器配置每1分钟与时间服务器同步一次
[root@hadoop102桌面]# crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop101
测试:
(2)修改任意机器时间
[root@hadoop102桌面]# date -s "2017-9-11 11:11:11"
(3)1分钟后查看机器是否与时间服务器同步
[root@hadoop102桌面]# date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。