HDFS Federation[官网整理]

【HDFS Federation(2.2+)】

 

一、Background

    HDFS数据存储主要有两层:

    1、 Namespace,包含“目录”、“文件”、“blocks”信息,支持所有的与namepace相关的文件系统的操作,例如目创建、删除、修改,以及对目录文件的列表操作。

    2、Block存储服务:

        A) Block管理:Namenode负责,集群中的Datanodes向Namenode注册状态且间歇性的发送心跳;Namenode接收Datanodes提交的Blocks报告,并负责维护Blocks的位置关系;支撑Blocks相关的操作,例如Block的创建、删除、修改、迁移,以及获取block的位置信息;管理replicas的放置,以及对under-replicated的blocks进行备份,以及删除over-replicated的多余的blocks。

        B) Storage:由Datanodes负责,用于提供Blocks实际数据的存储和读写操作。

 

    HDFS架构中,集群中只允许一个Namespace,即一个Namenode管理Namespace。HDFS Federation(联盟)通过在HDFS文件系统中增加支持多个Namenodes/namespaces,以解决这种架构上的限制。

 

二、Multiple Namenodes/Namespaces

    为了水平扩展name service,Federation使用了多个独立的Namenodes/namespace。Namenodes是联合的(federated),即他们互相独立,不需要彼此间互相协同。Datanodes作为普通的存储,服务于所有的Namenodes。每个Datanodes会与集群中所有的Namenodes注册,Datanodes向Namenodes发送心跳和Block reports,以及处理Namenodes发送的指令。



 

    1、Block Pool

    Block Pool就是同一个namespace下的多个Blocks的集合。Datanodes为整个集群中所有Block pools提供存储服务。各个Block pool在被管理上是互相独立的。每个Namespace会为新的Block生成Block ID,而且无需和其他Namespace协调;一个Namenode的失效,不会影响Datanodes继续为其他Namendoes服务。(每个Namespace对应一个Block Pool)

 

    Namespace与其Block pool统称“Namespace volume”,它是一个子包含(selft-contained)的管理单元。当一个Namenode/Namespace被删除,那么Namespace对应的Block Poll也将被删除。每个Namespace Volume在软件更新时(ungrade)也作为一个单元。

 

    2、ClusterID

    一个新的标识ClusterID添加到集群,用来标记所有的Nodes,当Namenode格式化时(formated),将会自动创建ClusterID,这个ID用来区分集群中的Namenodes。

 

    3、Key Benefits(主要收益)

        A) Namespace 扩展性:HDFS集群中存储层可以水平扩展,但是namespace无法做到,大规模集群部署或者系统中有较多的小文件时,将可以通过添加多个Namenodes实现namespace的水平扩展。

        B) 性能:根据HDFS的架构,文件系统操作的吞吐量将受限于单个Namenode,通过添加多个Namenodes的方式扩展文件系统,可以提升其读写能力。

        C) Isolation(隔离):单个Namenode在多用户环境中无法提供“隔离”。一个测试(experimental)程序可以将Namenode过载,并拖慢production核心应用。通过使用多个Namenode,将不同类型的应用和用户隔离到不同的Namenodes中。(环境 + 用户隔离)

 

三、Federation配置

    Federation配置时向后兼容的,对于现存的单Namenode配置而言,不需要任何修改即可工作。新的配置文件可以在所有的nodes都一样,不需要根据node类型而部署不同的配置文件。

 

    一个新的概念NameServiceID被添加到Federation中,Namdenode和相应的SNN、backup、checkpoiner节点都按照NameServiceID划分。为了能够在一个配置文件中支持Federation(即多Namenodes),那么和Namenode、SNN、backup、checkpoint配置参数,都需要以相应的NameServiceID作为后缀。

 

    1、配置

         A) Step 1:将"dfs.nameservices"配置项添加到hdfs-site.xml中,它的值为NameServiceID列表,以“,”分割;Datanodes将使用它们来判断集群中的Namenodes。

        B) Step 2:每个Namenode、SNN、Backup、Checkpointer中,将下文中几个配置项添加到配置文件中,每个配置项以对应的NameServiceID作为后缀。(hdfs-site.xml)

Namenode

dfs.namenode.rpc-address

dfs.namenode.servicerpc-address

dfs.namenode.http-address

dfs.namenode.https-address

dfs.namenode.keytab.file

dfs.namenode.name.dir

dfs.namenode.edits.dir

dfs.namenode.checkpoint.dir

dfs.namenode.checkpoint.edits.dir

Secondary

Namenode

dfs.namenode.secondary.http-address

dfs.secondary.namenode.keytab.file

BackupNode

dfs.namenode.backup.address

dfs.secondary.namenode.keytab.file

 

    配置样例:

<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>

 

    如果配置中,上述配置项没有NameServiceID作为后缀,将默认对所有的NameService有效。

 

    2、格式化Namenodes

    一次在每个Namenode上执行“bin/hdfs namenode -format [-clusterId <clusterId>]”,format指令可以指定clusterID,如果不指定将自动生成一个唯一的ClusterID。(基于UUID生成,因此多次format事实上UUID不变,参见,Namenode#format)

 

    因为ClusterID是标记集群的唯一标记,那么一个集群中所有的Nodes包括Namenodes都应该持有相同的ClusterID,否则这些Namenodes将不能构建Federation。

 

    因此在集群中所有的Namenodes上执行-format指令时,需要指定相同的ClusterID。对于默认生成的ClusterID,可以在"${dfs.namenode.name.dir}/current"目录下的VERSION文件中获得,并将此值传递给后续的其他Namenodes。

 

    3、向集群添加新的Namenode

    基于集群中现有的配置文件,将新的Namenode相关的配置项添加到配置文件中(以NameserviceID作为后缀)。调整结束后,将配置文件同步分发给集群中所有的nodes,然后启动当前Namenode、Backup、SNN等。

 

    因为配置文件的修改,通常需要重启集群,这是一种比较保守且安全的方式。不过因为Federation就是实现环境隔离的,所以我们可以只启动那些与新Namenode有关的Datanodes,那么只有这些Datanodes上会存储此Namenode有关的blocks,通过-refreshNamenodes指令可以实现不重启Datanodes的情况下,让其刷新并加载新的Namenode,此后它会与新Namenode注册。

    “hdfs dfsadmin -refreshNamenodes <datanodehost:port>”

 

    不过为了安全起见,建议将refresh集群中的所有Datanodes。

 

四、集群管理

    1、Startup and Stop

    通常我们可以使用“sbin/start-dfs.sh”、“sbin/stop-dfs.sh”来分别启动和关闭集群中所有的守护进程,是一个便捷的方式。此指令可以在集群中任何node上运行,指令可以根据配置文件来判断Namenode(hdfs-site.xml)以及其他nodes的位置(slaves),并SSH到各个node依次执行。

 

    2、Balancer

    Relancer机制是HDFS中很重要的特性,用来动态平衡集群中存储资源的放置位置。start-dfs.sh默认并不会启动balancer,因此balancer功能组件需要额外运行:

    “sbin/start-balancer.sh [-policy <node | blockpool>] [-threshold <num>]”

      -policy参数指定balancer使用的策略,有两个合法值“node”、“blockpool”,其中node为默认值,表示balancing将基于datanode级别;“blockpool”只能在Federation架构下有效,balancer级别为“blockpool”表示每个datanode上每个blockpool的blocks个数分布均衡。建议保持默认。

版权声明:本文为iteye_19607原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_19607/article/details/82602560

智能推荐

说说 Python Django 应用的基础目录结构

通过以下 django-admin 指令创建应用之后,就会生成应用的基础目录结构。 比如,我们建立了一个叫 ‘first’ 的应用,它的目录结构是这样的: 目录或文件 说明 最外层的 first/ 这是新应用的根目录,所有与该应用相关的内容都放在这里。 manage.py 用于管理 Django 项目的命令行工具。 里面一层的 first/ 目录 是一个...

Springboot整合rabbitMQ

依赖: 配置文件application.yml RabbitConfig 消息生产者RabbitProducer 消息消费者RabbitCustomer 通过Controller进行调用 启动项目后调用接口: 结果:...

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

猜你喜欢

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...