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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

目录 前言提示 一、安装 & 配置 nodejs 1.1、安装 nodejs 1.2、配置必要目录 1.3、配置环境变量 1.4、测试 安装&配置 是否成功 1.5、安装淘宝镜像 1.5、cnpm 安装(推荐安装) 二、vue-cli3 创建项目 2.1、vue-cli2 和 vue-cli3 主要区…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【STM32F103单片机】利用ST-LINK V2烧录程序 面包板的使用

1、ST‐LINK V2安装 参考: http://t.csdnimg.cn/Ulhhq 成功: 2、烧录器接线 背后有标识的引脚对应: 3、烧录成功 烧录成功后,按下核心板的RESET键复位!!!即可成功! 4、面包板的…

Docker 安装篇(Ubuntu)

图省事一般采用第一种 一、 直接采用apt安装 apt install docker.io查看 /usr/lib/systemd/system/docker.service ubuntu默认守护进程用的:fd:// ps -ef | grep docker root 775237 1 0 11:14 ? 00:01:07 /usr/bin/dockerd -H fd:// --cont…

SELINUX导致的网络服务问题解决

第一:开启相关服务,监控SELINUX 相关服务:setroubleshoot,auditd,大多数都是以se开头的 如果没有此服务,先yum下,然后查看状态 这里关于auditd说明,centos7不可以用systemctl重启auditd服务,…

Python 拼接字符串的 7 种方式

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。 几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来…

剧本杀小程序的诞生:重塑线下娱乐的数字化未来

随着科技的不断发展,人们对于娱乐方式的需求也在不断升级。近年来,剧本杀作为一种新型的线下社交娱乐方式,以其独特的魅力和深度的人际互动性,受到了广大年轻人的喜爱。然而,传统的剧本杀模式存在一些问题,…

【王道数据结构】【chapter3队列】【P86t3】

利用两个栈S1和S2来模拟一个队列,已知栈的4个运算定义如下 Push(S,x); Pop(S,x); StackEmpty(S); StackOverflow(S); 如何利用栈的运算来实现该队列的3个运算(形参由读者根据要求自己设计) Enqueue;//将元素x入队 Dequeue;//出队,…

canvas自定义扩展示例,新增属性和方法

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

CSAPP shelllab

CSAPP shell lab shell lab 的目标 实现shell 功能,包括解析命令,调用可执行文件和内置命令,(quit, jobs,fg, 和bg)。实现job控制和signal handler。 shell 介绍 Shell中的作业(job)管理是一种用于跟踪和控制正在运…

游戏开发丨基于Tkinter的扫雷小游戏

文章目录 写在前面扫雷小游戏需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于tkinter的扫雷小游戏 所需环境 pythonpycharm或anaconda 下载地址 https://download.csdn.net/download/m0_68111267/88790713 扫雷小游戏 扫雷是一款广为人知的单…

2024年搭建幻兽帕鲁服务器价格多少?如何自建Palworld?

自建幻兽帕鲁服务器租用价格表,2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器,配置分为4核16G和4核32G服务器,4核16G配置32.25元/1个月、3M带宽96.75元/1个月、8核32G配置10M带宽90.60元/1个月,8核32G配置3个月271.80元。ECS…

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…

上位机图像处理和嵌入式模块部署(算法库的编写)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 作为图像处理的engineer来说,有时候我们需要提供上位机软件,有时候需要提供下位机程序,还有一种情况&#xff0…

交换机跨VLAN交换数据ip跳转分析(不一定对)

在网上看到这样一个实验: 交换机1、交换机2分别连接到一台防火墙上,要求使VLAN 2、VLAN3、VLAN5、VLAN6中的终端可互相访问。 拓补 参考链接 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理_网管型交的机…

编程大侦探林浩然的“神曲奇遇记”

编程大侦探林浩然的“神曲奇遇记” The Coding Detective Lin Haoran’s “Divine Comedy Adventures” 在我们那所充满活力与创新精神的高职学院中,林浩然老师无疑是众多教师中最独特的一颗星。这位身兼程序员与心理分析专家双重身份的大咖,不仅能在电脑…

系统分析师-23年-下午题目

系统分析师-23年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五 四选二 试题一 (25分) 说明 某软件公司拟开发一套汽车租赁系统,科学,安全和方便的管理租赁公司的各项业务,提高公司…

部署个人知识库管理软件 MrDoc详细教程

效果 一、拉取 MrDoc 代码 进入目录: cd /opt开源版: git clone https://gitee.com/zmister/MrDoc.git专业版: git clone https://{用户名}:{密码}git.mrdoc.pro/MrDoc/MrDocPro.git二、拉取 Docker 镜像 docker pull zmister/mrdoc:v7三…

MS7338MA高清 HD/全高清 FHD 可选择视频运放与视频同轴线控解码

产品简述 MS7338MA 是一颗集成单通道视频放大器与视频同轴线控解 码为一体的芯片,它内部集成 12dB 增益轨到轨输出驱动器以及 10 阶滤波器,允许同一个输入信号在 -3dB 带宽 30MHz 和 45MHz 之间进行选择控制。视频同轴线控解码内部集成一颗高…

AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型

Transformer模型的崛起标志着人类在自然语言处理(NLP)和其他序列建模任务中取得了显著的突破性进展,而这一成就离不开GPU(图形处理单元)在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…