常见 MQ 的比较 - Kafka、RocketMQ、RabbitMQ的优劣势比较 GFS 论文学习和 HDFS 实现的比较 Docker技术入门与实战 - 使用 dockerfile定制镜像 I love log 读书笔记 flink 入门程序-wordcount flink 配置项介绍 在 Mac 上搭建 Flink 的开发环境 lambda 架构问题的阅读笔记 IDEA常用插件 Mybatis源码分析(1) - Mybatis关键类 Mybatis源码分析(1) - Mybatis包目录简介 tair 1:tair学习 dataflow论文阅读笔记 Polysh的安装使用 SnappyData排序函数比较 Squirrel-sql客户端连接SnappyData手册 在虚拟机里显示Hello World spark学习博客推荐 SnappyData学习博客和官网文章 Docker常用命令 MyBatis支持的OGNL语法 mysql性能优化 mysql性能优化-优化Sql语句 java各版本新特性 mac上命令行操作 explain输出格式 从文件中读取zk配置——ZooKeeper编程技能(1) git进阶经验-从项目中删除移除的目录 Mongodb 学习之shell命令操作(3) mysql命令 git进阶经验-从多模块项目中分理子模块 从零学hadoop-搭建基础(单点)的Hdfs环境 ZooKeeper集群操作脚本 Vue安装使用 2 初学JVM之问答式记住类加载机制 2 初学JVM之问答式记住虚拟机性能监控与故障处理工具 2 初学JVM之问答式记住垃圾收集器 log4j2 按天生成日志文件 1 初学JVM之问答式记住java自动内存管理 MapReduce学习心得之MapReduce初识 log4j2 日志发送到kafka配置实战 log4j2 日志配置实战 Mongodb 学习之shell命令操作(二) Mongodb 学习之linux版本安装(一) Dubbo的初级使用 ServiceLoader内部实现分析 ServiceLoader 初级应用 log4j日志发送邮件配置实战 红黑树笔记 IDEA首次使用之前的配置 java源码学习之Enum java源码学习之String 自定义Spring tag标签 编写一键发布脚本 记一次Spring Scheduler莫名不执行的一次堆栈分析 kafka的基本操作 nginx 5:Nginx内部变量 nginx 4:Nginx日志管理 提高hadoop配置效率的shell脚本 Hive编程指南之一 Hive的安装 Ambari服务器安装 Ambari服务器管理集群 HBase分布式安装 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 搭建JStorm集群 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 配置vmware中的虚拟机使用宿主机的共享网络 YARN架构简述 HDFS 架构 Spring的统一异常处理机制 Tomcat 配置服务 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 nginx 3:Nginx反向代理 mybatis操作主体流程 1.正则表达式学习-基础篇 log4j日志配置详解 mysql的时间函数 nginx 2:Nginx模块配置理论及实战 HashMap相关解析和测试文章 工作一年后的面试 用私有构造器或枚举类型强化Singleton属性 java中比较重要的图 mybatis处理枚举类 mybatis集成进spring Spring比较重要的几个截图 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 markdown在jekyll中支持的一些操作 Spring项目中配置sl4j和log4j的日志配置 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 Spring的profile机制介绍 mybatis-generator反向生成 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 (转)浅析 Decorator 模式,兼谈 CDI Decorator 注解 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 Http 协议相应状态码大全及常用状态码 IDEA快捷键 JDBC Type与Java Type redis 12:redis 操作集合 mybatis-generator错误集合 redis 11:redis 错误集合 nginx 1:nginx的安装 redis 10:redis cluster命令操作 redis 9:redis实例集群安装 java设计模式 hadoop集群学习笔记(1) Apache Shiro 简介 vim编辑神器的进阶命令 Eclipse配置 Eclipse快捷键 Linux 测试题 Linux脚本学习(1) Linux启动简要过程 Centos7上安装Mysql hadoop集群学习笔记(1) (转)分布式发布订阅消息系统 Kafka 架构设计 maven 命令 Kafka集群安装 Kafka初步使用 redis 8:redis server 和 scripting命令操作 redis 7:redis transaction 和 connection命令操作 redis 6:redis hash 命令操作 redis 5:redis sorted_set 命令操作 搭建本地Jekyll+Markdown+Github的开发环境 Spring源码阅读笔记(2) redis 4:redis set命令操作 Spring添加任务调度配置 redis 3:Redis list命令操作 redis 2:redis 一般命令操作 redis 1:redis单机安装笔记 redis 0:redis配置属性描述 Spring源码阅读笔记(1) spark 错误集锦 spark集群安装 Linux 基本命令操作 Hadoop错误信息处理 Hadoop代码拾忆 从零开始搭建spring-springmvc-mybatis-mysql和dubbo项目 java知识点札记 java排错 Google Java Style 中文版 git进阶经验 github使用经验 MongoDB用户角色授权与AUTH启用 MongoDB 命令 MongoDB 特定规范 Spring MVC实现跳转的几种方式 史上最全最强SpringMVC详细示例实战教程 Spring 零星笔记 js中(function(){…})()立即执行函数写法理解 如何解决跨域问题 创建ajax简单过程 前端定位 设置MYSQL允许通过IP访问 mybatis异常 :元素内容必须由格式正确的字符数据或标记组成 如何为 WordPress 绑定多个域名的方法s WordPress工作原理之程序文件执行顺序(传说中的架构源码分析) Spring源码导入Eclipse中 基于PHPnow搭建Eclipse开发环境 解决wordpress首页文章内容截断处理的几种方法 ZooKeeper理论知识 ZooKeeper集群安装配置 Git常用命令速查表 Linux 4:磁盘与文件系统管理 Linux 3:文件与目录管理 Linux 2:文件权限与目录配置 Markdown输入LaTeX数学公式
从零学hadoop-搭建基础(单点)的Hdfs环境 MapReduce学习心得之MapReduce初识 Ambari服务器安装 Ambari服务器管理集群 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 YARN架构简述 HDFS 架构 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 hadoop集群学习笔记(1) hadoop集群学习笔记(1) Hadoop错误信息处理 Hadoop代码拾忆

HDFS的Federation之路

2016年11月14日
摘要:HDFS的Federation之路

该指南提供了HDFS 联邦特性的概述和怎样配置和管理联邦集群

背景

federation-background.gif

HDFS 有两个主要的层:

  • 命名空间

    目录,文件和块的一致性

    支持文件系统相关的所有命令空间操作:增删改查等。

  • 块存储服务

    • 块管理器(被NN执行)
      • 提供了DataNode集群成员注册和周期性报告心跳
      • 处理块报告和维护块的位置
      • 支持块相关操作,如增删改查块的位置
      • 管理副本的位置,重复块下的块副本,删除重复的块
    • 存储
      • DN提供并将块存储在本地文件系统并且允许读写访问。

以前的HDFS架构只允许在一个集群中有一个nameservices,那样的话,单个NN管理nameservicesFederation通过对HDFS增加多个NN(nameNode)和多个NS(nameservices)的支持,解除了该限制。

多NN/多NS

为了水平扩展NS,Federation使用了多个独立的NN/NS,这些NN是结盟的。这些NN是独立的,并且不需要与其他NN相互协调。 DN集群作为所有NN节点公共的块存储使用。每个DN会在集群中的所有NN中注册。DN会定期向所有的NN发送心跳和块报告。 他们也会处理来自NN的命令。

用户可能会用ViewFS来创建更加个性化的NS视图。VIewFS就像linux/unix系统中的客户端注册表。

federation-background.gif

块池

块池是属于一个NS的块的集合,DN存储集群中所有块池中的块,每个块池都是独立管理的。这允许一个NS为新的块生成块ID而不需要与其他的NS协调。 集群中一个NN挂掉了,不会影响DN为其他的NN继续提供服务。

NS和它的块池一起叫做NS卷,它是独立的经营单位。当一个NN/NS被删除时,其在DN上对应的块也会被删除。

在集群升级的时候,NS卷作为一个单元升级。

集群ID

集群ID是为了标识集群内所有的节点。当NN被格式化时,该标识要么被提供要么自动生成。该标识应该被用来格式化加入集群的其他NN

核心优势

  • NS扩展性
    Federation可以添加NS水平扩展。通过将更过的NN加入到集群使,大型部署或部署使用大量小文件从NS扩展中获益。

  • 性能

    文件系统的吞吐量不再受限于单个NN。在集群中添加更多的NN可以扩展文件系统的吞吐量。

  • 隔离

    单个NN在多用户环境中没有提供隔离性。比如,一个测试会因为超负载运行,导致生产应用变慢。但是通过多个NS,不同的应用和用户可以隔离在不同的NS中。

Federation配置

federation 的配置是向后兼容的,并且允许已经存在的单节点配置可以没有任何修改继续工作。新配置设计成集群中所有节点使用相同的配置,这样就不会根据集群节点类型的不同而部署不同的配置了。

Federation会增加一个新的抽象的NameServiceID,一个NN和与它相应的Secondary/backup/checkpointer节点属于同一个NameServiceID

为了支持单配置文件,NN和与它相应的Secondary/backup/checkpointer节点配置参数都会有NameServiceID

配置

步骤一:添加参数dfs.nameservices到你的配置并配置以逗号分隔的NameServiceID列表。该设置用于DN判定集群中的NN。

步骤二:在通用配置文件中,每个NN和与它相应的Secondary/backup/checkpointer节点添加如下参数都需要添加相应的NameServiceID作为后缀。

进程 参数
NN dfs.namenode.rpc-address
NN dfs.namenode.servicerpc-address
NN dfs.namenode.http-address
NN dfs.namenode.https-address
NN dfs.namenode.keytab.file
NN dfs.namenode.name.dir
NN dfs.namenode.edits.dir
NN dfs.namenode.checkpoint.dir
NN dfs.namenode.checkpoint.edits.dir
SNN dfs.namenode.secondary.http-address
SNN dfs.secondary.namenode.keytab.file
BN dfs.namenode.backup.address
BN dfs.secondary.namenode.keytab.file

两个NN配置的例子;

<configuration>
  <property>
    <name>dfs.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>nn-host1:rpc-port</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns1</name>
    <value>nn-host1:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.secondaryhttp-address.ns1</name>
    <value>snn-host1:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>nn-host2:rpc-port</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns2</name>
    <value>nn-host2:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.secondaryhttp-address.ns2</name>
    <value>snn-host2:http-port</value>
  </property>

  .... Other common configuration ...
</configuration>

格式化NN

步骤一:使用如下命令格式化一个NN

 $HADOOP_PREFIX/bin/hdfs namenode -format [-clusterId <cluster_id>]

<cluster_id>选择一个你的环境中与其他集群不冲突的唯一clusterId,如果没有提供,会自动生成一个唯一id。

步骤二:格式化集群中其他的NN

 $HADOOP_PREFIX/bin/hdfs namenode -format -clusterId <cluster_id>

注意:该处要使用与步骤一相同的clusteId,如果不同,则附加的NN将不会是联邦集群的一部分。

从老版本升级并配置联邦

老版本只支持单个NN,为了启用Federation,升级集群到新版本。升级期间要提供一个像下面这样的clusterId。

$HADOOP_PREFIX/bin/hdfs start namenode --config $HADOOP_CONF_DIR  -upgrade -clusterId <cluster_ID>

如果clusterId没有提供,将会自动生成。

将新的NN添加到已存在的集群中

执行如下步骤:

  • dfs.nameservices添加到配置中
  • 更新带有NameServiceID 后缀的配置,为了使用Federation,你必须使用新配置参数名称
  • 将新的NN相关配置添加到配置文件中
  • 将配置文件分散到集群其他所有节点上
  • 启动新的NN/SNN/BackUp
  • 对集群中所有DN节点通过运行如下的命令,来使得DN能识别新加入的NN。
$HADOOP_PREFIX/bin/hdfs dfsadmin -refreshNameNodes <datanode_host_name>:<datanode_rpc_port>

管理集群

启动和停止集群

启动集群:$HADOOP_PREFIX/sbin/start-dfs.sh

停止集群:$HADOOP_PREFIX/sbin/stop-dfs.sh

这些命令可以从能读到配置任何节点上执行。该命令根据配置决定集群中的NN,并在这些节点机器上启动NN进程。 DN在salve文件中指定的节点上启动。该脚本可以作为你自定义的启动和停止集群脚本的参考。

均衡器

均衡器已经改变为可使用多个NN工作。该均衡器可以执行下面的命令:

$HADOOP_PREFIX/sbin/hadoop-daemon.sh start balancer [-policy <policy>]

policy参数可以是以下的任一种:

  • datenode 默认的策略,该均衡存储在DN级别。与以前版本的均衡策略很类似。

  • blockpool 该均衡存储在块池级别,块池的均衡在DN级别

注意:均衡器只均衡数据而不均衡namespace

停运

停运与之前版本相似,需要停运的节点要加在所有NN的exclude文件中。每个NN停运它自己的块池。只有当所有的NN停运了一个DN,该DN才会考虑停运。

步骤一:分发exclude文件到所有的NN,使用如下命令:

$HADOOP_PREFIX/sbin/distribute-exclude.sh <exclude_file>

步骤二:刷新所有的NN,获取到新的exclude文件。

$HADOOP_PREFIX/sbin/refresh-namenodes.sh

上面的命令会根据配置决定集群中配置了的NN ,并刷新它们使得获取新的exclude文件。

集群web控制界面

和NN的状态web界面相似。在Federation集群可以使用web控制界面时,使用http://<any_nn_host:port>/dfsclusterhealth.jsp。集群中任一NN都可以访问该页面。

集群的web控制界面提供了如下信息:

  • 集群的概览,包括文件数目、块数目、集群中总配置存储容量、可用和已用存储。
  • NN的列表和概览,包括每个NN上的文件数目、块数目、丢失块数目、存活的DN数目、死掉的DN数目。也提供了一个连接访问每一个NN的web界面。
  • 停用状态的DN。