当前位置: 首页 > news >正文

HDFS集群NameNode高可用改造

文章目录

    • 背景
    • 高可用改造
      • 方案实施
        • 环境准备
        • 配置文件修改
        • 应用配置
        • 集群状态验证
        • 高可用验证

背景

假定目前有3台zookeeper服务器,分别为zk-01/02/03,DataNode服务器若干;

目前HDFS集群的Namenode没有高可用配置,Namenode和Secondary Namenode同时位于zk-03上,

且Secondary Namenode的作用是辅助Namenode恢复,并不是Namenode的高可用备份。

高可用改造

集群规划

zk-01zk-02zk-03
Active NameNodeStandby NameNode
JournalNodeJournalNodeJournalNode
ZK Failover ControllerZK Failover Controller

Hadoop版本为3.0之前,仅支持启用单个Standby Namenode。Hadoop版本3.0后支持启用多个Standby Namenode。

方案实施

环境准备
  1. 关闭防火墙
  2. zk-01/02/03之间配置ssh免密登录
  3. 配置jdk环境变量
配置文件修改
  1. hadoop-2.7.3/etc/hadoop/core-site.xml

    <configuration><property><name>fs.defaultFS</name><!-- delete next line --><value>hdfs://zk-03:9000</value> <!-- delete --><!-- delete done --><!-- add next line --><value>hdfs://hacluster</value><!-- add done --></property><property><name>io.file.buffer.size</name><value>131072</value></property><property><name>hadoop.tmp.dir</name><value>/data/0/hadoop/hadoop/tmp</value></property><!-- add next 5 lines --><property><name>ha.zookeeper.quorum</name><value>zk-01:2181,zk-02:2181,zk-03:2181</value><description>指定zookeeper地址</description></property><!-- add done -->
    </configuration>
    
  2. hadoop-2.7.3/etc/hadoop/hdfs-site.xml

    <configuration><!-- add next multi-lines --><property><name>dfs.nameservices</name><value>hacluster</value><description>指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致</description></property><property><name>dfs.ha.namenodes.hacluster</name><value>namenode1,namenode2</value><description>hacluster下面有两个NameNode</description></property><property><name>dfs.namenode.rpc-address.hacluster.namenode1</name><value>zk-01:9000</value></property><property><name>dfs.namenode.http-address.hacluster.namenode1</name><value>zk-01:50070</value></property><property><name>dfs.namenode.rpc-address.hacluster.namenode2</name><value>zk-02:9000</value></property><property><name>dfs.namenode.http-address.hacluster.namenode2</name><value>zk-02:50070</value></property><property><name>dfs.ha.fencing.methods</name><value>sshfence</value><description>配置隔离机制,同一时刻只有一个Namenode对外响应</description></property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value><description>使用隔离机制时需要ssh免登陆</description></property><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value><description>开启NameNode故障时自动切换</description></property><property><name>dfs.client.failover.proxy.provider.hacluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value><description>配置失败自动切换实现方式</description></property><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://zk-01:8485;zk-02:8485;zk-03:8485/hacluster</value><description>指定NameNode的元数据在JournalNode上的存放位置</description></property><property><name>dfs.journalnode.edits.dir</name><value>/data/0/hadoop/hadoop/journal</value><description>指定JournalNode在本地磁盘存放数据的位置</description></property><!-- add done --><property><name>dfs.replication</name><value>2</value></property><property><name>dfs.namenode.name.dir</name><value>/data/0/hadoop/hadoop/name</value></property><property><name>dfs.blocksize</name><value>268435456</value></property><property><name>dfs.namenode.handler.count</name><value>100</value></property><property><name>dfs.datanode.data.dir</name> 			      												<value>/data/0/hadoop/hadoop/data,/data/1/hadoop/hadoop/data,/data/2/hadoop/hadoop/data,/data/3/hadoop/hadoop/data,/data/4/hadoop/hadoop/data,/data/5/hadoop/hadoop/data,/data/6/hadoop/hadoop/data,/data/7/hadoop/hadoop/data,/data/8/hadoop/hadoop/data,/data/9/hadoop/hadoop/data,/data/10/hadoop/hadoop/data,/data/11/hadoop/hadoop/data</value></property>
    </configuration>
    
应用配置
  1. 登录zk-03
$ scp -r /home/hadoop/hadoop-2.7.3 zk-02:/home/hadoop/
$ scp -r /home/hadoop/hadoop-2.7.3 zk-01:/home/hadoop/
# 停止现有HDFS集群的服务
$ hdfs/sbin/stop-dfs.sh
  1. zk-01/02/03: 全部启动JournalNode
$ hdfs/sbin/hadoop-daemon.sh start journalnode
  1. zk-01: 初始化并启动namenode1、zkfc
# 初始化并启动namenode1
$ hdfs/bin/hdfs namenode -format
$ hdfs/bin/hdfs namenode -initializeSharedEdits
$ hdfs/sbin/hadoop-daemon.sh start namenode
# 在ZK中初始化ha集群的信息
$ hdfs/bin/hdfs zkfc -formatZK
  1. zk-02:启动namenode2、zkfc
# 同步zk01上namenode的元数据信息并启动namenode2
$ hdfs/bin/hdfs namenode -bootstrapStandby
$ hdfs/sbin/hadoop-daemon.sh start namenode
# 在ZK02中同步ha集群的信息
$ hdfs/bin/hdfs zkfc -formatZK
  1. zk-01: 启动集群中其他服务,包括datanode
$ hdfs/sbin/start-dfs.sh
集群状态验证
  1. 登录zk-01/02,分别执行jps, 结果中应存在:
    • PID1 JournalNode
    • PID2 NameNode
    • PID3 DFSZKFailoverController
  • 若不存在JournalNode进程则执行:
    sbin/hadoop-daemon.sh start journalnode
  • 若不存在DFSZKFailoverController进程则执行:
    sbin/hadoop-daemon.sh start zkfc
  • 若不存在NameNode进程则执行:
    sbin/hadoop-daemon.sh start namenode
  1. 登录zk-03,执行jps,结果中应存在:
    • PID JournalNode
  • 若不存在JournalNode进程则执行:

    sbin/hadoop-daemon.sh start journalnode

  1. 在任意DataNode服务器上,执行jps,结果中应存在:
    • PID1 DataNode
  • 若不存在DataNode进程则执行:

    sbin/hadoop-daemon.sh start datanode

高可用验证
  1. 登录zk-01,查看namenode1的状态:

    bin/hdfs haadmin -getServiceState namenode1,输出结果应为active;

    若上述结果为standby,可以执行如下命令将主namenode切换为namenode1:

    bin/hdfs haadmin -transitionToActive --forcemanual namenode1

    再次执行命令查看namenode1和namenode2的状态:

    bin/hdfs haadmin -getServiceState namenode1,输出应为active;

    bin/hdfs haadmin -getServiceState namenode2,输出应为standby。

  2. 登录zk-01,停止namenode1:bin/hdfs --daemon stop namenode
    zkfc进程应自动随之停止,执行jps,结果中不存在NameNode和DFSZKFailoverController。
    查看namenode2的状态:
    bin/hdfs haadmin -getServiceState namenode2,结果应为active。

  3. 重新启动namenode1:
    bin/hdfs --daemon start namenode
    查看namenode1的状态:

    bin/hdfs haadmin -getServiceState namenode1,结果应为standby。

    此时可以使用第1步中切换主节点的命令将主节点切换到namenode1。

http://www.lryc.cn/news/206729.html

相关文章:

  • Spark集群中一个Worker启动失败的排错记录
  • Mysql的JDBC知识点
  • git的实际操作
  • 数据结构零基础C语言版 严蔚敏-线性表、顺序表
  • Keil uVision 5 MDK版软件安装包下载及安装教程(最详细图文教程)
  • 单目3D目标检测[基于深度辅助篇]
  • Ubuntu20.04下安装MySQL8环境
  • html鼠标悬停图片放大
  • 基于hugging face的autogptq量化实践
  • MySQL2:MySQL中一条查询SQL是如何执行的?
  • C++入门01—从hello word!开始
  • Mingw下载---运行vscodeC++文件
  • 数据安全与PostgreSQL:最佳保护策略
  • 火山引擎实时、低延时拥塞控制算法的优化实践
  • adb设备调试常用命令
  • ubuntu下Docker的简单使用并利用主机显示
  • 第12章 PyTorch图像分割代码框架-1
  • 2023CSPJ 旅游巴士 —— dijkstra
  • 数据结构之栈的讲解(源代码+图解+习题)
  • 内网渗透-内网信息收集
  • ​LeetCode解法汇总2520. 统计能整除数字的位数
  • Lua语言编写爬虫程序
  • 安防监控项目---概要
  • 数仓经典面试题
  • 【ARM Coresight 系列文章 15.2 – components power domain 详细介绍】
  • Flutter Android IOS 获取通讯录联系人列表
  • Spring Boot集成SpringFox 3.0与Pageable参数处理
  • 2、基于pytorch lightning的fabric实现pytorch的多GPU训练和混合精度功能
  • python版opencv人脸训练与人脸识别
  • 计算机视觉-数学基础*变换域表示