hadoop高可用hdfs搭建(三节点)

hadoop高可用HDFS搭建(三节点)

一:准备工作

本次搭建使用的hadoop版本是2.6.5,使用虚拟机准备三个干净的节点服务器,我们从零开始搭建。规范下三个节点的主机名分别是node003,node004,node005。

1.1 搭建的节点角色分布图

hadoop高可用hdfs搭建(三节点)_第1张图片

其中node003和node004是NameNode角色,node003,node004,node005会作为DataNode角色,node003,node004,node005会作为zookeeper的集群环境。ZKFC(ZKFailoverController process:zookeeper故障转移进程),JNN(JournalNodes)实现主角色(NameNode)之间的切换时,配置数据同步进程

1.2 主机名配置以及hosts文件配置

#修改主机名所在的文件,修改里头的HOSTNAME的值即可
vi /etc/sysconfig/network
#在如下文件中,配置主机名和ip地址的对应关系,让各个节点之间能正常通信
vi /etc/hosts

1.3 jdk环境(使用jdk1.8)配置

jdk1.8下载地址(网盘资源)
链接:https://pan.baidu.com/s/1HUx1nfatgL0Ld0xPbqAy4w
提取码:d2us

#添加如下配置到/etc/profile中
#配置JAVAHOME路径。即下载的jdk源码包后解压的路径
export JAVA_HOME=/usr/local/java/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
#将JAVAHOME和JREHOME加入到环境变量中
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
#将配置完毕后的PATH路径导出
export PATH=$PATH:${JAVA_PATH}

1.4 将jdk的配置文件以及jdk的源码包分发到其他节点上

#做分发之前,需要切换到备份发文件所在的路径
#切换到jdk源码包所在的位置
cd /usr/local/java
#将源码包分发到node004节点上的当前路径,node005同理
scp jdk-8u171-linux-x64.tar.gz root@node004:`pwd`
#将修改好的profile文件分发到其他节点
scp profile root@node004:`pwd`

1.5 各个节点之间的免密登录配置(很重要)

产生.ssh路径
#切换到根路径下的.ssh路径,如果没有这个路径,先执行以下命令
ssh localhost
#提示输入密码,切换后,就会产生一个新的.ssh路径在/root下
#退出切换的会话
exit
生成公钥和私钥文件对
#执行如下命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
#生成一个id_dsa.pub文件,将这个文件的内容追加到authorized_keys文件中
#追加的目的是能让自己免密登录自己
cat id_dsa >> authorized_keys
#将公钥文件分发到其他节点上,需要先确定其他节点也有.ssh路径,没有需要通过ssh localhost的方式进行创建
#分发命令如下,分发后更改下名字
scp id_dsa.pub root@node004:`pwd`/node003_dsa.pub
scp id_dsa.pub root@node005:`pwd`/node003_dsa.pub
#分发后,在各自的节点上将node003_dsa.pub追加到自己的authorized_keys文件中,实现node003到node004以及node005的免密登录
#同理将node004生成的pub文件分发到node003以及node005上,实现node004到node003以及node005的免密登录,node005同理操作

免密登录配置以及jdk环境配置完毕后,接下来就是hadoop的相关配置了,准备工作到此完毕。

二:hadoop2.6.5的HDFS搭建

提供资源下载地址:
链接:https://pan.baidu.com/s/1AtjMGnL5hOCgehIpsUCxDg
提取码:z27x

注意:各个节点之间需要做时间同步

date -s 'yyyy-MM-dd HH:mm:ss'

2.1: 将hadoop源码包上传到节点服务器

在这里插入图片描述

解压压缩包,得到解压后的路径hadoop-2.6.5

#解压hadoop源码包
tar zxvf hadoop-2.6.5.tar.gz

2.2: 配置hadoop的环境变量以及hadoop中配置jdk的JAVA_HOME

hadoop中配置JAVA_HOME

#切换到hadoop的配置文件所在路径
cd /usr/local/java/hadoop-2.6.5/etc/hadoop
#编辑以下三个文件,分别找到export JAVA_HOME的位置,将相应的值替换成真实的路径即可
vi hadoop-env.sh
vi mapred-env.sh
vi yarn-env.sh

profile中配置hadoop路径

#在/etc/profile中追加如下内容
export HADOOP_HOME=/usr/local/java/hadoop-2.6.5
export HADOOP_PATH=${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin
export PATH=$PATH:${HADOOP_PATH}

2.3: 配置高可用集群环境

hdfs-site.xml配置文件如下:

<configuration>
    #配置每个block块的副本数为2
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    #配置SecondaryNameNode节点浏览器访问的地址以及端口号
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node003:50090</value>
    </property>
    #定义集群的服务名称mycluster
	<property>
	  <name>dfs.nameservices</name>
	  <value>mycluster</value>
	</property>
	#配置该集群下的nameNode节点的别名nn1 nn2
	<property>
	  <name>dfs.ha.namenodes.mycluster</name>
	  <value>nn1,nn2</value>
	</property>
	#配置NameNode的nn1节点的内部通信地址+端口号
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
	  <value>node003:8020</value>
	</property>
	#配置NameNode的nn2节点的内部通信地址+端口号
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
	  <value>node004:8020</value>
	</property>
	#配置NameNode节点web端访问的地址和端口号
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn1</name>
	  <value>node003:50070</value>
	</property>
	#配置NameNode的nn2节点web端访问的地址和端口号
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn2</name>
	  <value>node004:50070</value>
	</property>
	#配置NameNode之间同步元数据的进程节点信息(JNN节点  JournalNodes)
	<property>
	  <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node003:8485;node004:8485;node005:8485/mycluster</value>
	</property>
	#配置JournalNode角色的nameSpace的路径
	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/var/mySelf/hadoop/ha/jn</value>
	</property>
	#配置HDFS的客户端Clients和Actibe NameNode通信的代理类(一个Java Class)
	<property>
	  <name>dfs.client.failover.proxy.provider.mycluster</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	#配置当Standy By的NameNode需要成为主的时候,强制杀死另外一个NameNode
	<property>
	  <name>dfs.ha.fencing.methods</name>
	  <value>sshfence</value>
	</property>
	<property>
	  <name>dfs.ha.fencing.ssh.private-key-files</name>
	  <value>/root/.ssh/id_dsa</value>
	</property>
	#配置开启自动故障转移
	<property>
	   <name>dfs.ha.automatic-failover.enabled</name>
	   <value>true</value>
	 </property>
</configuration>

core-site.xml配置文件如下

<configuration>
	#在hdfs-site.xml中配置的集群名称
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    #当前集群环境的元数据存储路径
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/mySelf/hadoop/ha</value>
    </property>
    #zookeeper集群地址,用来协调NameNode和JournalNode之间的交互
	<property>
	   <name>ha.zookeeper.quorum</name>
	   <value>node003:2181,node004:2181,node005:2181</value>
	</property>
</configuration>

补充说明:

需要在如下路径中的文件加上dataNode的节点主机名信息。不然dataNode无法启动

cd /usr/local/java/hadoop-2.6.5/etc/hadoop
vi salves
#在这个文件中添加dataNode节点的主机名信息
node003 node004 node005

2.4 创建hadoop配置文件中指定的相应的路径

元数据的存储路径,在core-site.xml中定义的

mkdir -p /var/mySelf/hadoop/ha

JournalNode的nameSpace路径,在hdfs-site.xml中定义的

mkdir -p /var/mySelf/hadoop/ha/jn

2.5 分发hadoop集群的文件包到另外一个NameNode上,JournalNode的路径文件需要分发到三个JournalNode中

cd /usr/local/java
#将配置好的hadoop包分发到另一个NameNode节点上
scp -r hadoop-2.6.5 root@node004:`pwd`
#因为node005上要启动JournalNode,也需要有这个源码包以及JournalNode的nameSpace路径
scp -r hadoop-2.6.5 root@node005:`pwd`
#将NameNode元数据存储路径的文件夹分发到另一个NameNode节点上
cd /var/
scp -r /var/mySelf/ root@node004:`pwd`
#将JournalNode的地址分发到另外两个JournalNode节点服务器上,在hdfs-site.xml中有定义
cd /val/mySelf/
scp -r hadoop root@node004:`pwd`
scp -r hadoop root@node005:`pwd`

到此,hadoop高可用的环境准备就此完毕

三:Zookeeper集群环境搭建

在搭建Hadoop的HDFS环境中,必须会依赖zookeeper做协调。
下载地址:
参考上边的地址中,包含了hadoop的安装包以及zookeeper的安装包。

3.1 将安装包上传到服务器进行解压

tar zxvf zookeeper-3.4.6.tar.gz

得到解压后的路径 /usr/local/java/zookeeper-3.4.6,进入到解压后的zookeeper路径中

cd /usr/local/java/zookeeper-3.4.6
cd conf/
#修改配置文件名称
mv zoo_sample.cfg zoo.cfg

3.2 编辑配置文件zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/var/mySelf/zooKeeperDataDir
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#配置集群环境2888是zookeeper选举leader和follower的时候的通信端口 3888是zookeeper服务器之间的通信端口
server.0=192.168.187.132:2888:3888
server.1=192.168.187.133:2888:3888
server.2=192.168.187.129:2888:3888

3.3 根据配置的dataDir的值创建相应的路径

#dataDir=/var/mySelf/zooKeeperDataDir
mkdir -p /var/mySelf/zooKeeperDataDir
echo 0 > myid

注意: echo 0 > myid 的时候,这个数字是0还是其他,取决于zoo.cfg中配置集群环境是server.编号值 server.0对应的服务器的myid的内容就是0 server.1对应的服务器的myid的内容就是1 这个值得大小决定服务器启动后,谁是主谁是从,值大的就是leader 否则就是follower

3.4 配置zookeeper的环境变量
编辑/etc/profile文件,追加如下内容

export ZOOKEEPER_HOME=/usr/local/java/zookeeper-3.4.6
export PATH=$PATH:${ZOOKEEPER_HOME}/bin

3.5 zookeeper安装包以及dataDir以及环境变量的文件分发到其他节点上

cd /usr/local/java/
scp -r zookeeper-3.4.6 root@node004:`pwd`
scp -r zookeeper-3.4.6 root@node005:`pwd`

cd /etc/
scp profile zookeeper-3.4.6 root@node004:`pwd`
scp profile zookeeper-3.4.6 root@node005:`pwd`

cd /var/mySelf/
scp -r zooKeeperDataDir root@node004:`pwd`
scp -r zooKeeperDataDir root@node004:`pwd`

3.6 更改其他两个节点的myid里头的值,根据zoo.cfg中配置的值进行设定,接着启动zookeeper集群

#启动命令
zkServer.sh start
#查看启动的状态
zkServer.sh status

四:hadoop集群启动

4.1: 启动JournalNode集群(JNN),一共三个节点

#三个节点分别启动
hadoop-daemon.sh start journalnode

4.2:格式化一个NameNode节点,并且同步另一个

#格式化NameNode,随便找一个节点执行:
hdfs namenode -format
#启动被格式化的那个NameNode节点的NameNode进程
hadoop-daemon.sh start namenode
#另一个NameNode进行同步操作
#在node004上操作
hdfs namenode -bootstrapStandby

4.3: 格式化ZKFC进程,并且启动hdfs集群

#格式化zkfc,在zookeeper中可见目录创建:
hdfs zkfc -formatZK
#格式化成功会提示:(ha.ActiveStandbyElector: Successfully created /hadoop-ha/mycluster in ZK.)

#启动HDFS集群:
start-dfs.sh

五:MapReduce(计算框架)框架引入HDFS中

5.1: 在任意一个ResourceManager中修改如下配置文件
修改配置文件名称

mv mapred-site.xml.template  mapred-site.xml

修改文件内容

<configuration>
	#使用yarn来管理
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5.2: 配置yarn-site.xml

<configuration>
    <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
    </property>
    #开启高可用
    <property>
         <name>yarn.resourcemanager.ha.enabled</name>
         <value>true</value>
    </property>
    #定义ResourceManage集群的名称id
    <property>
         <name>yarn.resourcemanager.cluster-id</name>
         <value>cluster1</value>
    </property>
    #配置ResourceManage下的节点id信息
    <property>
         <name>yarn.resourcemanager.ha.rm-ids</name>
         <value>rm1,rm2</value>
    </property>
    #配置第一个节点
    <property>
         <name>yarn.resourcemanager.hostname.rm1</name>
         <value>node004</value>
    </property>
    #配置第二个节点
    <property>
         <name>yarn.resourcemanager.hostname.rm2</name>
         <value>node005</value>
    </property>
    #配置zookeeper集群
    <property>
        <name>yarn.resourcemanager.zk-address</name>
         <value>node003:2181,node004:2181,node005:2181</value>
    </property>
</configuration>

你可能感兴趣的:(hadoop高可用hdfs搭建(三节点))