准备工作

  • JDK1.8
  • hadoop 2.10.0
  • centos 7
  • VMware

准备3台虚拟机,部署规划如下

ipNameNodeSecondaryNameNodeResourceManagerDataNodeNodeManagerhistoryserver
192.168.0.1yesnonoyesyesno
192.168.0.2noyesnoyesyesyes
192.168.0.3nonoyesyesyesno

有条件的情况下 NameNodeSecondaryNameNodeResourceManager 他们都应该各自独占一台节点,DataNodeNodeManager必须成对出现

安装JDK,并配置好环境变量
安装haoop,并配置好环境变量


开始部署

解压hadoop,进入所在目录

配置JAVA_HOME,由于不同节点上jdk安装路径可能不同,不建议使用默认配置

修改以下:
etc/hadoop/hadoop-env.sh  25行
etc/hadoop/mapred-env.sh  16行
etc/hadoop/yarn-env.sh  23行
为:
export JAVA_HOME=/opt/module/jdk1.8.0_231/

etc/hadoop/core-site.xml

<configuration>
	<!-- 指定文件系统为HDFS,同时指定NameNode节点 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://192.168.0.1:9000</value>
    </property>

	<!-- 文件的存放目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.10.0/data</value>
    </property>
</configuration>

etc/hadoop/hdfs-site.xml

<configuration>
	<!-- 数据副本数,默认3 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

	<!-- 指定SecondaryNameNode服务节点 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>192.168.0.2:50090</value>
    </property>
</configuration>

etc/hadoop/mapred-site.xml.template 删除.template

<configuration>
	<!-- 资源管理使用yarn服务 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

etc/hadoop/yarn-site.xml

<configuration>
    <property>
    	<!-- shuffle获取方式 -->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

	<!-- 指定ResourceManager服务节点 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.0.3</value>
    </property>

	<!-- 开启日志聚合,在historyserver中查看日志 -->
    <property>  
        <name>yarn.log-aggregation-enable</name>  
        <value>true</value>  
    </property>
</configuration>

etc/hadoop/slaves

// 指定DataNode节点
192.168.0.1
192.168.0.2
192.168.0.3

配置历史服务器
etc/hadoop/mapred-site.xml

<configuration>
    <!-- 历史服务器所在节点,这里以192.168.0.2为例 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>192.168.0.2:10020</value>
    </property>

	<!-- 历史服务器的web页面 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>192.168.0.2:19888</value>
    </property>
</configuration>

以上配置文件同步到所有服务节点,保持整个集群的配置文件一致

启动集群,先启动HDFS集群,在启动YARN集群,注意 需要在NameNode所在节点上启动HDFS集群,在ResourceManager所在节点上启动YARN集群


启动集群

# 初次启动,需要先格式化namenode,会在刚才配置中指定的目录下生成文件,在192.168.0.1的机器上执行
bin/hdfs namenode -format

# 启动HDFS集群,在192.168.0.1的机器上执行
sbin/start-dfs.sh

# 启动YARN集群,在192.168.0.3的机器上执行
sbin/start-yarn.sh

# 启动历史服务器,在192.168.0.2的机器上执行
sbin/mr-jobhistory-daemon.sh start historyserver

停止集群

sbin/stop-yarn.sh

sbin/stop-dfs.sh

sbin/mr-jobhistory-daemon.sh stop historyserver

验证结果

访问 192.168.0.1:50070,出现页面,说明HDFS启动成功
访问 192.168.0.3:8088,出现页面,说明YARN启动成功
访问 192.168.0.2:19888,出现页面,说明历史服务器启动成功


HDFS 高可用

上面部署的完全分布式集群有一个缺点,当NameNode挂掉后,整个集群也挂掉了,没有高可用的特性,在生产环境中,我们需要高可用的集群,当NameNode挂掉后,备用的NameNode能接管他的工作继续服务。

官方文档如下:https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

下面的文章只是把关键点整理做了一个总结,方便快速配置

JournalNode

JournalNode守护程序相对较轻,因此可以合理地将这些守护程序与其他Hadoop守护程序(例如NameNode,JobTracker或YARN ResourceManager)并置在计算机上,
注意:必须至少有3个JournalNode守护程序,您可能还会运行3个以上的JournalNode,但是为了实际增加系统可以容忍的故障数量,您应该运行奇数个JN(即3、5、7等)。
请注意,在HA群集中,备用NameNode也执行名称空间状态的检查点,因此不必在HA群集中运行Secondary NameNode

  • hdfs-site.xml
<configuration>
	<!-- 数据副本数,默认3 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

	<!-- HA集群不需要 SecondaryNameNode 服务节点,注释掉即可 -->
    <!-- <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>192.168.0.2:50090</value>
    </property> -->

	<!-- HA集群的名称,值可以为任何值,下面是使用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节点所在服务器,名称必须需要上面定义的值对应上 -->
	<property>
  		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
  		<value>192.168.0.1:8020</value>
	</property>
	<property>
  		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
 		<value>192.168.0.2:8020</value>
	</property>
	<!-- NameNode节点对应的web页面地址 -->
	<property>
  		<name>dfs.namenode.http-address.mycluster.nn1</name>
  		<value>192.168.0.1:50070</value>
	</property>
	<property>
  		<name>dfs.namenode.http-address.mycluster.nn2</name>
  		<value>192.168.0.2:50070</value>
	</property>
	<!-- 指定JournalNode服务运行的服务器,注意,最少需要3台服务器才能运行,mycluster需要和上面定义的名称对应 -->
	<property>
  		<name>dfs.namenode.shared.edits.dir</name>  				
  		<value>qjournal://192.168.0.1:8485;192.168.0.2:8485;192.168.0.3:8485/mycluster</value>
	</property>
	<!-- 该JAVA类用于确定哪一个NameNode是active状态 -->
	<property>
  		<name>dfs.client.failover.proxy.provider.mycluster</name>
  		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<!-- 以下2个配置用于SSH到Active NameNode并终止进程 -->
	<property>
      	<name>dfs.ha.fencing.methods</name>
      	<value>sshfence</value>
    </property>
    <!-- ${user}更改为你自己的用户名 -->
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/${user}/.ssh/id_rsa</value>
    </property>
    <!-- JournalNode服务文件的存储位置 -->
	<property>
  		<name>dfs.journalnode.edits.dir</name>
  		<value>/opt/module/hadoop-2.10.0/jndata</value>
	</property>
</configuration>
  • core-site.xml
<configuration>
	<!-- 修改我我们的HA集群 -->
    <!--<property>
        <name>fs.defaultFS</name>
        <value>hdfs://192.168.0.1:9000</value>
    </property>-->
    <!-- mycluster为上面配置项定义的名称 -->
    <property>
  		<name>fs.defaultFS</name>
  		<value>hdfs://mycluster</value>
	</property>


	<!-- 文件的存放目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.10.0/data</value>
    </property>
</configuration>

以上配置文件同步到所有节点
如果你有启用过集群,先停止所有集群,删除所有节点上面配置的hadoop.tmp.dir目录。否则会导致启动失败

启动

初次启动

# 初次启动
# 启动各个节点下的journalnode服务
hadoop-daemon.sh start journalnode
# 任意选择一个namenode节点,执行格式化
hdfs namenode -format
# 启动namonode,启动后状态为standby
hadoop-daemon.sh start namenode
# 另一台namenode节点,同步namenode的数据
hdfs namenode -bootstrapStandby
# 启动namonode,启动后状态为standby
hadoop-daemon.sh start namenode
# 切换指定id的NameNode的状态为active
hdfs haadmin -transitionToActive nn1

非初次启动

# 已经初始化后,再次启动可以直接执行此命令启动
start-dfs.sh

登录网页查看启动是否成功

手动转移故障

  • 模拟NameNode节点故障
# 强制结束Active状态的NameNode进程
kill -9 <pid>
  • 备用节点转换为主节点
hdfs haadmin -failover nn1 nn2

执行上诉命令会发现报错了,猜一下是什么原因导致的?
在执行转换时,nn2需要告诉nn1,我准备顶上了,你休息吧,但是这里nn1已经挂掉了,无法回复nn2信息,导致切换失败,需要先把故障的NameNode重新启动后才能执行转换

# 重启nn1
hadoop-daemon.sh start namenode
# 执行转换
hdfs haadmin -failover nn1 nn2

这里大家也发现一个问题吧,需要把挂掉的NamoNode重新启动后才能执行装换,完全没有达到高可用的要求,下面我们配置自动故障转移

自动故障转移

自动故障转移,需要引入2个新的组件ZooKeeper和ZKFailoverController

部署zookeeper,请查看我的另一篇博客https://blog.csdn.net/u012421093/article/details/105313699

开始配置前应先停掉启动的集群

新增如下配置

  • hdfs-site.xml
<configuration>
	<!-- 开启自动故障转移 -->
 	<property>
   		<name>dfs.ha.automatic-failover.enabled</name>
   		<value>true</value>
 	</property>
</configuration>
  • core-site.xml
</configuration>
	<!-- zookeeper节点配置 -->
 	<property>
   		<name>ha.zookeeper.quorum</name>
   		<value>192.168.75.136:2181,192.168.75.137:2181,192.168.78.138:2181</value>
 	</property>
 </configuration>

在其中一台NameNode节点输入以下命令

# 初始化zookeeper,成功后会在zookeeper上创建一个znode节点,名称为hadoop-ha
hdfs zkfc -formatZK
# 启动集群
start-dfs.sh

模拟故障,kill掉正在运行的节点,5秒后备用节点的状态变为active,成功

如果出现连接类错误,如Caused by: java.net.ConnectException: Connection refused
则执行下列命令, yum install psmisc


最后附上正常运行的进程截图,如果执行自动故障转移失败,请对比下图中的进程信息,看看是否是某个进程没有启动成功
在这里插入图片描述

YARN 高可用

  • yarn-site.xml
<configuration>
	<!-- 注释掉下列配置 -->
	 <!--
	 <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.75.137</value>
    </property>
    -->
	<!-- 启用yarn高可用 -->
	<property>
  		<name>yarn.resourcemanager.ha.enabled</name>
  		<value>true</value>
	</property>
	<!-- yarn高可用集群名称,可自行命名 -->
	<property>
  		<name>yarn.resourcemanager.cluster-id</name>
  		<value>cluster1</value>
	</property>
	<!-- ResourceManager名称 -->
	<property>
  		<name>yarn.resourcemanager.ha.rm-ids</name>
  		<value>rm1,rm2</value>
	</property>
	<!-- ResourceManager的hostname -->
	<property>
  		<name>yarn.resourcemanager.hostname.rm1</name>
  		<value>hadoop02</value>
	</property>
	<property>
  		<name>yarn.resourcemanager.hostname.rm2</name>
  		<value>hadoop03</value>
	</property>
	<!-- ResourceManager的web地址 -->
	<property>
  		<name>yarn.resourcemanager.webapp.address.rm1</name>
  		<value>hadoop02:8088</value>
	</property>
	<property>
  		<name>yarn.resourcemanager.webapp.address.rm2</name>
  		<value>hadoop03:8088</value>
	</property>
	<!-- yarn的zookeeper集群设置 -->
	<property>
  		<name>yarn.resourcemanager.zk-address</name>
  		<value>hadoop02:2181,hadoop03:2181,hadoop04:2181</value>
	</property>
</configuration>
  • 启动ResourceManager
在指定的ResourceManager下,启动ResourceManager

登录web也面,查看about页面中的状态信息,然后模拟其中一台故障,查看另一台是否转改变更为active


最后附上正常运行的进程截图,如果执行自动故障转移失败,请对比下图中的进程信息,看看是否是某个进程没有启动成功
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐