hadoop HA(高可用)集群全分布模式安装

  • Post author:
  • Post category:其他

hadoop HA(高可用)集群全分布模式安装

提示:该配置基于前面章节已经安装好的hadoop全分布式集群、zookeeper组件基础上才能执行本章操作


文章目录


前言

linux 目录约定
/opt/software 存放软件安装包
/usr/local/src 存放安装好的软件

提示:安装环境列表

服务器主机/IP:Master(192.168.52.141) slave1(192.168.52.142) slave2(192.168.52.143)
JDK环境:jdk1.8.0_141 jdk1.8.0_141 jdk1.8.0_141
HDFS:NameNode NameNode(增加)SecondaryNameNode(取消)
JournalNode(增加)
DataNode(增加)
DFSZKFailoverController(增加) JournalNode(增加)
DFSZKFailoverController(增加)
DataNode JournalNode(增加)
DataNode

YARN:ResourceManager
NodeManager(增加) ResourceManager e(增加)
NodeManager NodeManager
MapReduce JobHistoryServer

zookeeper(3.4.8): QuorumPeerMain QuorumPeerMain QuorumPeerMain

Leader/follower(由集群自己投票产生leader角色) Leader/follower(由集群自己投票产生leader角色) Leader/follower(由集群自己投票产生leader角色)


提示:以下是本篇文章正文内容,下面案例可供参考

一、删除hadoop分布式集群的文件(没有则不用)

1、关闭hadoop集群、关闭hdfs和yarn

stop-all.sh

2、关闭JobHistory

mr-jobhistory-daemon.sh stop historyserver

3、检查hadoop集群的各节点关闭情况

正常情况下应该只有jps和zookeeper的QuorumPeerMain进程还在运行

4、删除hadoop集群

rm -rf /usr/local/src/hadoop

二、安装hadoop高可用集群

1、上传hadoop安装包到master节点

将hadoop-2.7.1.tar.gz从windows拷贝到master节点的/opt/software目录下(方法参考JDK拷贝)

2、在master节点解压hadoop-2.7.1.tar.gz到安装目录

tar -zxvf /opt/software/hadoop-2.7.1.tar.gz -C /usr/local/src/

3、在master节点更改hadoop-2.7.1安装文件夹的名字,方便后续操作

mv /usr/local/src/hadoop-2.7.1 /usr/local/src/hadoop

4、在master节点配置hadoop环境变量

(1)、打开/etc/profile文件
vi /etc/profile
(2)、在打开的配置文件修改原来的环境变量如下
#hadoop环境变量
export HADOOP_HOME=/usr/local/src/hadoop  #HADOOP_HOME 指向hadoop安装目录
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin  #将hadoop的bin、sbin目录放入path,方便在全局执行hadoop的相关命令。

#hadoop高可用必须配置的环境变量,名称按照hadoop官方要求
export HADOOP_PREFIX=$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 HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

(3)、让修改后的/etc/profile文件生效(否则要重启才能生效)
source /etc/profile
(4)、检查环境变量是否配置成功

说明:输出hadoop的版本号,如果出现下图表示配置成功

hadoop version
(5)、在master节点配置hadoop-env.sh(同全分布式集群配置)

首先打开hadoop-env.sh配置文件

vi /usr/local/src/hadoop/etc/hadoop/hadoop-env.sh

在文件末尾或是指定地方加入配置信息,并保存

#配置hadoop运行所需要的JDK环境变量
export JAVA_HOME=/usr/local/src/java
(6)、在master节点配置core-site.xml

说明:core-site.xml文件表示Hadoop核心全局配置文件,可在其他配置文件中引用该文件
首先打开core-site.xml配置文件

vi /usr/local/src/hadoop/etc/hadoop/core-site.xml

在<configuration>标签中加入配置信息
(代码中用<!-- -->括起来的是说明,可不写)

<!-- 高可用配置必须修改,指定 hdfs 的 nameservice 为 mycluster,因为这里已经不止一个namenode,用原来的hdfs://master:9000来表示不合适,所以用一个统一的地址,有集群分配哪个节点显示 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!--
必备配置,同分布式集群,hadoop.tmp.dir:指定hadoop临时目录,前面用file:表示是本地目录。有的教程上直接使用/usr/local,如果是本机不加file:也可以。
特别说明,如没有配置 hadoop.tmp.dir 参数,此时系统默认的临时目录为:/tmp/hadoop-hadoop。该目录在每次 Linux 系统重启后会被删除,必须重新执行 Hadoop 文件系统格式化命令,否则 Hadoop 运行会出错。因此一般要自己建立一个临时目录
-->
<property>
  <name>hadoop.tmp.dir</name>
  <value>file:/usr/local/src/hadoop/tmp</value>
</property>
<!-- 高可用配置,指定用于HA的ZooKeeper集群机器列表。其中2181为zookeeper默认的客户端接听端口号 -->
<property>
  <name>ha.zookeeper.quorum</name>
  <value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- 高可用配置,hadoop 链接 zookeeper 的超时时长设置,单位毫秒 -->
<property>
  <name>ha.zookeeper.session-timeout.ms</name>
  <value>30000</value>
  <description>ms</description>
</property>
<!--hadoop里的trash选项默认是关闭的,也就是默认删除的文件将直接删除。这里设置了之后,在设定的回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟-->
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>

Esc + wq + 回车 保存

根据配置中hadoop.tmp.dir的设置,在linux中新建/usr/local/src/hadoop/tmp目录

mkdir /usr/local/src/hadoop/tmp
(7)、12.4.7 在master节点配置hdfs-site.xml

说明:hdfs-site.xml文件表示HDFS配置文件,继承core-site.xml,用于设置HDFS的NameNode和DataNode两大进程

首先打开hdfs-site.xml配置文件

vi /usr/local/src/hadoop/etc/hadoop/hdfs-site.xml

在<configuration>标签中加入配置信息

<!--以下为常规配置-->
<!--常规配置,该属性必填,指定HDFS副本的数量,默认值是3,本机也有3个节点,可以写3。但实际上按照1+X运维的指导书,此处只配置两个datanode,所以这里个人认为其实填写3也是符合实际情况的-->
<property>
    <name>dfs.replication</name>   
    <value>3</value>
</property>

<!-- 打开NameNode和DataNode的 WebHDFS (REST API),启用 webhdfs,默认也是打开的 -->
<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>

<!-- 该属性可以不填但建议修改,namenode数据的存放地点。也就是namenode元数据存放的地方,记录了hdfs系统中文件的元数据,如果指定了存放目录要手动创建该文件夹。按照1+X大数据平台运维的高可用集群指导书,此处的名称和路径相比完全分布式集群都发生了变化-->
<property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/local/src/hadoop/tmp/hdfs/nn</value>
</property>

<!-- 该属性可以不填但建议修改,datanode数据的存放地点。也就是block块存放的目录了,如果指定了存放目录要手动创建该文件夹。按照1+X大数据平台运维的高可用集群指导书,此处的名称和路径相比完全分布式集群都发生了变化-->
<property>
    <name>dfs.datanode.data.dir</name>
    <value>/usr/local/src/hadoop/tmp/hdfs/dn</value>
</property>

<!-- 配置dfs操作是否需要权限,默认需要开启权限检查,一般针对windows开发环境下登陆操作时,如果设置了就不需要在java代码中加入System.setProperty("HADOOP_USER_NAME","root"); -->
<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
</property>

<!--开启权限,允许向已存在的hdfs文件中添加数据。默认不允许-->
<property>
  <name>dfs.support.append</name>
  <value>true</value>
</property>



<!--以下为高可用配置-->
<!-- journalnode 集群之间通信的超时时间 -->
<property>
  <name>dfs.qjournal.start-segment.timeout.ms</name>
  <value>60000</value>
</property>

<!--必备配置,指定 hdfs 的 nameservice 为 mycluster,需要和 core-site.xml 中的名称保持一致
dfs.ha.namenodes.[nameservice id]为在 nameservice 中的每一个 NameNode 设置唯一标示
符。配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
如果使用"mycluster"作为 nameservice ID,并且使用"master""slave1"作为 NameNodes 标
示符 -->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

<!-- mycluster要求与之前命名的一致,此处表示mycluster下面有两个 NameNode,分别是 master,slave1 -->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>master,slave1</value>
</property>

<!-- 指定mycluster下第一个NameNode(即master)的 RPC 通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.master</name>
  <value>master:8020</value>
</property>

<!-- 指定mycluster下第二个NameNode(即slave1)的 RPC 通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.slave1</name>
  <value>slave1:8020</value>
</property>

<!--手动运行的FC功能(从CLI)等待健康检查、服务状态的超时时间。-->
<property>
  <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
  <value>60000</value>
</property>

<!-- 指定mycluster下第一个NameNode(即master)的 http 通信地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.master</name>
  <value>master:50070</value>
</property>

<!-- 指定mycluster下第二个NameNode(即slave1)的 http 通信地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.slave1</name>
  <value>slave1:50070</value>
</property>

<!-- 指定 NameNode在journalnode的存储位置,即 edits 元数据的共享存储位置。也就是 JournalNode 列表
该 url 的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId 推荐使用 nameservice,默认端口号是:8485 -->

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>

<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/usr/local/src/hadoop/tmp/hdfs/jn</value>
</property>

<!-- 开启 NameNode 失败自动切换 -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<!-- 开启mycluster配置失败自动切换实现方式 -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>
    sshfence
    shell(/bin/true)
  </value>
  <description></description>
</property>

<!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_rsa</value>
</property>

<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
  <name>dfs.ha.fencing.ssh.connect-timeout</name>
  <value>30000</value>
</property>

根据上一步的配置,在linux中新建namenode,datanode, journalnode相应的目录(依次执行)

mkdir -p /usr/local/src/hadoop/tmp/hdfs/nn
mkdir -p /usr/local/src/hadoop/tmp/hdfs/dn
mkdir -p /usr/local/src/hadoop/tmp/hdfs/jn

知识点补充:-p, --parents 需要时创建上层目录,如目录早已存在则不当作错误
说明:因为dfs目录并不存在,所以这里用mkdir –p来简化创建步骤

(8)、在master节点配置mapred-site.xml(同全分布式集群配置)

说明:mapred-site.xml文件表示MapReduce配置文件,继承core-site.xml
复制mapred-site.xml.template配置文件,改为mapred-site.xml

ls /usr/local/src/hadoop/etc/hadoop/

会发现并没有mapred-site.xml文件,执行复制命令:将mapred-site.xml.template复制并更名为mapred-site.xml

cp /usr/local/src/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/src/hadoop/etc/hadoop/mapred-site.xml

打开mapred-site.xml配置文件

vi /usr/local/src/hadoop/etc/hadoop/mapred-site.xml

在<configuration>标签中加入配置信息并保存

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <description>必须配置,取值local、classic或yarn其中之一,如果不是yarn,则不会使用YARN集群来实现资源的分配</description>
</property>

<!--配置mapreduce的JobHistory服务器(可选),下面是预留配置信息-->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
    <description>可选配置,定义历史服务器的地址和端口,通过历史服务器查看已经运行完的Mapreduce作业记录。JobHistory Server管理的日志的存放位置。master表示主机名,默认端口号也是10020</description>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
   <description>可选配置,表示jobhistory访问网址网址,可以查看历史服务器已经运行完的Mapreduce作业记录的web地址。master表示主机名,默认端口号也是19888</description>
</property>
(9)、在master节点配置yarn-site.xml

说明:yarn-site.xml文件表示Yarn配置文件,继承core-site.xml

打开yarn-site.xml配置文件
vi /usr/local/src/hadoop/etc/hadoop/yarn-site.xml
在<configuration>标签中加入配置信息并保存

<!-- 常规配置 -->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <description>reducer获取数据的方式,NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序</description>
</property>

<!-- 配置后,可以在hadoop的任务管理界面(网页中)查看日志功能。原来只能在执行maprecue或是在日志文件中才能查看-->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
  <description>是否启用日志聚合功能,日志聚合开启后保存到HDFS上。默认是false</description>
</property>
<!-- 任务历史服务-->
<property> 
    <name>yarn.log.server.url</name> 
<value>http://master:19888/jobhistory/logs/</value> 
<description>如果不配置这里,无法在http://master:8088/上查看yarn上执行job的log日志(ljy后期遇到此类问题后加上)</description>
</property>
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>86400</value>
  <description>聚合后的日志在HDFS上保存多长时间,单位为秒。86400即为24小时</description>
</property>


<!--高可用配置 -->
<!-- 开启 RM 高可用 -->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<!-- 指定 resourcemanager 的 cluster id配置,标识集群。由选民使用,以确保RM不会接管作为另一个群集的活动。 -->
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>yrc</value>
</property>
<!-- 指定 resourcemanager的名字,下面需要用名字进行配置 -->
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<!-- 分别指定resourcemanager的地址,对应其他配置文件的namenode主机地址 -->
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>master</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>slave1</value>
</property>
<!-- 指定 zookeeper 集群地址,在其他配置文件也有相似设定-->
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>master:2181,slave1:2181,slave2:2181</value>
</property>

<!-- 启用自动恢复 -->
<property>
  <name>yarn.resourcemanager.recovery.enabled</name>
  <value>true</value>
</property>
<!-- 指定resourcemanager 的状态信息存储在 zookeeper 集群上 -->
<property>
  <name>yarn.resourcemanager.store.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

12.4.10 在master节点配置slaves文件
说明:在/usr/local/src/hadoop/etc/hadoop/目录下,用于记录hadoop集群的DataNode的主机名,本机将master只设置为namenode节点,所以只录入slave1,slave2.

vi /usr/local/src/hadoop/etc/hadoop/slaves

12.4.10.2 在打开的文本中删除localhost,然后录入

master
slave1
slave2
(10)、将master的hadoop安装文件同步到slave节点

在master虚拟机将hadoop的配置文件发给其他节点(覆盖profile文件)
发送给slave1

scp /etc/profile slave1:/etc/profile

发送给slave2

scp /etc/profile slave2:/etc/profile

master虚拟机将hadoop安装好的文件夹发给其他节点(slave1,slave2)
发送给slave1

scp -r /usr/local/src/hadoop slave1:/usr/local/src

发送给slave2

scp -r /usr/local/src/hadoop slave2:/usr/local/src
(11)、在slave1和slave2主机重置/etc/profile文件

在slave1和slave2节点分别执行下面命令

source /etc/profile
(12)、初始化并启动集群

启动zookeeper(否则无法注册ZNode)
在各个节点执行下面命令

zkServer.sh start

启动 journalnode 守护进程

在master节点执行命令
就可以启动所有节点的journalnode进程

hadoop-daemons.sh start journalnode

输入jps可查看进程

(13)、格式化元数据

在master节点执行下述命令

hdfs namenode -format

状态为0显示的是成功,如果显示为1,则失败,注意查看哪里出问题,一般为配置文件

(14)、注册ZNode

在master节点执行下述命令

hdfs zkfc -formatZK

说明:连接上zookeeper集群,然后在zookeeper集群上面创建一个znode节点: /hadooop-ha/ns1,所以在哪里格式化zkfc其实不并重要,重要的是在zookeeper集群上创建znode

启动hadoop的hdfs组件和yarn组件
在master节点执行命令

start-all.sh
此时可以看到master节点有namenode节点进程,但是slave1并没有namenode进程

同步master的namenode的元数据信息到其他节点
在master节点执行命令

scp -r /usr/local/src/hadoop/tmp/hdfs/nn/* slave1:/usr/local/src/hadoop/tmp/hdfs/nn/
scp -r /usr/local/src/hadoop/tmp/hdfs/nn/* slave2:/usr/local/src/hadoop/tmp/hdfs/nn/

在 slave1 上启动 resourcemanager 和 namenode 进程

yarn-daemon.sh start resourcemanager
hadoop-daemon.sh start namenode

启动Web Application Proxy代理服务器

yarn-daemon.sh start proxyserver

启动 MapReduce 任务历史服务器jobhistory

mr-jobhistory-daemon.sh start historyserver
(15)、hadoop高可用集群的启动与关闭(已经初始化后)

启动hadoop高可用集群

start-all.sh

启动zookeeper

zkServer.sh start

在slave1节点启动resourcemanager进程

yarn-daemon.sh start resourcemanager

启动Web Application Proxy代理服务器

yarn-daemon.sh start proxyserver

启动 MapReduce 任务历史服务器jobhistory

mr-jobhistory-daemon.sh start historyserver

关闭hadoop高可用集群
关闭 MapReduce 任务历史服务器jobhistory
在master节点执行命令

[root@master ~]# mr-jobhistory-daemon.sh stop historyserver

关闭hadoop组件

stop-all.sh

关闭zookeeper
zkServer.sh stop

(16)、查看namenode的active和standby状态

说明:只有在active的namenode上才能执行hdfs操作
通过网址查看
打开http://master:50070/explorer.html#/和http://master:50070/explorer.html#/网站,如果在其中一个网站看到如下的提示(Operation category READ is not supported in state standby),则表示该namenode节点是备用的
通过命令查看

hdfs haadmin -getServiceState master
hdfs haadmin -getServiceState slave1
(17)、高可用集群测试

说明:通过关掉当前活跃的namenode,检查处于standby的namenode节点变为active
查看哪个namenode是活跃的

hdfs haadmin -getServiceState master
hdfs haadmin -getServiceState slave1

关闭活跃的namenode节点

hadoop-daemon.sh stop namenode

查看原来standby的namenode节点状态

hdfs haadmin -getServiceState slave1

查看原来active的namenode节点状态

hdfs haadmin -getServiceState master

说明:因为master节点的namenode已经关闭,所以显示连接不上

启动原来active的namenode

hadoop-daemon.sh start namenode
hdfs haadmin -getServiceState master

使用Java API操作hadoop高可用集群的HDFS下次再讲


版权声明:本文为qq_56862455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。