hadoop HA高可用搭建流程

  • Post author:
  • Post category:其他

前置准备:有可用的zookeeper。

节点名 zookeeper namenode datanode journalnode zkfc resourcemanager nodemanager
hadoop171
hadoop172
hadoop173

安装包下载地址:
hadoop官网,版本全下载速度慢。
清华开源镜像,下载速度快,版本少。

tar -zxvf hadoop-3.2.1.tar.gz -C /opt/module

修改名称(可选)

mv hadoop-3.2.1.tar.gz hadoop

解压好后,进入hadoop/etc/hadoop
修改文件,建议先在一台机器中全部修改完后把文件复制到其他节点中。
hadoop-env.sh
增加java路径
vim hadoop-env.sh

export JAVA_HOME=路径

配置文件

core-site.xml

<configuration>
<property>
<!-- 配置hadoop使用的hdfs-->
<name>fs.defaultFS</name>
<value>hdfs://king</value>
</property>

<property>
<!-- 配置zkfc使用的zookeeper地址-->
<name>ha.zookeeper.quorum</name>
<value>hadoop171:2181,hadoop172:2181,hadoop173:2181</value>
</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->
<!-- 默认是在/tmp下面,我这里自定义的,可以省略 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/tmp</value>
</property>

<!-- 回收站,保存7天 --> 
<property>
<name>fs.trash.interval</name>
<value>10080</value> 
</property>
</configuration>

hdfs-site.xml

<configuration>
<!-- 集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>king</value>
</property>

<!-- 命名空间中namenodes的id -->
<property>
<name>dfs.ha.namenodes.king</name>
<value>nn1,nn2</value>
</property>

<!-- 每个NameNode监听的标准RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.king.nn1</name>
<value>hadoop171:9820</value>
</property>
<property>
<name>dfs.namenode.rpc-address.king.nn2</name>
<value>hadoop172:9820</value>
</property>

<!-- 每个NameNode监听的标准HTTP地址 -->
<property>
<name>dfs.namenode.http-address.king.nn1</name>
<value>hadoop171:9870</value>
</property>

<property>
<name>dfs.namenode.http-address.king.nn2</name>
<value>hadoop172:9870</value>
</property>

<!-- 共享存储目录的位置 -->
<property>
<name> dfs.namenode.shared.edits.dir </name>
<value>qjournal://hadoop171:8485;hadoop172:8485;hadoop173:8485/king</value>
</property>

<!-- 代理配置 -->
<property>
<name>dfs.client.failover.proxy.provider.king</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 这是JournalNode进程保持逻辑状态的路径。这里在linux服务器文件的绝对路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/jn</value>
</property>

<!-- 设置故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/jinghang/.ssh/id_rsa</value>
</property>

<!-- 以下内容可以省略 --> 
<!-- 编辑日志存储路径 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/edits</value>
</property>

<!-- 镜像文件存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/name</value>
</property>

<!-- datanode节点存储数据块文件的本地路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/data</value>
</property> 

<!-- 白名单 --> 
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop/etc/hadoop/whitelist</value>
</property>

<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop/etc/hadoop/blacklist</value>
</property>

</configuration>

mapred-site.xml

<configuration>

    <property>
	    <!-- 指定MapReduce运行在Yarn上 -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
	    <!-- 指定mr的classpath -->
        <name>mapreduce.application.classpath</name>
        <value>/opt/module/hadoop/etc/hadoop:/opt/module/hadoop/share/hadoop/mapreduce/*:/opt/module/hadoop/share/hadoop/mapreduce/lib/*:/opt/module/hadoop/share/hadoop/common/*:/opt/module/hadoop/share/hadoop/common/lib/*:/opt/module/hadoop/share/hadoop/hdfs/*:/opt/module/hadoop/share/hadoop/hdfs/lib/*:/opt/module/hadoop/share/hadoop/yarn/*:/opt/module/hadoop/share/hadoop/yarn/lib/*</value>
    </property>
    <!-- 历史服务器端地址 --> 
    <property> 
    	<name>mapreduce.jobhistory.address</name>
    	<value>hadoop173:10020</value>
    </property> 
    <!-- 历史服务器web端地址 -->
    <property> 
     	<name>mapreduce.jobhistory.webapp.address</name> 
     	<value>hadoop173:19888</value> 
    </property>

</configuration>

yarn-site.xml

<configuration>
	<!--mapreduce执行shuffle(洗牌的意思)获取数据的方式-->
    <property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
    </property>

    <property>
		<!-- rm开启ha模式 -->
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
    </property>

    <property>
		<!-- 集群名称,作为zk上RN抢锁的路径 -->
		<name>yarn.resourcemanager.cluster-id</name>
		<value>king</value>
    </property>

    <property>
		<!-- RM节点名称 -->
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
    </property>

	  <property>
		<!-- RM节点的主机名 -->
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop172</value>
	  </property>
	  <property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop173</value>
	  </property>

	  <property>
		<!-- RM前台访问地址 -->
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoop172:8088</value>
  	</property>
  	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>hadoop173:8088</value>
  	</property>

  	<property>
		<!-- zk节点地址 -->
		<name>yarn.resourcemanager.zk-address</name>		
		<value>hadoop171:2181,hadoop172:2181,hadoop173:2181</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.resourcemanager.recovery.enabled</name> 
		<value>true</value> 
	  </property>
	  <!--容器是否存在物理内存限制-->
	  <property>
	  <name>yarn.nodemanager.pmem-check-enabled</name>
	  <value>false</value>
	  </property>
    <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    </property>

    <!--以下内容可以省略-->
    <!-- 日志聚集功能使能 -->
	  <property> 
		<name>yarn.log-aggregation-enable</name> 
		<value>true</value>
	  </property>

    <!-- 日志保留时间设置7天 --> 
	  <property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value> 
	  </property>

	  <property> 
		<name>yarn.application.classpath</name> 
		<value>/opt/module/hadoop/etc/hadoop:/opt/module/hadoop/share/hadoop/common/lib/*:/opt/module/hadoop/share/hadoop/common/*:/opt/module/hadoop/share/hadoop/hdfs:/opt/module/hadoop/share/hadoop/hdfs/lib /*:/opt/module/hadoop/share/hadoop/hdfs/*:/opt/module/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*:/opt/module/hadoop/share/hadoop/yarn:/opt/module/hadoop/share/hadoop/yarn/lib/*:/opt/module/hadoop/share/hadoop/yarn/*:/opt/module/hbase/lib/*</value> 
	  </property>

	  <!-- 存储本地化文件的目录列表 -->
	  <property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/opt/module/hadoop/data/hadoop/local</value>
	  </property>

	  <!-- 存储容器日志的目录列表 -->
		<property>
		<name>yarn.nodemanager.log-dirs</name>
		<value>/opt/module/hadoop/data/hadoop/yarn/logs</value>
	  </property> 
</configuration>

设置workers
vim workers

hadoop171
hadoop172
hadoop173

如果设置了黑白名单,则需要创建,没设置这一步可以跳过
设置白名单
vim whitelist

hadoop171
hadoop172
hadoop173

创建黑名单

touch blacklist

创建目录,我的配置文件中自定义了一些路径,如果没设置可以省略这一步,自定义的路径我在上面的xml文件中备注了。
在hadoop下面创建data文件夹

mkdir -p data/hadoop
cd data/hadoop
mkdir -p hdfs/data hdfs/edits hdfs/jn hdfs/name hdfs/tmp
mkdir local
mkdir -p yarn/local yarn/logs

配置完成后,将hadoop拷贝到其他节点中

scp -r hadoop 用户@节点名称:/opt/module

配置环境变量
vim /etc/profile

export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin

刷新

source /etc/profile

格式化namenode

温馨提示:zookeeper一定要开着哦!
首先在三台机器中启动journalnode

hdfs --daemon start journalnode

在hadoop171中格式化namenode

hdfs namenode -format

格式化后启动

hdfs --daemon start namenode

在hadoop172中同步节点中的namenode元数据

hdfs namenode -bootstrapStandby

在hadoop171节点上关闭namenode

hdfs --daemon stop namenode

在hadoop171上格式化zkfc

hdfs zkfc -formatZK

在三台节点中关闭journalnode

hdfs --daemon stop journalnode

启动hadoop集群

start-all.sh

验证HA高可用

namenode验证HA高可用

hdfs haadmin -getAllServiceState

在这里插入图片描述
停止掉active的NameNode
kill -9 进程号
再次查看

hdfs haadmin -getAllServiceState

在这里插入图片描述可以看到状态由standby变为active,而停掉的节点使用此命令会报拒绝连接的异常

启动停掉的namenode再次查看
在这里插入图片描述

resourcemanager验证HA

yarn rmadmin -getAllServiceState
步骤和namenode一样。

至此,hadoop HA的搭建和测试完成,接下来说一下安装过程中需要注意的地方和可能会遇到的报错在

1.在上面配置文件中,需要注意,我这里是 ‘king’ 如果需要改的话,记得将上面配置文件中所有涉及到 ’king‘ 的全部改成你修改的集群名称。还有注意节点名称也需要修改,我下面将需要修改的地方高亮出来。

hdfs-site.xml
在这里插入图片描述core-site.xml
在这里插入图片描述yarn-site.xml
在这里插入图片描述core-site.xml
在这里插入图片描述

2.NameNode 无法自动故障转移(切换active)

原因是因为hdfs-site.xml中有下面的配置
在这里插入图片描述

解决办法:安装包含fuster程序的软件包Psmisc(每个机器上都要安装):

yum -y install psmisc

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