百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Apache Hudi Timeline Server介绍

cac55 2024-09-29 09:26 66 浏览 0 评论

介绍

Hudi 不依赖任何外部第三方服务(如 Zookeeper),因此易于操作。一切都是独立的,并且不存在必须长期运行的服务器组件。启动一个 Spark 集群,摄取一批数据,一切都完全关闭(如果摄取模式是批处理)。但有时,拥有中央服务可能有助于提高表操作效率。因此 Hudi 有一个中央时间线服务器,它与 Driver 程序节点中的主线程一起运行,以协助定期写入和表服务。本文介绍时间线服务器的内容、它解决什么问题以及它如何使一些核心 Hudi 操作受益。

动机

如简介中所示,Hudi 有一个中央时间线服务器,在驱动程序节点中运行并作为 Rest 服务。它有多种好处,第一个用例是提供 FileSystemView api。

Hudi 的核心是维护一个 TableFileSystemView,它暴露 API 来获取给定数据集的文件状态,驱动程序和执行程序将在写入和表服务生命周期的不同时间点查询该状态。中央时间线服务器维护一个缓存的 FSView,每个 Spark 任务都可以轮询该 FSView,从而避免每个 Spark 任务自己加载 FSView,这些 API 响应延迟非常低。如果没有这些API,每个执行器或 Spark 任务可能必须自己构建 FSview,这将导致过多的重复工作,从而影响延迟。

第二个用例是标记(Marker) 实现。Hudi 维护标记来区分 Spark 任务写入的最终数据文件集与由于 Spark 重试而创建的文件。第一个实现是直接标记,实现简单,但在非常大的范围内,我们发现删除标记花费了太多时间。因此我们引入了基于时间线服务器的标记来解决延迟问题。使用基于时间线服务器的标记,删除延迟仅为几秒钟,而在某些情况下使用直接标记需要 30 多分钟。

文件系统视图

Hudi 的核心是维护一个 TableFileSystemView,它暴露 API 来获取给定数据集的文件状态,驱动程序和执行程序将在写入和表服务生命周期的不同时间点查询该状态。一些众所周知的 API 包括:获取所有文件组的最新基本文件、获取给定分区的最新文件切片、获取最新的合并文件切片(在压缩正在进行时有用)、获取最新的挂起压缩操作、获取替换的文件组 (Clustering和其他替换提交操作)等。

TableFileSystemview 有不同的实现,例如内存中的 FSView、基于元数据的 FSview、RockDBBased FSView、基于可溢出映射的 FSView 等。最常见的是内存和元数据 TableFileSystemView。内存表文件系统视图使用文件系统列表查询 Hudi 时间线和数据文件,并填充服务这些 api 所需的所有内部数据结构。基于元数据的文件系统视图使用元数据表而不是直接文件系统列表。所有这些 FSview 都有内置缓存,这意味着一旦为给定分区加载文件组,后续调用就可以从内存数据结构本身提供服务,而不会产生额外的 I/O。但是所有填充的数据结构(缓存)都必须在时间线发生新更改时(新提交完成时)重新加载,这不可避免。因此来自中央时间线服务器的缓存 FSView 通过减少延迟为我们提供了相当高的价值。

FileSystemView 调用的控制流

先看看在没有时间轴服务器的情况下事情会如何发展。假设我们正在操作一个由 1000 个分区组成的表,每个分区有 100 个文件组。会调用如下API

getLatestBaseFile(String partition, String fileID)

5000 个随机文件组。因此 5000 个随机文件组可以分布在不同的分区上。最简单的选择是在驱动程序本身中执行所有内容。但是整个执行将是串行的,这可能会非常慢。换句话说我们可以在 for 循环中以单线程方式获取 5000 个文件组的最新基本文件,而不利用集群资源。让我们利用 Spark 并行执行来实现,因此驱动程序中的典型调用可能如下所示

engineContext.parallelelize(partitionFileIdPairs)
.map(partitionFileIdPair -> {
Build FileSystemView for partition of interest
Fetch latest base file for the fileId of interest and return
}).collect(Collectors.toList())

由于我们利用 Spark 的并行执行,因此与在驱动程序中执行所有操作相比,这应该会加快速度。但我们确实还有进一步优化的空间。由于我们对分布在 1000 个分区中的 5000 个文件组感兴趣,因此大致对每个分区中的 50 个文件组感兴趣。整个调用中最昂贵的操作是构建 FileSystemView。根据上面的 DAG,我们正在 50 个 Spark 任务(与 50 个文件组相关)中为给定分区构建 FileSystemView。

使用 Timeline Server 控制 FileSystemView 调用的流程

位于中心时间轴服务器在消除实例化 FileSystemView 过程中不必要的延迟方面发挥着至关重要的作用。时间线服务器是一个Rest服务,它在同一节点中运行,并在单独的线程中与驱动程序一起处理。所有 FileSystemView 调用都将由该时间线服务器通过 Rest 调用提供服务。执行器会将 FSview 调用路由到位于中心的时间线服务器并返回结果。由于我们还内置了一个缓存层,因此它们往往非常高效,并且避免了 FSview 的重复实例化以及不必要的 I/O。

继续获取 500 个文件组的最新基本文件的示例。当时间线服务器运行并将存储布局设置为 RemoteFileSystemView 时,它可能如下所示。

engineContext.parallelelize(partitionFileIdPairs)
.map(partitionFileIdPair -> {
Make remote request to Timeline server for latest base file for fileId and partition of interest
Return the value obtained as the response
}).collect(Collectors.toList())

在并行线程中,在时间线服务器(REST SERVICE)内:

Receives the request from 5000 spark tasks.
Serves FSview calls for partition of interest if already loaded and cached.
If not, loads the FS view for the given partition of interest.
Serves the response based on the populated data-structures.

正如我们所看到的通过将调用路由到中央时间线服务器来优化对 FSView api 的调用,该服务器提供来自缓存视图的响应。

getLatestBaseFile()只是一个说明。与此类似大多数 FS 视图调用都会路由到中央时间线服务器,并由缓存的 FS 视图提供服务。

基于元数据的 FS 视图

Hudi为每个数据表都有一个元数据表,用于缓存表中的文件列表。如果启用的话,FSview 也可以从元数据表构建。在这种情况下 FS 视图的实例化基于元数据表的 FILES 分区中的数据。这里我们讨论的是时间轴服务器中使用的 FSview 实现。

我们已经确定了一些调用(例如清理器),其中每个分区都将跨所有 Spark 任务加载,因此我们添加了优化以尽可能使用对元数据表的单个调用来预加载所有分区。当表有 1000 个或更多分区时,这会极大地加快 FS 视图调用延迟。

基于时间线服务器的标记

时间线服务器也用作另一个标记实现,在此之前我们有执行器直接操作的直接标记,我们将在其他博客中讨论这个主题。如果感兴趣可以点击此链接讨论基于时间线服务器的标记。

结论

通常操作 Hudi 不需要任何像 Zookeeper 这样需要单独维护的集中运行服务器。在某种程度上时间线服务器是驱动程序节点中长时间运行的服务,用于避免不必要的 I/O,并通过缓存层为 FSview 调用提供服务。

相关推荐

电工电路图中二极管、三极管的符号标识

1、二极管二极管是一种常用的具有一个PN结的半导体器件,它具有单向导电性,通过二极管的电流只能沿一个方向流动。二极管只有在所加的正向电压达到一定值后才能导通。在电工电路图中,二极管以专用的图形符号和电...

开关部件在电工电路中的符号标识

1、在电工电路中还常常绘制有具有专门含义的图形符号,认识这些符号对于快速和准确理解电路图十分必要。在识读电工电路的过程中,还常常会遇到各种各样的功能部件的图形符号,用于标识其所代表的物理部件,例如各种...

走过路过 别错过!整理最全电工电路各种元器件及辅料字母符号解析

走过路过别错过!整理最全电工电路各种元器件及辅料字母符号解析建议收藏备用起来以备不时之需!每天学习一点点就会有收获!...

熬夜吐血整理的电工电路的字母符号!及各种元器件实物图解符号!

熬夜吐血整理的电工电路的字母符号!及各种元器件实物图解符号!...

电气人士接好了!史上最全的电气符号介绍

有没有人像小编一样看到这样的图纸就犯晕啊?像这样的图纸对于电气人士来说应该不陌生吧,可是对于一些刚入行的,或者在电气行业却不是技术岗位的人来说,那与天书没什么区别。今天小编狠狠心,为大家搜集了一些关于...

新手工程师,这些电路图符号你都了解吗?

以下电路图符号大全,千万别弄错了噢~~更多行业信息可查阅快点PCB平台订阅号:eqpcb_cp。...

电工学习通(一):电路图符号知识大全(安科瑞任心怡、许玉龙)

电路图符号知识我们常说的电路图呢是一种以物理电学标准符号来绘制各MOS管电子元器件组成和关系的电路原理布局图,听不懂也没关系,我们只要记住以下几点就可以了:电路图符号数量众多,大致可以分为四个类别:传...

常用电子元器件电路符号及实物外形图,你值得拥有

作为一名电工初学者,认识并了解常用的电子元器件是一项必备的基本技能,这包括电子元器件的电路符号、实物、用途等。本文电工学习网小编和大家分享一些电子元器件的电路符号及实物外形图,希望对大家的学习有所帮助...

电工常用的符号及单位

常用的符号及单位①欧姆定律I=U/R(适用于电阻电路,如白炽灯)②电能计算W=P·t(W为我们常说的电度,P为功率多少瓦或千瓦,t为时间小时计量)例如一个220V,60W的白炽灯,在220V电压工...

电路图常用的字母符号及释义(详细版!)

你是不是在查看电路图时常遇到一些看不懂的字母或字符,不明白它们表示什么含义?今天小编整理了一些电路图常用的字母符号及其释义,供大家查阅,赶快收藏吧!在之前的文章,小编大致整理了绘制电路图常涉及的电路符...

最全电工电路的字母符号大全!电工必备知识技能!建议收藏备用

最全电工电路的字母符号大全!电工必备知识技能!建议收藏备用!每天学习一点点就会有收获!学海无涯!...

电路符号大全,赶快收藏

认识电路符号是绘制电路图的前提。绘制电路图需要涉及的电路符号罗列出来有很多,大致可以分为五个类别:基本电路符号、传输路径符号、开关和继电器符号、集成电路组件以及限定符号。基本电路符号绘制基础电路图可能...

电气电路的图形符号,不怕看不懂电路图啦

一、电压、电流、电池的图形符号//二、信号灯、信号器件、按钮、旋钮开关和测量仪表的图形符号//三、负载开关的图形符号//四、熔断器的图形符号//五、继电器、接触器、接触器触点和操作器件的图形符号//六...

图解普通电阻器电路符号的含义,初学者必看

电子元器件的电路符号中含有许多有用的、对电路分析有益的识图信息,掌握了电子元器件电路符号的识图,电路分析就会简单一些。电阻器电路符号图1-1所示是普通电阻器电路符号图解示意图。在电路分析中,为了表述方...

电路图符号大全(电容、电阻、二极管、三极官、集成电路)

基础知识薄弱,不懂工作原理,不会看图、识图,这里更多电路图(原理图)符号大全、电路图形符号(指用一种书画图形代表一种电子元件)(比如:电容、电阻、二极管、三极官、集成电路等等)的符号为初学...

取消回复欢迎 发表评论: