实验环境:
1 | Centos7 |
安装包版本:
1 | hadoop-2.7.3.tar.gz |
基础环境搭建及Zookeeper搭建
修改主机名
本次集群搭建共有三个节点,包括一个主节点master,和两个从节点slave1和slave2。具体操作如下 :
1.以主机点master为例,首次切换到root用户:su
2.修改主机名为master:hostnamectl set-hostname <hostsname>
3.永久修改主机名,编辑/etc/sysconfig/network文件,内容如下:
NETWORKING=yes
HOSTNAME=master
保存该文件,重启计算机:reboot
查看是否生效:hostname
配置hosts文件
使各个节点能使用对应的节点主机名连接对应的地址。
hosts文件主要用于确定每个结点的IP地址,方便后续各结点能快速查到并访问。在上述3个虚机结点上均需要配置此文件。由于需
要确定每个结点的IP地址,所以在配置hosts文件之前需要先查看当前虚机结点的IP地址是多少.
1.可以通过ifconfig命令进行查看
2.查看节点地址之后将三个节点的ip地址以及其对应的名称写进hosts文件。这里我们设置为master、slave1、slave2
。注意保存退出。
关闭防火墙
centos7中防火墙命令用firewalld取代了iptables,当其状态是dead时,即防火墙关闭。
关闭防火墙:systemctl stop firewalld
查看状态:systemctl status firewalld
配置时间同步
配置SSH免密码登陆
SSH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数据的安全性和可
靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取
数据。总而言之,这是一种非对称算法,想要破解还是非常有难度的。Hadoop集群的各个结点之间需要
进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证,hadoop采用的是ssh的方法通
过密钥验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行
验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提
高访问效率。
- 每个结点分别产生公私密钥:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
(三台机器)
秘钥产生目录在用户主目录下的.ssh目录中,进入相应目录查看:cd .ssh/
2.Id_dsa.pub为公钥,id_dsa为私钥,紧接着将公钥文件复制成authorized_keys文件:(仅master)cat id_dsa.pub >> authorized_keys
(注意在.ssh/路径下操作)
在主机上连接自己,也叫做ssh内回环。
ssh master
让主结点master能通过SSH免密码登录两个子结点slave。(slave中操作)
为了实现这个功能,两个slave结点的公钥文件中必须要包含主结点的公钥信息,这样当master就可以顺利安全地访问这两个slave结点了。
slave1结点通过scp命令远程登录master结点,并复制master的公钥文件到当前的目录下,且重命名为master_das.pub
,这一
过程需要密码验证。
scp master:~/.ssh/id_dsa.pub ./master_das.pub
将master结点的公钥文件追加至authorized_keys文件。
cat master_dsa.pub >> authorized_keys
这时,master就可以连接slave1了。
slave1结点首次连接时需要,“yes”确认连接,这意味着master结点连接slave1结点时需要人
工询问,无法自动连接,输入yes后成功接入,紧接着注销退出至master结点。
同理slave2中也是这么操作。
注意:两个结点的ssh免密码登录已经配置成功,还需要对主结点master也要进行上面的同
样工作,因为jobtracker有可能会分布在其它结点上,jobtracker有不存在master结点上的可能性。
在上一步骤中,我们已经进行过此操作,这里仅做提醒。
JDK简介及其安装
1.首先建立工作路径/usr/java1
2mkdir -p /usr/java
tar -zxvf /opt/soft/jdk-8u171-linux-x64.tar.gz -C /usr/java/
2.修改环境变量
修改环境变量:vi /etc/profile
添加内容如下:
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$ JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
生效环境变量:source /etc/profile
查看java版本:java -version
同理slave节点,相同安装步骤。
注意:如果在slave节点中安装较慢,可以使用scp命令,将相同的文件从master中复制过来。
在master中将JDK复制到slave2中.
Zookeeper简介
Zookeeper工作原理
ookeeper字面上理解就是动物管理员,Hadoop生态圈中很多开源项目使用动物命名,例如:Hive(蜜蜂)、Pig(小猪)。这就需要一个管理员来管理这些“动物”。在集群的管理中Zookeeper起到非常重要的角色负责分布式应用程
序协调的工作——它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
Zookeeper服务自身组成一个集群(2n+1个服务允许n个失效)。Zookeeper服务有两个角色,一个是leader,负责写服务
和数据同步,剩下的是follower,提供读服务,leader失效后会在follower中重新选举新的leader。
1.客户端可以连接到每个server,每个server的数据完全相同。
2.每个follower都和leader有连接,接受leader的数据更新操作。
3.Server记录事务日志和快照到持久存储。
4.大多数server可用,整体服务就可用。
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和Leader的状态同步以后,恢复模式就结束了。状态同步保证了Leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,Zookeeper采用了递增的事务ID号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。zxid是一个64位的数字,它高32位是epoch用来标识Leader关系是否改变,每次一个Leader被选出来,它都会有一个新的epoch,标识当前属于那个Leader的统治时期。低32位用于递增计数。
每个Server在工作过程中有三种状态:
LOOKING:当前Server不知道Leader是谁,正在搜寻;
LEADING:当前Server即为选举出来的Leader;
FOLLOWING:leader已经选举出来,当前Server与之同步。
Zookeeper的出现解决了这个问题。首先Zookeeper简化了一个选举算法,实现原子广播协议,简称Zab协议。举个例子:
一个Zookeeper集群有一个Leader,其他的都是Follower跟随者(或者Observer观察者),这个Leader是怎么选举出来的呢?一开始三台机器ABC,分别启动Zookeeper以后,发现没有Leader,就提议进行Leader选举,只要半数以上通过就算成功,过程为:
A提案说,我要选自己,B你同意吗?C你同意吗?B说,我同意选A;C说,我同意选A。(注意,这里超过半数了,其实在现实世界
选举已经成功了。但是计算机世界是很严格,另外要理解算法,要继续模拟下去。)
接着B提案说,我要选自己,A你同意吗;A说,我已经超半数同意当选,你的提案无效;C说,A已经超半数同意当选,B提案无效。
接着C提案说,我要选自己,A你同意吗;A说,我已经超半数同意当选,你的提案无效;B说,A已经超半数同意当选,C的提案无效。
选举已经产生了Leader,后面的都是Follower,只能服从Leader的命令。
Zookeeper角色说明
这个过程产生了leader后,Zookeeper就可以开始工作了,工作的过程中,理论上每个Zookeeper的数据都是一致的,如
果某一个节点出了问题,只要还有超过半数的节点正常,那整个集群就可以正常工作,所以Zookeeper首先实现了自己的高可用,然后Zookeeper还可以保存数据,协调控制数据。
安装
修改主机名称到IP地址映射配置。
vi /etc/hosts
1
2
3192.168.15.104 master master.root
192.168.15.127 slave1 slave1.root
192.168.15.124 slave2 slave2.root修改ZooKeeper配置文件。在其中一台机器(master)上,用tar -zxvf命令
解压缩zookeeper-3.4.6.tar.gz
解压缩zookeeper-3.4.6.tar.gz
- 配置文件zoo.cfg
进入zookeeper配置文件夹conf,将zoo_sample.cfg文件拷贝一份命名为zoo.cfg,Zookeeper在启动时会找这个文件作为默认配置文件。
cd /usr/zookeeper/zookeeper-3.4.10/conf/
scp zoo_sample.cfg zoo.cfg
对zoo.cfg文件配置如下:
tickTime=2000
#基本事件单元,以毫秒为单位。它用来指示心跳,最小的session过期
时间为两倍的tickTime
initLimit=10
syncLimit=5
dataDir=/usr/zookeeper/zookeeper-3.4.10/zkdata
#dataDir 为存储内存中数据库快照的位置,如果不设置参数,更新事务
日志将被存储到默认位置。这里使用我们自己设定位置。
clientPort=2181
dataLogDir=/usr/zookeeper/zookeeper-3.4.10/zkdatalog
#指定zookeeper产生日志村放目录路径
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server.A=B:C:D
A:是一个数字(机器重启默认从0开始),表示这个是第几号服务器;
B:是这个服务器的ip地址,zookeeper是在hosts中映射了本机的IP,因此也可以写为服务器的映射名;
C:表示的是这个服务器与集群中的Leader服务器交换信息的端口;
D:表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,
而这个端口就是用来执行选举时服务器相互通信的端口。
2888端口号是服务之间通信的端口,而3888是zookeeper与其他应用程序通信的端口。
在zookeeper的目录中,创建配置中所需的zkdata和zkdatalog两个文件夹。
1 | mkdir zkdata |
- 进入zkdata文件夹,创建文件myid,用于表示是几号服务器。master主机中,设置服务器id为1。
6.远程复制分发安装文件。
以上已经在主节点master上配置完成ZooKeeper,现在可以将该配置好的安装文件远程拷贝到集群中的各个结点对应的目录下(这时候子节点):
1 | scp -r /usr/zookeeper root@slave1:/usr/ |
- 设置myid。在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来
标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字。
cd /usr/zookeeper/zookeeper-3.4.10/zkdata
slave1中为2
slave2中为3
- 修改/etc/profile文件,配置zookeeper环境变量。
vi /etc/profile
#set zookeeper environment
export ZOOKEEPER_HOME=/usr/zookeeper/zookeeper-3.4.10
PATH=$PATH:$ZOOKEEPER_HOME/bin
- 启动ZooKeeper集群。在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本。注意在zookeeper目录下:
1
2bin/zkServer.sh start
bin/zkServer.sh status
通过上面状态查询结果可见,一个节点是Leader,其余的结点是Follower
至此,zookeeper安装成功
Hadoop集群搭建
解压安装包
创建工作目录:mkdir –p /usr/hadoop
解压hadoop:tar -zxvf /opt/soft/hadoop-2.7.3.tar.gz -C /usr/hadoop/
配置Hadoop环境变量
修改/etc/profile文件
1 | #HADOOP |
生效配置文件:source /etc/profile
Hadoop各组件
hadoop的各个组件的都是使用XML进行配置,这些文件存放在hadoop的etc/hadoop目录下。
Common组件 core-site.xml
HDFS组件 hdfs-site.xml
MapReduce组件 mapred-site.xml
YARN组件 yarn-site.xml
hadoop-env.sh
修改java环境变量:
export JAVA_HOME=/usr/java/jdk1.8.0_171
core-site.xml
1 | <configuration> |
yarn-site.xml
1 | <configuration> |
设置节点文件
编写slave文件,添加子节点slave1和slave2
编写master文件,添加主节点master
分发hadoop
scp -r /usr/hadoop root@slave1:/usr/
scp -r /usr/hadoop root@slave2:/usr/
格式化HDFS
格式化namenode:hadoop namenode -format
安装Scala
我们需要在拥有hadoop集群的所有节点中安装scala语言环境,因为spark的源代码为scala语言所编写,所以接下来我们进行安装scala。
首先我们进入到本系统的/opt/soft
路径下可以看到我们所提供的scala安装包,接下来我们在/usr/
下创建scala文件夹,然后解压scala到我们所创建的scala工作路径中
解压scala的tar包
配置scala的环境变量
更新环境变量并查看版本号
发送至所有子节点
scp -r /usr/scala root@slave1:/usr/
scp -r /usr/scala root@slave2:/usr/
安装Spark
解压spark的tar包:
首先我们进入到本系统的/opt/soft
路径下可以看到我们所提供的spark安装包,接下来我们在/usr/
下创建spark文件夹,然后解压spark到我们所创建的spark工作路径中
复制spark-env.sh模板
我们需要将spark-env.sh.template复制为spark-env.sh,命令为:cp spark-env.sh.template spark-env.sh
.
当复制出spark-env.sh文件后我们可以使用vim进行编译,
配置spark-env.sh文件
添加以下内容
export SPARK_MASTER_IP=master
export SCALA_HOME=/usr/scala/scala-2.11.12
export SPARK_WORKER_MEMORY=8g
export JAVA_HOME=/usr/java/jdk1.8.0_171
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HADOOP_CONF_DIR=/usr/hadoop/hadoop-2.7.3/etc/hadoop
配置spark从节点,修改slaves文件
命令:cp slaves.template.template slaves
使用vim命令编辑 slaves
slave1
slave2
配置spark环境变量
export SPARK_HOME=/usr/spark/spark-2.4.0-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$PATH
发送配置好的spark安装包到子节点
scp -r /usr/spark root@slave1:/usr/
scp -r /usr/spark root@slave2:/usr/
修改slave1和slave2的环境变量