ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hadoop HA高可用部署

2022-01-16 16:05:25  阅读:199  来源: 互联网

标签:02 01 部署 Hadoop yarn header emr HA 节点


文章目录

Hadoop HA高可用安装

此方案注意问题

hdfs-site.xml文件中的dfs.ha.fencing.methods参数为shell而非sshfence.因为sshfence存在主节点所在主机宕机(主机宕机而非停止服务)无法切换问题.但是百度到的大部分Hadoop HA相关文章都是使用的sshfence方式.

官方参考文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

官网原文:The sshfence option SSHes to the target node and uses fuser to kill the process listening on the service’s TCP port. In order for this fencing option to work, it must be able to SSH to the target node without providing a passphrase. Thus, one must also configure the dfs.ha.fencing.ssh.private-key-files option, which is a comma-separated list of SSH private key files. For example:

当active的namenode连接失败后,standby会去ssh到之前active的namenode节点,然后再次杀一遍进程.

问题在于,如果之前active的namenode节点挂掉了,standby的节点ssh不到这个节点,也就无法切换.所以这种高可用只适用于预防namenode服务死掉而不能承受节点死掉.如果active的节点挂掉了,那么,从节点的zkfc日志中将能看到java.net.NoRouteToHostException: No route to host (Host unreachable)的异常.

注意点2: 为了防止脑裂问题,Hadoop HA也采用了半数机制.即(n - 1) / 2.所以,至少需要运行三个journalnode服务,也就是三个主节点(一个主节点两个备用节点).

官方原文:

  • JournalNode machines - the machines on which you run the JournalNodes. The JournalNode daemon is relatively lightweight, so these daemons may reasonably be collocated on machines with other Hadoop daemons, for example NameNodes, the JobTracker, or the YARN ResourceManager. Note: There must be at least 3 JournalNode daemons, since edit log modifications must be written to a majority of JNs. This will allow the system to tolerate the failure of a single machine. You may also run more than 3 JournalNodes, but in order to actually increase the number of failures the system can tolerate, you should run an odd number of JNs, (i.e. 3, 5, 7, etc.). Note that when running with N JournalNodes, the system can tolerate at most (N - 1) / 2 failures and continue to function normally.

主机基础环境配置

关闭防火墙,关闭selinux,确保节点通信正常

  1. 修改主机名(因机器数量较少所以很多组件共用一个节点)

    IP地址主机名描述
    20.88.10.31emr-header-01主节点,zookeeper节点
    20.88.10.32emr-header-02备用主节点,zookeeper节点
    20.88.10.33emr-worker-01工作节点,备用主节点,zookeeper节点
    20.88.10.34emr-worker-02工作节点
  2. 修改hosts文件和主机名

    hostnamectl set-hostname emr-header-01;bash
    

    hosts文件内容添加(每个节点都一样)

    此项必操作

    因为Hadoop配置中指定了主节点及从节点主机名,如果没有加hosts,解析主机名会失败

    20.88.10.31 emr-header-01
    20.88.10.32 emr-header-02
    20.88.10.33 emr-worker-01
    20.88.10.34 emr-worker-02
    
  3. 节点互相免密(emr-header-01节点执行)

    Hadoop启动时会ssh连接到其他节点,如果不做免秘钥会提示输入密码

    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
    chmod 0600 ~/.ssh/authorized_keys
    

    分发到每个主机

    sshpass -psinobase@123  ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no"  root@emr-header-01
    sshpass -psinobase@123  ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no"  root@emr-header-02
    sshpass -psinobase@123  ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no"  root@emr-worker-01
    sshpass -psinobase@123  ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no"  root@emr-worker-02
    

安装JAVA环境

安装系统centos7,用户为root权限(没有也可以),所有包安装目录为/opt

所有节点均需安装

按照版本所需下载对应jdk,下载略过,Java官网:https://www.oracle.com/java/technologies/downloads/

tar xf jdk-8u181-linux-x64.tar.gz -C /opt/
echo 'export JAVA_HOME=/opt/jdk1.8.0_181/
export PATH=${PATH}:${JAVA_HOME}/bin' >>/etc/profile
source /etc/profile
java -version

安装zookeeper

zookeeper安装于emr-header-01,emr-header-02,emr-worker-01三个节点

zookeeper官方下载地址:https://zookeeper.apache.org/releases.html

emr-header-01节点操作:

# 下载后上传,此处略过
tar xf zookeeper-3.4.13.tar.gz -C /opt/

修改配置

cd /opt/zookeeper-3.4.13/conf/
vim zoo.cfg

全部配置:

minSessionTimeout=16000
maxSessionTimeout=300000
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalog
clientPort=2181
server.1=emr-header-01:2888:3888
server.2=emr-header-02:2888:3888
server.3=emr-worker-01:2888:3888

添加变量

echo 'ZK_HOME=/opt/zookeeper-3.4.13' >>/etc/profile
echo 'PATH=$PATH:${ZK_HOME}/bin/' >>/etc/profile
source /etc/profile

分发到其他节点

scp -r /opt/* emr-header-02:/opt/
scp -r /opt/* emr-worker-01:/opt/
scp -r /opt/* emr-worker-02:/opt/
scp /etc/profile emr-header-02:/etc/
scp /etc/profile emr-worker-01:/etc/
scp /etc/hosts emr-header-02:/etc/
scp /etc/hosts emr-worker-01:/etc/
scp /etc/hosts emr-worker-02:/etc/

所有节点执行

mkdir -p /data/zookeeper/data
cd /data/zookeeper/data

注意:此处每个节点执行内容不同

每个文件的数字全局唯一同时不能随便写

如emr-header-01的数字1对应的是上面配置中的server.1=emr-header-01:2888:3888 的 1

# emr-header-01节点执行
echo "1" >myid
# emr-header-02节点执行
echo "2" >myid
# emr-worker-01节点执行
echo "3" >myid

启动,所有节点执行

source /etc/profile;zkServer.sh start

检查状态

zkServer.sh status

三个节点执行后有两个是Mode: follower一个Mode: leader即为成功

安装Hadoop

官网地址:https://archive.apache.org/dist/hadoop/common/

此处使用清华源下载,地址为:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz

emr-header-01执行

curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
tar xf hadoop-2.10.1.tar.gz -C /opt/
cd /opt/hadoop-2.10.1/etc/hadoop/

检查是否有fuser命令,没有则安装(所有节点)

如果是sshfence方式回使用到这个命令,因为他为了防止脑裂要ssh连接到已经down掉的NameNode节点重新杀一遍NameNode的进程.而杀进程的时候回用到这条命令,如果没有的话sshfence方式在主节点执行命令hadoop-daemon,.sh stop namenode停止掉NameNode节点也是无法切换过去的,更不用说停掉主节点的主机.

yum install -y psmisc

开始修改配置

如果主机名和解析不同,需要修改文件中对应的内容

注意yarn-site.xml文件中的yarn.nodemanager.resource.memory-mbyarn.nodemanager.resource.cpu-vcores参数,改参数用于该节点可被调用的最大CPU数量和内存大小,此处设置为主机内存一半.
配置中除了高可用相关配置还有其他配置,如开启日志收集设置节点最大可用资源等,可以单独加入配置也可以直接覆盖之前所有配置,Hadoop版本1.10.1测试可用.

hadoop-env.sh第一行插入,或者修改文件中的JAVA_HOME变量

source /etc/profile

slaves文件内容(删除原有的localhost)

# 此文件中写所有从节点别名
emr-worker-01
emr-worker-02

core-site.xml文件内容,注意文件中的<configuration>不要重复

<configuration>
<property>
	<!-- 指定HDFS中NameNode的地址 -->
	<name>fs.defaultFS</name>
	<value>hdfs://emr-header-01:9000</value>
</property>
<property>
	<!-- 指定Hadoop运行时产生文件的存储目录 -->
	<name>hadoop.tmp.dir</name>
	<value>/data/hadoop/tmp</value>
</property>
    <!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->
    <property>
         <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/tmp</value>
    </property>
<!--zookeeper集群地址-->
    <property>
       <name>ha.zookeeper.quorum</name>
       <value>emr-header-01:2181,emr-header-02:2181,emr-worker-01:2181</value>
     </property>
</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
    <!-- Reducer获取数据的方式 -->
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>
<property>
    <!-- 指定YARN的ResourceManager的地址 -->
	<name>yarn.resourcemanager.hostname</name>
	<value>emr-header-01</value>
</property>
<property>
    <!-- 该节点允许最大申请CPU数量 -->
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>2</value>
</property>
<property>
    <!-- 该节点允许最大调用物理内存 -->
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
</property>
<property>
    <!-- 单个任务最大可申请CPU数量 -->
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>4</value>
</property>
<property>
    <!-- 单个任务最大可申请内存量 -->
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>3072</value>
</property>
<property>
    <!-- 单个任务最小可申请CPU数量 -->
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
</property>
<property>
    <!-- 单个任务最小可申请内存量 -->
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
</property>
<property>
	<!-- 日志聚集功能使能 -->
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>
<property>
	<!-- 日志保留时间设置7天 -->
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 启用 resourcemanager ha -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!-- 声明两台 resourcemanager 的地址 -->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>cluster-yarn</value>
	</property>
	<!--指定 resourcemanager 的逻辑列表-->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<!-- ========== rm1 的配置 ========== -->
	<!-- 指定 rm1 的主机名 -->
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>emr-header-01</value>
	</property>
	<!-- 指定 rm1 的 web 端地址 -->
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>emr-header-01:8088</value>
	</property>
	<!-- 指定 rm1 的内部通信地址 -->
	<property>
		<name>yarn.resourcemanager.address.rm1</name>
		<value>emr-header-01:8032</value>
	</property>
	<!-- 指定 AM 向 rm1 申请资源的地址 -->
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm1</name>
		<value>emr-header-01:8030</value>
	</property>
	<!-- 指定供 NM 连接的地址 -->
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
		<value>emr-header-01:8031</value>
	</property>
	<!-- ========== rm2 的配置 ========== -->
	<!-- 指定 rm2 的主机名 -->
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>emr-header-02</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>emr-header-02:8088</value>
	</property>
	<property>
		<name>yarn.resourcemanager.address.rm2</name>
        <value>emr-header-02:8032</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm2</name>
		<value>emr-header-02:8030</value>
	</property>
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
		<value>emr-header-02:8031</value>
	</property>
	<!-- 指定 zookeeper 集群的地址 -->
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>emr-header-01:2181,emr-header-02:2181,emr-header-03: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>
	<!-- 环境变量的继承 -->
	<property>
		<name>yarn.nodemanager.env-whitelist</name>
		<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
	</property>
</configuration>

hdfs-site.xml

<configuration>
<!-- 指定副本数 -->
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
    <property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>emr-header-01:50090</value>
	</property>
<!-- NameNode 数据存储目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/name</value>
    </property>
<!-- DataNode 数据存储目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/data</value>
    </property>
<!-- JournalNode 数据存储目录 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>${hadoop.tmp.dir}/jn</value>
    </property>
<!-- 完全分布式集群名称 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
<!-- 集群中 NameNode 节点都有哪些 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2,nn3</value>
    </property>
<!-- NameNode 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>emr-header-01:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>emr-header-02:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn3</name>
        <value>emr-worker-01:8020</value>
    </property>
<!-- NameNode 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>emr-header-01:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>emr-header-02:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn3</name>
        <value>emr-worker-01:9870</value>
    </property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://emr-header-01:8485;emr-header-02:8485;emr-worker-01:8485/mycluster</value>
    </property>
<!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
    <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>shell(/bin/true)</value>
    </property>
<!-- 使用隔离机制时需要 ssh 秘钥登录-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_dsa</value>
    </property>
<!--开启Automatic Failover模式-->
    <property>
           <name>dfs.ha.automatic-failover.enabled</name>
           <value>true</value>
     </property>
</configuration>

mapred-site.xml,需要先复制出一份cp mapred-site.xml.template mapred-site.xml

<configuration>
<property>
    <!-- 指定副本数 -->
	<name>dfs.replication</name>
	<value>1</value>
</property>
<property>
    <!-- 指定Hadoop辅助名称节点主机配置 -->
	<name>dfs.namenode.secondary.http-address</name>
	<value>emr-header-01:50090</value>
</property>
</configuration>

编辑/opt/hadoop-2.10.1/sbin/start-yarn.sh

# start resourceManager
"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  start resourcemanager
# 插入下面这一段 启动时同时启动emr-header-02节点的resourcemanager进程
ssh emr-header-02 "$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  start resourcemanager
# start nodeManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  start nodemanager
# start proxyserver
#"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  start proxyserver

编辑/opt/hadoop-2.10.1/sbin/stop-yarn.sh

# stop resourceManager
"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  stop resourcemanager
# 插入下面一行 停止任务时同时停止emr-header-02节点的resource-manager进程
ssh emr-header-02 "$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  stop resourcemanager
# stop nodeManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  stop nodemanager
# stop proxy server
"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  stop proxyserver

插入环境变量

echo 'export HADOOP_HOME=/opt/hadoop-2.10.1/' >>/etc/profile
echo 'export PATH=${PATH}:${HADOOP_HOME}/sbin/:${HADOOP_HOME}/bin/' >>/etc/profile
source /etc/profile

复制到其他节点(emr-header-01节点操作)

# 复制密钥到其他节点,因为上面配置了dfs.ha.fencing.ssh.private-key-files参数指定了密钥文件
scp -r /root/.ssh/* emr-header-02:/root/.ssh/
scp /etc/profile emr-header-02:/etc/
scp /etc/profile emr-worker-01:/etc/
scp /etc/profile emr-worker-02:/etc/
scp -r /opt/hadoop-2.10.1/ emr-header-02:/opt/
scp -r /opt/hadoop-2.10.1/ emr-worker-01:/opt/
scp -r /opt/hadoop-2.10.1/ emr-worker-02:/opt/

开始启动

所有节点刷新环境变量

source /etc/profile

emr-header-01,emr-header-02,emr-worker-01 三个节点执行

hadoop-daemon.sh start journalnode

若想检查启动情况见日志,路径与/opt/hadoop-2.10.1/logs/hadoop-root-journalnode-emr-header-01.log,不同节点文件名不同.

emr-header-01节点执行

# 此条重复执行会提示输入y
hdfs zkfc -formatZK
hdfs namenode -format
hadoop-daemon.sh start namenode

emr-header-02和emr-worker-02节点执行(同步namenode数据)

hdfs namenode -bootstrapStandby

emr-header-01节点运行

stop-all.sh

开始启动集群

start-all.sh

页面访问

建议现在本地电脑添加hosts,不添加同样可用,不过访问到resourceManager备用节点时(也就是YARN)会跳转到主节点的主机别名.

20.88.10.31 emr-header-01
20.88.10.32 emr-header-02
20.88.10.33 emr-worker-01
20.88.10.34 emr-worker-02

访问header1的

# HDFS 每个运行了journalnode的都可以访问
http://20.88.10.31:9870/
http://20.88.10.32:9870/
http://20.88.10.33:9870/

HDFS第一行Overview 'emr-header-01:8020' (active)为主节点,Overview 'emr-header-02:8020' (standby)为备用节点

# YARN 或者MapReduce
http://20.88.10.31:8088/

查看节点状态

rm1和rm2从上面配置指定,rm1为emr-header-01节点,rm2为emr-header-02节点.

[root@emr-header-01 ~]#  yarn rmadmin -getServiceState rm1
standby
[root@emr-header-01 ~]#  yarn rmadmin -getServiceState rm2
active
[root@emr-header-01 ~]# 

测试

根据上面查看的情况,HDFS主节点为emr-header-01,而Yarn主节点为emr-header-02.

# emr-header-01 执行,停止namenode,注意是hadoop-daemon.sh而不是hadoop-daemons.sh
hadoop-daemon.sh stop namenode
# emr-header-02节点,执行命令停止resourceManager
yarn-daemon.sh stop resourcemanager

Yarn header02节点已不可访问,访问http://emr-header-01:8088/cluster可用.

HDFS header-01节点不可访问,访问header-02 http://emr-header-02:9870/dfshealth.html#tab-overview,显示为active状态.

停止的服务重新启动,即自动成为备用节点,启动命令(stop在那个节点执行的,对应的start同样在那个节点执行):

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

当上面的测试都可用的时候,那么可以随意停掉任何一个主节点的机器模拟故障,查看是否能够切换过去.dfs.ha.fencing.methods参数为shell方式是没问题的而sshfence是切换不过去的,原因可见开头.相对比之下,shell方式主备切换过程会比较长需要多等待一会(测试大概一分钟以内),而sshfence方式会很快在active节点down掉之后补上去.但是shell方式可以承受主机节点的异常.

标签:02,01,部署,Hadoop,yarn,header,emr,HA,节点
来源: https://blog.csdn.net/weixin_44455125/article/details/122524147

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有