HDFS Federation前世今生

一 背景

熟悉大数据的人应该都知道,HDFS 是一个分布式文件系统,它是基于谷歌的GFS实现的开源系统,设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode,如下

从上面可以看出 HDFS 的架构其实大致可以分为两层:

  • Namespace:由目录,文件和数据块组成,支持常见的文件系统操作,例如创建,删除,修改和列出文件和目录。
  • Block Storage Service:这个部分又由两部分组成:
    • 存储(Storage)
      • 是由DataNode提供,主要在本地文件系统存储数据块,并提供读写访问。
    • 数据块管理(Block Management),这个模块由NameNode提供
      • 通过处理DataNode的注册和定期心跳来提供集群中DataNode的基本关系;
      • 维护数据到数据块的映射关系,以及数据块在DataNode的映射关系;
      • 支持数据块相关操作,如创建,删除,修改和获取块位置;
      • 管理副本的放置,副本的创建,以及删除多余的副本。

虽然这个架构可以很好的处理海量的大数据存储,但是当文件比较多,特别是集群运行了很长时间产生大量小文件的情况下,这种架构的 NameNode就会产生很严重的问题。这是因为集群中数据的元数据(比如文件由哪些块组成、这些块分别存储在哪些节点上)全部都是由 NameNode节点维护,为了达到高效的访问,NameNode在启动的时候会将这些元数据全部加载到内存中。而HDFS中的每一个文件、目录以及数据块,在NameNode内存都会有记录,每个数据块的信息大约占用150字节的内存空间。当NameNode维护的目录和文件总量达到1亿,数据块总量达到4亿后,常驻内存使用量将达到90GB!这将严重影响HDFS集群的扩展性。

任何一方面,单个NameNode提供读写访问请求,也会影响整个HDFS集群的吞吐量。同时,这种架构中所有租户共享一个命名空间namespace,无法对不同的应用程序进行隔离。

二 HDFS Federation

为了解决 HDFS 的水平扩展性问题,社区从 Apache Hadoop 0.23.0 版本开始引入了 HDFS federation(参见 HDFS-1052)。HDFS Federation 是指 HDFS 集群可同时存在多个 NameNode/Namespace,每个 Namespace 之间是互相独立的;单独的一个 Namespace 里面包含多个 NameNode,其中一个是主,剩余的是备,这个和上面我们介绍的单 Namespace 里面的架构是一样的。这些 Namespace 共同管理整个集群的数据,每个 Namespace 只管理一部分数据,之间互不影响。

集群中的 DataNode 向所有的 NameNode 注册,并定期向这些 NameNode 发送心跳和块信息,同时 DataNode 也会执行 NameNode 发送过来的命令。集群中的 NameNodes 共享所有 DataNode 的存储资源。HDFS Federation 的架构如下图所示:

通过 HDFS Federation 架构可解决单 NameNode 存在扩展性、业务隔离以及性能等问题。关于如何配置 HDFS Federation 可以参见这里。

三 ViewFs

这个版本的 HDFS Federation 虽然能够解决单 Namespace 带来的一些问题,但是又引来了新的问题。比如现在集群中存在多个 Namespace,每个 Namespace 管理一部分数据,那客户端如何知道要查询的数据在哪个 Namespace 上呢?为了解决这个问题,社区引入了视图文件系统(View File System,简称 ViewFs),具体可以参见 HADOOP-7257。ViewFs 类似于某些 Unix / Linux 系统中的客户端挂载表。ViewFs 可用于创建个性化命名空间视图,也可用于创建每个群集的公共视图。那 ViewFs 是如何解决文件映射到对应的 Namespace 上呢?

ViewFs 通过在 core-site.xml 文件里面引入了路径映射配置,如下:

正如上面的配置文件所示,在启用了 HDFS Federation 的集群,fs.defaultFS 的值已经变成了 viewfs://clusterX,这个和未启用 HDFS Federation 的集群是不一样的。然后紧接着配置了五个属性,用于指定文件和集群的映射关系。

比如用户访问了 /data 路径,那么通过这个配置文件,我们就知道直接到 hdfs://nn1-clusterx.iteblog.com:8020 集群的 /data 路径下拿数据;当用户访问 /iteblog,那么通过这个配置文件,我们就知道直接到 hdfs://nn2-clusterx.iteblog.com:8020 集群的 /iteblog 路径下拿数据。其他路径的数据获取和这个类似。如果访问的路径在配置文件里面没找到,那么将会访问 fs.viewfs.mounttable.ClusterX.linkFallback 属性配置的集群和路径进行访问。关于详细的 ViewFs 配置可以参见 官方文档

四 Router-based Federation

ViewFs 方案虽然可以很好的解决文件命名空间问题,但是它的实现有以下几个问题:

  • ViewFS 是基于客户端实现的,需要用户在客户端进行相关的配置,那么后面对客户端升级就会比较困难,这个客户端相当于重客户端了;
  • 新增或者修改路径映射,需要多方配合完成,维护成本比较高。

为了解决这个问题,社区从 Hadoop 2.9.0 和 Hadoop 3.0.0 版本开始引入了一种基于路由的 Federation方案(Router-Based Federation),具体参见 HDFS-10467,这个方案主要是由微软和优步的工程师实现。和之前的 ViewFS 不一样,这个是基于服务端实现的。

基于路由的 Federation 方案是在服务端添加了一个 Federation layer,这个额外的层允许客户端透明地访问任何子集群,让子集群独立地管理他们自己的 block pools,并支持跨子集群的数据平衡。为实现这些目标,Federation layer 必须将块访问路由到正确的子集群,维护 namespaces 的状态,并提供数据重新平衡的机制,跨集群的数据平衡可以参见 HDFS-13123。同时,这个层必须具有可扩展性,高可用性和容错性。

Federation layer 的设计架构如上图所示,从上图可以看出,这个层包含了多个组件:Router、State Store 以及 Rebalancing mechanisms。Router 组件和 Namenode 具有相同的接口,并根据 State Store 里面的信息将客户端请求转发到正确的子集群。State Store 是远程挂载表(remote mount table,和 ViewFS 方案里面的配置文件类似,但在客户端之间共享),存储子集群相关的信息包括 load/capacity。下面对这几个模块进行介绍。

4.1 Router

一个系统中可以包含多个 Router,每个 Router 主要包含两个作用:

  • 通过 Federated interface,Router 为客户端提供单个全局的 NameNode 接口,并将客户端的请求转发到正确子集群中的活动 NameNode 上;路由器接收到客户端的请求,然后检查 State Store 中是否有正确的子集群,并将请求转发到该子集群的活动 NameNode 上。路由器是无状态的,所以可以部署在负载均衡器后面并达到高可扩展性等。为了提高性能,路由器还会缓存远程挂载表里面的信息和子群集的状态。为确保 State Store 的更改可以传播到所有的路由器,每个路由器需要向 State Store 发送心跳信息。
  • 收集 NameNode 的心跳信息,报告给 State Store,这样 State Store 维护的信息是实时更新的。路由器也会定期检查 NameNode 的状态(通常位于同一服务器上),并将其高可用性(HA)状态和负载/空间状态报告给 State Store。为了实现高可用性和灵活性,多个路由器可以监视相同的 Namenode 并将心跳发送到 State Store,这种方式可以提高整个系统的可靠性,State Store 中冲突的 NameNode 信息是由每个 Router 通过 quorum 协议解决。

4.2 State Store

State Store 物理实现是分布式的,在 State Store 里面主要维护以下几方面的信息:

  • 子集群的状态,包括块访问负载,可用磁盘空间,HA状态等;
  • 文件夹/文件和子集群之间的映射,即远程挂载表;
  • Rebalancer 操作的状态;
  • Routers 的状态。

上面四点中的文件夹/文件和子集群之间的映射其实和 ViewFS 里面的远程挂载表类似,内容如下:

hdfs://tmp → hdfs://C0-1/tmp /* Folder tmp is mapped to folder tmp in subcluster C0-1 */
hdfs://share → hdfs://C0-2/share
hdfs://user/iteblog → hdfs://C0-3/user/iteblog
hdfs://user/user2 → hdfs://C0-2/user2

通过这些我们就可以知道数据在哪个子集群,针对这些信息的存储 Hadoop 为我们提供了几种实现,包括基于文件(StateStoreFileSystemImpl)的和基于ZK(StateStoreZooKeeperImpl)的方式,可以通过 dfs.federation.router.store.driver.class 参数配置。关于 Router-Based Federation 更多的情况请访问 Hadoop 的官方文档。

五 RBF访问流程

上面已经简单的介绍了 Router-Based Federation 的各个组件等情况,下面我们来看看这个方案客户端访问文件的流程,如下所示:

图中的 R 代表 Router。当客户端需要进行读写操作,它的步骤如下:

  • 客户端向集群中任意一个 Router 发出某个文件的读写请求操作;
  • Router 从 State Store 里面的 Mount Table 查询哪个子集群包含这个文件,并从 State Store 里面的 Membership table 里面获取正确的 NN;
  • Router 获取到正确的 NN 后,会将客户端的请求转发到 NN 上,然后也会给客户端一个请求告诉它需要请求哪个 子集群;
  • 此后,客户端就可以直接访问对应子集群的 DN,并进行读写相关的操作。

由于 Router-based HDFS federation 还算比较新的特性,所以社区分了几个阶段修复或添加了一些新的功能,比如 Apache Hadoop 3.2.0 版本修复或添加了一些功能,参见 HDFS-12615,以及 Router-based HDFS federation 稳定性相关的 ISSUE HDFS-13891,这个 ISSUE 可能会在 Apache Hadoop 3.3.0 版本发布。


欢迎关注微信公众号:大数据AI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439119.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备战蓝桥杯---二分(基础)

何为二分&#xff1f;形象的说&#xff0c;就是单调函数求零点。 我们先对二分查找简单的分析一下&#xff08;主要是模板及易错点&#xff09; 1.找>x的第一个位置&#xff1a; 2.找<x的第一个位置&#xff1a; …

Golang 流媒体服务器lalserver使用指南

目录 安装 使用 1.推流 2.播放 官方地址 安装 1.下载源码 wget https://github.com/q191201771/lal/releases/download/v0.36.7/lal_v0.36.7_linux.zipunzip lal_v0.36.7_linux.zip cd lal_v0.36.7_linux 2.启动 ./bin/lalserver -c ./conf/lalserver.conf.json 使用 …

Matlab基础语法

基础语法 %% Matlab基本的小常识 % (1)在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子&#xff1b;)表示不显示运行结果 a 3; a 5% (2)多行注释:选中要注释的若干语句,快捷键CtrlR % a 3; % a 5% (3)取消注释:选中要取消注释的语句,快捷键CtrlT % 我想要取…

JSP仓储管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP仓储管理系统系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测

回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测 目录 回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSTM【24年新算…

leetcode刷题(剑指offer) 237.删除链表中的节点

237.删除链表中的节点 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注…

网站地址怎么改成HTTPS?

现在&#xff0c;所有类型的网站都需要通过 HTTPS 协议进行安全连接&#xff0c;而实现这一目标的唯一方法是使用 SSL 证书。如果您不将 HTTP 转换为 HTTPS&#xff0c;浏览器和应用程序会将您网站的连接标记为不安全。 但用户询问如何将我的网站从 HTTP 更改为 HTTPS。在此页…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

Elasticsearch:如何为 Elastic Stack 配置 AI Assistant

了解并安装 Elastic AI Assistant Elastic 推出了 Observability AI Assistant&#xff0c;这是一款利用生成式 AI 来增强你的 Observability 体验的强大工具。 该 AI 助手由 OpenAI 或 Azure OpenAI 服务的连接器提供支持&#xff0c;可带来上下文洞察和聊天功能&#xff0c;…

vue中的vuex

在Windows的应用程序开发中&#xff0c;我们习惯了变量&#xff08;对象&#xff09;声明和使用方式&#xff0c;就是有全局和局部之分&#xff0c;定义好了全局变量&#xff08;对象&#xff09;以后在其他窗体中就可以使用&#xff0c;但是窗体之间的变量&#xff08;对象&am…

python-自动化篇-运维-语音识别

文章目录 理论文本转换为语音使用 pyttsx使用 SAPI使用 SpeechLib 语音转换为文本 代码和效果01使用pyttsx实现文本_语音02使用SAPI实现文本_语音03使用SpeechLib实现文本_语音04使用PocketSphinx实现语音转换文本 理论 语音识别技术&#xff0c;也被称为自动语音识别&#xf…

TensorFlow2实战-系列教程6:迁移学习实战

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、迁移学习 用已经训练好模型的权重参数当做自己任务的模型权重初始化一般全连接层需…