版权声明:欢迎转载,注明出处 https://blog.csdn.net/jklcl/article/details/82778854
配置Hadoop的高可用
一、准备
-
1、配置好Hadoop、JDK,两台namenode机器可以ssh免密登陆其他机器等
-
2、规划三台虚拟机(hadoop01,hadoop02, hadoop03)
active/standby namenode 与zkfc :hadoop01和hadoop02
JN集群:三台虚拟机都参与
zk集群:三台虚拟机都参与
datanode与nodemanager:三台虚拟机都参与
resourcemanager:hadoop03
二、配置
-
1、修改core-site.xml文件
vi core-site.xml #添加 <!-- 指定在Hadoop中要使用的文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- zookeeper集群地址信息 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> <!-- HDFS中sequenceFiles中使用的读/写缓冲区的大小 --> <property> <name>io.file.buffer.size</name> <value>131072</value> </property>
-
2、修改hdfs-site.xml文件
#新建目录 用来储存namenode信息(路径自定义)
mkdir -p /opt/data/hadoop/hdfs/namenode
#新建目录 用来储存datanode信息(路径自定义)
mkdir -p /opt/data/hadoop/hdfs/datanode
#新建目录 用来储存journalnode信息(路径自定义)
mkdir -p /opt/data/hadoop/jn/data
vi hdfs-site.xml
#添加
<!-- ~~~~~~~~~~~~~~~~~~~ HDFS常规配置 ~~~~~~~~~~~~~~~~~~~ -->
<!-- HDFS中Namenode元数据存储在本地文件系统的位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/hdfs/namenode</value>
</property>
<!-- HDFS中Datanode数据块存储在本地文件系统的位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/hadoop/hdfs/datanode</value>
</property>
<!-- HDFS中数据块的副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- ~~~~~~~~~~~~~~~~~~~ HDFS HA配置 ~~~~~~~~~~~~~~~~~~~ -->
<!-- 此新名称服务的逻辑名称
HDFS的名称服务的逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- dfs.ha.namenodes.[nameservice ID] - nameservice中每个NameNode的唯一标识符
配置逗号分隔的NameNode ID列表。DataNodes将使用它来确定集群中的所有NameNode -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 要监听的每个NameNode的完全限定RPC地址
对于两个先前配置的NameNode ID,请设置NameNode进程的完整地址和IPC端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<!-- dfs.namenode.http-address.[nameservice ID].[name node ID] - 要监听的每个NameNode的完全限定HTTP地址
与上面的rpc-address类似,设置两个NameNodes的HTTP服务器的地址以进行监听 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- dfs.namenode.shared.edits.dir - 标识NameNodes将写入/读取编辑的JN组的URI
这是一个配置JournalNodes地址的地方,它提供共享编辑存储,由Active nameNode写入并由Standby NameNode读取,以保持Active NameNode所做的所有文件系统更改的最新状态。虽然您必须指定多个JournalNode地址,但您应该只配置其中一个URI。URI的格式应为:qjournal://host1:port1;host2:port2;host3:port3/journalId。JournalID是此nameservice的唯一标识符,它允许一组JournalNode为多个联合名称系统提供存储。 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<!-- dfs.journalnode.edits.dir - JournalNode守护程序将存储其本地状态的路径
这是JournalNode计算机上的绝对路径,其中将存储JN使用的编辑和其他本地状态。 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/hadoop/jn/data</value>
</property>
<!-- 启用自动失败转移机制 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客户端用于联系Active NameNode的Java类
配置Java类的名称,DFS客户端将使用该名称来确定哪个NameNode是当前的Active,以及哪个NameNode当前正在为客户端请求提供服务。目前Hadoop附带的两个实现是ConfiguredFailoverProxyProvider和RequestHedgingProxyProvider(对于第一次调用,它同时调用所有名称节点以确定活动的名称,并在后续请求中调用活动的名称节点,直到发生故障转移) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 脚本或Java类的列表,用于在故障转移期间屏蔽 Active NameNode
对于系统的正确性,期望在任何给定时间只有一个NameNode处于活动状态。重要的是,在使用Quorum Journal Manager时,只允许一个NameNode写入JournalNodes,因此不存在从裂脑情况中破坏文件系统元数据的可能性。但是,当发生故障转移时,以前的Active NameNode仍可能向客户端提供读取请求,这可能已过期,直到NameNode在尝试写入JournalNode时关闭。因此,即使使用Quorum Journal Manager,仍然需要配置一些防护方法。但是,为了在防护机制失败的情况下提高系统的可用性,建议配置防护方法,该方法可保证作为列表中的最后一个防护方法返回成功。请注意,如果您选择不使用实际的防护方法,则仍必须为此设置配置某些内容,例如“ shell(/ bin / true) ”。
故障转移期间使用的防护方法配置为回车分隔列表,将按顺序尝试,直到指示防护成功为止 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- fs.defaultFS - Hadoop FS客户端在没有给出时使用的默认路径前缀
可选)您现在可以配置Hadoop客户端的默认路径以使用新的启用HA的逻辑URI。 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
-
3、修改slave文件
为什么要修改呢?这里更改了要求,要求有三台datanode,用来投票,满足奇数台
扫描二维码关注公众号,回复: 3884616 查看本文章vi /etc/slave #可以都改为 localhost #或者是改为 hadoop01 hadoop02 hadoop03
三、启动
- 0.首先停止集群
stop-all.sh
- 1.在ZooKeeper中初始化所需的状态。可以从任意一个NameNode主机运行以下命令来执行此操作。
hdfs zkfc -formatZK
#这将在zookeeper中创建一个znode,其中存储的是自动故障转移相关的数据
#不管过程中显示的信息如何,只要能看到如下信息即可:
#$Successful created /hadoop-ha/mycluster in ZK
- 启动journalnode,在每个配置了JN主机上启动JN
hadoop-daemon.sh start journalnode
#启动完JN进程后稍等2分钟左右再进行下述操作
3.格式化HDFS 在第一个namenode上执行
hdfs namenode -format
4.在第一个namenode上启动hdfs集群
start-dfs.sh #注意:这时候第二个namenode进程可能会起不来
5.去第二个namenode上同步第一个namenode上的数据
hdfs namenode -bootstrapStandby
6.单独在第二个namenode上启动或在第一个namenode所在的机器上执行HDFS集群启动命令
建议第二种方式:
start-dfs.sh //注意在这里会有很多进程已经启动了,忽略之
四、测试
打开hadoop01:50070
主动杀死处于active状态的namenode进程,查看另一个namenode的状态是否变为active状态。