为了有机地发展业务,每个组织都在迅速采用分析。 在分析过程的帮助下,产品团队正在接收来自用户的反馈,并能够以更快的速度交付新功能。 通过分析提供的对用户的更深入了解,营销团队能够调整他们的活动以针对特定受众。 只有当我们能够大规模提供分析时,这一切才有可能。

对数据湖的需求

在 NoBrokercom,出于操作目的,事务数据存储在基于 SQL 的数据库中,事件数据存储在 No-SQL 数据库中。 这些应用程序 dB 未针对分析工作负载进行调整。 此外,为了更全面地了解客户和业务,通常需要跨交易和事件数据加入数据。 这些限制大大减慢了分析过程。

为了解决这些问题,我们开发了一个名为 STARSHIP 的数据平台,它提供了所有 Nobroker 数据的集中存储库,并且可以通过 SQL 访问。

STARSHIP 正在为 40TB+ 快速发展的数据提供分析。 在 Nobroker 上发生的任何事件或交易,都可以在 30 分钟内在 Starship 中进行分析。

它的一个组成部分是构建针对分析优化的数据存储层。 Parquet 和 ORC 数据格式提供此功能,但它们缺少更新和删除功能。

Apache Hudi

Apache Hudi 是一个开源数据管理框架,提供列数据格式的记录级插入、更新和删除功能。 我们在将数据带到 STARSHIP 的所有 ETL 管道中广泛使用 Apache Hudi。 我们使用 Apache Hudi 的 DeltaStreamer 实用程序采用增量数据摄取。 我们已经能够增强 DeltaStreamer 以适应我们的业务逻辑和数据特征。

DeltaStreamer

在到达分布式云存储之前,数据通过 Apache Hudi 中的多个相互连接的模块进行处理。 这些模块可以独立工作,也可以通过 Delta-streamer 实用程序工作,从而简化整个 ETL 流程。 尽管提供的默认功能有限,但它允许使用可扩展的 Java 类进行定制。

源读取器

源读取器是 Hudi 数据处理中的第一个也是最重要的模块,用于从上游读取数据。 Hudi 提供支持类,可以从本地文件(如 JSON、Avro 和 Kafka 流)读取。

在我们的数据管道中,CDC 事件以 Avro 格式生成到 Kafka。 我们扩展了源类以添加来自 Kafka 的增量读取,每次读取一个特定的编号。 来自存储的检查点的消息,我们添加了一项功能,将 Kafka 偏移量附加为数据列。

# Reading data from Kafka from given Offset ranges
baseConsumerRDD = KafkaUtils.createRDD(
sparkContext,
KafkaParams,
offsetRanges,
consistent_location_strategy,
)
.filter(x -> x != null)
.filter(x -> x.value() != null);
# Adding Message offset to the data
baseRDD = baseConsumerRDD.map(x ->"{
\"starship_offset\":"+x.offset()
+","
+"\"starship_value\": "
+ x.value().toString() +
"}"
);
# Reading into Spark data frame & Applying schema
table_df = sparkSession.read()
.schema(table.getIncomingSchema())
.json(baseRDD)
.select(
"starship_value.*",
"starship_offset"
);

在初始数据读取之后,我们还强制执行从 Kafka 模式注册表或用户提供的自定义模式获取的模式。

业务逻辑处理器

从 Source reader 带入 Spark 数据帧的数据将采用原始格式。为了使其可用于分析,我们需要对数据进行清理、标准化和添加业务逻辑。 STARSHIP 中的每个数据点都经过以下转换,以确保数据质量。

  • case标准化:下/上case。
  • 日期格式转换:将各种字符串日期格式转换为毫秒。
  • 时区标准化:将所有时区的数据转换为 UTC。
  • 电话号码标准化:将电话号码格式化为“国家代码 - 电话号码”格式。
  • 数据类型转换:将引用的数字转换为 Int/Long,转换为文本格式等。
  • 屏蔽和散列:使用散列算法屏蔽敏感信息。
  • 自定义 SQL 查询处理:如果需要对特定列应用自定义过滤器,它们可以作为 SQL 子句传递。
  • 地理点数据处理:将地理点数据处理为 Parquet 支持的格式。
  • 列标准化:将所有列名转换为蛇形大小写并展平任何嵌套列。

键生成器

Hudi 中的每一行都使用一组键表示,以提供行级别的更新和删除。 Hudi 要求每个数据点都有一个主键、一个排序键以及在分区的情况下还需要一个分区键。

  • 主键:识别一行是更新还是新插入。
  • 排序键:识别当前批次事件中每个主键的最新事件,以防同一批次中同一行出现多个事件。
  • 分区键:以分区格式写入数据。

对来自 CDC 管道的事件进行排序变得很棘手,尤其是在同一逻辑处理多种类型的流时。为此,我们编写了一个键生成器类,它根据输入数据流源处理排序逻辑,并提供对多个键作为主键的支持。

Parquet写入器

一旦数据处于最终转换格式,Hudi writer 将负责写入过程。每个新的数据摄取周期称为一次提交并与提交编号相关联。

  • 提交开始:摄取从在云存储中创建的“<commit_no>.commit_requested”文件开始。
  • 提交飞行:一旦处理完所有转换后开始写入过程,就会创建一个“<commit_no>.commit_inflight”文件。
  • 提交结束:一旦数据成功写入磁盘,就会创建最终的“<commit_no>.commit”文件。

只有当最终的 .commit 文件被创建时,摄取过程才被称为成功。万一发生故障,Hudi writer 会回滚对 parquet 文件所做的任何更改,并从最新的可用 .commit 文件中获取新的摄取。

如果我们每次提交都编写新的 Parquet 文件,我们最终会得到一个很大的数字。小文件会减慢分析过程。为此,每次有新插入时,Hudi writer 会识别是否有任何小文件并向它们添加新插入,而不是写入新文件。

在 Nobroker,我们确保每个 parquet 文件的大小至少为 100MB,以优化分析的速度。

数据索引

除了写入数据,Hudi 还跟踪特定行的存储位置,以加快更新和删除速度。此信息存储在称为索引的专用数据结构中。 Hudi 提供了多种索引实现,例如布隆过滤器、简单索引和 HBase 索引Hudi表。

我们从布隆过滤器开始,但随着数据的增加和用例的发展,我们转向 HBase 索引,它提供了非常快速的行元数据检索。

HBase 索引将我们的 ETL 管道的资源需求减少了 30%。

Schema写入器

一旦数据被写入云存储,我们应该能够在我们的平台上自动发现它。为此,Hudi 提供了一个模式编写器,它可以更新任何用户指定的模式存储库,了解新数据库、表和添加到数据湖的列。

我们使用 Hive 作为我们的集中Schema存储库。默认情况下Hudi 将源数据中的所有列以及所有元数据字段添加到模式存储库中。由于我们的数据平台面向业务,我们确保在编写Schema时跳过元数据字段。这对性能没有影响,但为分析用户提供了更好的体验。

在 Schema writer 的帮助下,业务可以在上游数据中添加一个新的特性,并且它可以在我们的数据平台上使用,而无需任何人工干预。

Cleaner

在摄取过程中,会创建大量元数据文件和临时文件。如果保持不变,它们会降低分析性能。 Hudi 确保所有不必要的文件在需要时被归档和删除。

每次发生新的摄取时,一些现有的 Parquet 文件都会推出一个新版本。旧版本可用于跟踪事件时间线和使查询运行更长时间。他们慢慢地填满了存储空间。为此,Cleaner 提供了 2 种减少存储空间的方法

  • KEEP_LATEST_FILE_VERSIONS :最新的文件版本被保留,而旧的被删除。
  • KEEP_LATEST_COMMITS :仅保留 n 个最新提交写入的文件版本。

我们的数据平台经过调整,可在 1 分钟内提供交互式查询/报告。同时,我们确保旧文件版本最多保留 1 小时,以支持长时间运行的数据科学工作负载。

Apache Hudi 是 Starship Data 平台最重要的部分之一。我们还有更多组件提供其他功能,例如可视化、交互式查询引擎等。

基于Apache Hudi构建分析型数据湖的更多相关文章

  1. Uber基于Apache Hudi构建PB级数据湖实践

    1. 引言 从确保准确预计到达时间到预测最佳交通路线,在Uber平台上提供安全.无缝的运输和交付体验需要可靠.高性能的大规模数据存储和分析.2016年,Uber开发了增量处理框架Apache Hudi ...

  2. 字节跳动基于Apache Hudi构建EB级数据湖实践

    来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...

  3. 基于Apache Hudi构建数据湖的典型应用场景介绍

    1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...

  4. 使用Apache Spark和Apache Hudi构建分析数据湖

    1. 引入 大多数现代数据湖都是基于某种分布式文件系统(DFS),如HDFS或基于云的存储,如AWS S3构建的.遵循的基本原则之一是文件的"一次写入多次读取"访问模型.这对于处理 ...

  5. 使用Apache Flink 和 Apache Hudi 创建低延迟数据湖管道

    近年来出现了从单体架构向微服务架构的转变.微服务架构使应用程序更容易扩展和更快地开发,支持创新并加快新功能上线时间.但是这种方法会导致数据存在于不同的孤岛中,这使得执行分析变得困难.为了获得更深入和更 ...

  6. 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台

    1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...

  7. 基于Apache Hudi在Google云构建数据湖平台

    自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...

  8. 基于Apache Hudi 的CDC数据入湖

    作者:李少锋 文章目录: 一.CDC背景介绍 二.CDC数据入湖 三.Hudi核心设计 四.Hudi未来规划 1. CDC背景介绍 首先我们介绍什么是CDC?CDC的全称是Change data Ca ...

  9. Robinhood基于Apache Hudi的下一代数据湖实践

    1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...

随机推荐

  1. 技术分享 | Appium 用例录制

    原文链接 下载及安装 下载地址: https://github.com/appium/appium-desktop/releases 下载对应系统的 Appium 版本,安装完成之后,点击 " ...

  2. 为什么要使用TypeScript(Why Typescript?)

    客观原因 静态类型. 在编译期即可进行静态类型分析, 减少JS运行时类型错误. 语法功能强大 对于大型项目具有更好构建机制,加入了类.接口.泛型.模块等概念. 兼容JavaScript 与现存的Jav ...

  3. 第六章、PXE高效网络装机、Kickstart无人值守安装

    目录 一.部署PXE远程安装服务 1PXE定义 2PXE服务优点 3搭建网络体系前提条件 4PXE实现过程讲解 二.搭建PXE远程安装服务器 三.Kickstart无人值守安装 一.部署PXE远程安装 ...

  4. Phantomjs实用代码段(持续更新中……)

    一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...

  5. Linux安装Anaconda3完整教程

    Linux安装Anaconda3完整教程 欢迎关注H寻梦人公众号 相关链接 官方安装Anaconda3教程 [手把手教你]如何在Linux系统搭建jupyter notebook CentOS8.2安 ...

  6. 一条update语句到底加了多少锁?带你深入理解底层原理

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  7. Google Colab初次使用

    网页无法加载,出现HTTP ERROR 407 开启chrome时不要在最下面的固定栏打开,否则会出错.

  8. 基于后端和爬虫创建的代理ip池

    搭建免费的代理ip池 需要解决的问题: 使用什么方式存储ip 文件存储 缺点: 打开文件修改文件操作较麻烦 mysql 缺点: 查询速度较慢 mongodb 缺点: 查询速度较慢. 没有查重功能 re ...

  9. 发现Mapstruct的一个bug

    前言 在一次需求的开发过程中,发现一个对象插入数据库时某个字段总是为空.简化后的代码如下: @Autowired private PersonService personService; public ...

  10. CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解

    目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...