Apache Hudi助力nClouds加速数据交付
1. 概述
在nClouds上,当客户的业务决策取决于对近实时数据的访问时,客户通常会向我们寻求有关数据和分析平台的解决方案。但随着每天创建和收集的数据量都在增加,这使得使用传统技术进行数据分析成为一项艰巨的任务。
本文我们将讨论nClouds如何帮助您应对数据延迟,数据质量,系统可靠性和数据隐私合规性方面的挑战。
Amazon EMR上的Apache Hudi是需要构建增量数据管道、大规模近实时处理数据的理想解决方案。本篇文章将在Amazon EMR的Apache Hudi上进行原型验证。
nClouds是具有DevOps、数据分析和迁移能力的AWS高级咨询合作伙伴 ,并且是AWS托管服务提供商(MSP)和AWS完善的合作伙伴计划的成员。nClouds的使命是帮助您构建和管理可更快交付创新的现代基础架构解决方案。
2. 解决方案概述
Apache Hudi是一个开源数据管理框架,用于简化增量数据处理和数据管道开发。它最初于2016年在Uber开发,旨在为PB级数据分析提供更快的数据,进行低延迟、高效率的数据摄取。
Apache Hudi通常用于简化进入数据湖和分析服务的数据管道,支持记录级粒度的Change Data Capture(CDC),同时可通过Apache Hive和Presto之类的SQL查询引擎对数据集进行近乎实时的分析,更多关于Hudi详情,可访问hudi.apache.org
Amazon EMR是领先的云大数据平台,可使用开源工具(例如Apache Hudi,Apache Spark,Apache Hive,Apache HBase,Apache Flink和Presto)处理大量数据。当选择Spark,Hive或Presto作为部署选项时,Apache Hudi会自动安装在Amazon EMR集群中。
在2019年,Amazon EMR团队开始与Apache Hudi社区密切合作,以提供补丁和bug修复并添加对AWS Glue Data Catalog的支持。
Apache Hudi非常适合将数据快速提取到Hadoop分布式文件系统(HDFS)或云存储中,并加快ETL/Hive/ Spark作业,Hudi适用于读繁重或写繁重的场景,它可以管理存储在Amazon Simple Storage Service(Amazon S3)上的数据。
2.1 数据延迟
高数据延迟会影响客户的运营能力,进一步影响新产品和服务的快速开发和交付,盈利能力以及基于事实的决策。
在上述场景下,我们建议使用Apache Hudi,它提供了DeltaStreamer实用工具程序来执行自动增量更新处理,使得关键业务数据管道能够以接近实时的延迟实现高效摄取,每次查询表时,都可以读取这些增量文件。
Apache Hudi通过处理对近实时数据的查询以及增量拉取进行时间点数据分析的查询来节省时间。
2.2 数据质量
数据量不断增长可能会对数据质量判断造成困难。从海量、可变和复杂的数据集中提取高质量的数据非常困难,尤其是在混合了非结构化,半结构化和结构化数据的情况下。
当数据快速变化时,其质量取决于其时效性,Apache Hudi能够处理数据结构变更,自动执行增量数据更新以及有效地提取流数据的能力,有助于提取和集成高质量数据。
Apache Hudi可与Amazon Simple Workflow(Amazon SWF),AWS Data Pipeline和AWS Lambda等AWS服务集成以实现自动化实时数据湖工作流程。
2.3 系统可靠性
当我们执行AWS Well-Architected Review(使用AWS Well-Architected Framework的最佳实践进行架构评估)时,我们关注的核心点之一是架构可靠性。如果通过临时提取,转换,加载(ETL)作业提取数据,而没有可靠的架构通信机制,则系统可靠性可能会受到威胁。
我们喜欢Apache Hudi在数据湖中控制和管理文件布局的功能,此功能对于维护健康的数据生态系统至关重要,因为它提高了可靠性和查询性能。
使用Hudi,用户无需加载新数据并使用ETL清理数据,从之前数据层摄取的数据和变更会自动更新,并在保存新数据时触发自动化的工作流程。
然后在AWS数据库迁移服务(AWS DMS)注册更新,并在Amazon Simple Storage Service(Amazon S3)的源位置中创建一个Apache Parquet文件,它使用Apache Avro作为记录的内部规范表示,从而在数据提取或ETL管道中提供可靠性。
2.4 遵守数据隐私法规
Apache Hudi管理着数据湖中数据的所有交互,并且提供对数据的访问的服务,同时Apache Hudi使得基于Amazon S3的数据湖能够遵守数据隐私法,其提供了记录级的更新和删除,因此用户可以选择行使其被遗忘的权利或更改其有关如何使用其数据的同意。
3. 原型验证
在nClouds,我们构建了一个非面向客户的原型验证(PoC)以说明如何使用Hudi的插入、更新和删除操作来处理数据集中的更改,COVID-19的经济影响促使我们使用与COVID-19大流行相关的数据。
TDWI最近的一项研究发现,由于大流行的影响,超过一半的数据和分析专业人员被要求回答新类型的问题,约三分之一的受访者表示,他们需要更新模型和分析负载以通过重新训练模型或重塑客户群来应对不断变化的客户行为。
我们PoC的数据流为Amazon Relational Database Service(Amazon RDS)-> Amazon S3记录集更改 -> Hudi数据集,以快速应用增量更改。同时我们需要一个环境来运行我们的测试,包括Amazon RDS,AWS DMS任务,Amazon EMR集群和S3存储桶,最后一步做数据可视化,我们使用Amazon QuickSight展示报表。

下面是PoC方案的每个具体步骤
第一步:Amazon RDS设置
在Amazon RDS仪表板中,跳转到数据库参数组部分,然后创建一个新的参数组,将binlog格式设置为ROW。
创建一个新的Amazon RDS实例,确保使用设置的DB Parameter group并开启自动备份;
创建完成后,进行连接并创建如下MySQL Schema
CREATE TABLE covid_by_state(
covid_by_state_id INTEGER NOT NULL AUTO_INCREMENT,
date TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
state VARCHAR(100),
fips INTEGER,
cases INTEGER,
deaths INTEGER,
CONSTRAINT orders_pk PRIMARY KEY(covid_by_state_id)
);
INSERT INTO covid_by_state( date , state, fips, cases, deaths) VALUES('2020-01-21','Washington',53,1,0);
INSERT INTO covid_by_state( date , state, fips, cases, deaths) VALUES('2020-01-21','Illinois',17,1,0);
第二步:AWS DMS设置
下一步需要使用AWS DMS将数据复制到Amazon S3中,需要一个复制实例来运行测试和复制任务
- 进入AWS DMS控制面板并创建一个新的复制实例
- 创建两个端点,一个使用Amazon RDS作为数据源,另一个使用S3作为目的地
- 检查状态,开始运行
- 使用如下策略创建AWS Identity and Access Management角色
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:DeleteObjectTagging",
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::bigdatablueprint-role/*"
}
]
}
- 创建Amazon S3目的地,使用如下设置来确保使用Apache Parquet文件格式

- 检查是否正常工作,下图展示了AWS DMS成功运行的结果

第三步:AWS DMS任务设置
第四步:Amazon EMR集群设置
安装Apache Spark,Apache Hive或Presto时,Amazon EMR(发行版5.28.0及更高版本)会默认安装Apache Hudi组件。
Apache Spark或Apache Hudi DeltaStreamer实用程序可以创建或更新Apache Hudi数据集。Apache Hive,Apache Spark或Presto可以交互式查询Apache Hudi数据集,或使用增量拉取(仅拉取两次操作之间更改的数据)来构建数据处理管道。
以下是有关如何使用Apache Hudi运行新的Amazon EMR集群和处理数据的教程。
- 进入Amazon EMR控制面板
- 填写如下配置

- 集群运行后,执行以下脚本来设置数据库。运行Apache Spark命令以查看两行初始插入的当前数据库状态。
scala>scala> spark.read.parquet("s3://bigdatablueprint-raw/covid/hudi_dms/covid_by_state/*").sort("updated_at").show
+----+--------+---------+-------------+-------------------+-------------------+
+----+-----------------+-------------------+----------+----+-----+------+
| Op|covid_by_state_id| date| state|fips|cases|deaths|
+----+-----------------+-------------------+----------+----+-----+------+
|null| 1|2020-01-21 00:00:00|Washington| 53| 1| 0|
|null| 2|2020-01-21 00:00:00| Illinois| 17| 1| 0|
第五步:使用Apache Hudi DeltaStreamer处理变更日志
- 要开始使用更改日志,请在工作流时间表上使用以Apache Spark作业运行的Apache Hudi DeltaStreamer。 例如,按如下所示启动Apache Spark Shell:
spark-submit --class org.apache.hudi.utilities.deltastreamer.HoodieDeltaStreamer --packages org.apache.spark:spark-avro_2.11:2.4.4 --master yarn --deploy-mode client hudi-utilities-bundle_2.11-0.5.2-incubating.jar --table-type
COPY_ON_WRITE --source-ordering-field cases --source-class org.apache.hudi.utilities.sources.ParquetDFSSource --target-base-path s3://bigdatablueprint-final/hudi_covid --target-table cover --transformer-class org.apache.hudi.utilities.transform.AWSDmsTrans
- 这是Apache Hudi表,具有与上游表相同的记录(也包含所有_hoodie字段):
scala> spark.read.parquet("s3://bigdatablueprint-final/hudi_covid/*/*.parquet").sort("cases").show
+-------------------+--------------------+------------------+----------------------+--------------------+-----------------+-------------------+----------+----+-----+------+---+
|_hoodie_commit_time|_hoodie_commit_seqno|_hoodie_record_key|_hoodie_partition_path| _hoodie_file_name|covid_by_state_id| date| state|fips|cases|deaths| Op|
+-------------------+--------------------+------------------+----------------------+--------------------+-----------------+-------------------+----------+----+-----+------+---+
| 20200812061302| 20200812061302_0_1| 1| default|0a292b18-5194-45d...| 1|2020-01-21 00:00:00|Washington| 53| 1| 0| |
| 20200812061302| 20200812061302_0_2| 2| default|0a292b18-5194-45d...| 2|2020-01-21 00:00:00| Illinois| 17| 1| 0| |
- 进行数据库更改以查看其他行和更新的值。
- 一旦在源Amazon S3存储桶更新后,AWS DMS将立即将摄取,然后重新运行相同的Apache Hudi作业,从而将新的Apache Parquet文件添加到AWS DMS输出文件夹。
scala> spark.read.parquet("s3://bigdatablueprint-raw/covid/hudi_dms/covid_by_state/*").sort("cases").show
+----+-----------------+-------------------+----------+----+-----+------+
| Op|covid_by_state_id| date| state|fips|cases|deaths|
+----+-----------------+-------------------+----------+----+-----+------+
| I| 4|2020-01-21 00:00:00| Arizona| 4| 1| 0|
|null| 1|2020-01-21 00:00:00|Washington| 53| 1| 0|
|null| 2|2020-01-21 00:00:00| Illinois| 17| 1| 0|
| U| 1|2020-08-12 06:25:04|Washington| 53| 60| 0|
+----+-----------------+-------------------+----------+----+-----+------+
- 重新运行Apache Hudi DeltaStreamer命令时,它将把Apache Parquet文件变更成Apache Hudi表。
- 这是运行Apache Spark作业后的Apache Hudi结果:
scala> spark.read.parquet("s3://bigdatablueprint-final/hudi_covid/*/*.parquet").sort("cases").show
+-------------------+--------------------+------------------+----------------------+--------------------+-----------------+-------------------+----------+----+-----+------+---+
|_hoodie_commit_time|_hoodie_commit_seqno|_hoodie_record_key|_hoodie_partition_path| _hoodie_file_name|covid_by_state_id| date| state|fips|cases|deaths| Op|
+-------------------+--------------------+------------------+----------------------+--------------------+-----------------+-------------------+----------+----+-----+------+---+
| 20200812061302| 20200812061302_0_1| 1| default|0a292b18-5194-45d...| 1|2020-01-21 00:00:00|Washington| 53| 1| 0| |
| 20200812061302| 20200812061302_0_2| 2| default|0a292b18-5194-45d...| 2|2020-01-21 00:00:00| Illinois| 17| 1| 0| |
| 20200812063216| 20200812063216_0_1| 4| default|0a292b18-5194-45d...| 4|2020-01-21 00:00:00| Arizona| 4| 1| 0| I|
| 20200812062710| 20200812062710_0_1| 1| default|0a292b18-5194-45d...| 1|2020-08-12 06:25:04|Washington| 53| 60| 0| U|
- 将数据转化为CSV格式以便可以通过Amazon QuickSight读取
var df = spark.read.parquet("s3://bigdatablueprint-final/hudi_covid/*/*.parquet").sort("cases")
df.write.option("header","true").csv("covid.csv")
使用上述命令将数据转换为.csv后,它是一种便于Amazon QuickSight查看的数据格式,可以将其可视化。下图显示了来自QuickSight中原始(.csv)源的数据的一种表示形式。
这种数据视图按状态细分了特定日期的案例数。随着Hudi使用新数据(可以直接流式传输)更新表时,将启用通过QuickSight进行近实时或实时报告。

4. 总结
在本文中,我们逐步介绍了我们的非面向客户的PoC解决方案,以在Amazon EMR和其他托管服务(包括用于数据可视化的Amazon QuickSight)上使用Apache Hudi建立新的数据和分析平台。
如果您的业务决策取决于对近实时数据的访问,并且您面临数据延迟,高数据质量,系统可靠性以及对数据隐私法规的遵从性等挑战,我们建议从nClouds实施此解决方案,它旨在加速需要增量数据管道和处理的大规模和近实时应用程序中的数据交付。
Apache Hudi助力nClouds加速数据交付的更多相关文章
- 基于Apache Hudi构建分析型数据湖
为了有机地发展业务,每个组织都在迅速采用分析. 在分析过程的帮助下,产品团队正在接收来自用户的反馈,并能够以更快的速度交付新功能. 通过分析提供的对用户的更深入了解,营销团队能够调整他们的活动以针对特 ...
- 使用Apache Flink 和 Apache Hudi 创建低延迟数据湖管道
近年来出现了从单体架构向微服务架构的转变.微服务架构使应用程序更容易扩展和更快地开发,支持创新并加快新功能上线时间.但是这种方法会导致数据存在于不同的孤岛中,这使得执行分析变得困难.为了获得更深入和更 ...
- Apache Hudi在医疗大数据中的应用
本篇文章主要介绍Hudi在医疗大数据中的应用,主要分为5个部分进行介绍:1. 建设背景,2. 为什么选择Hudi,3. Hudi数据同步,4. 存储类型选择及查询优化,5. 未来发展与思考. 1. 建 ...
- 对话Apache Hudi VP, 洞悉数据湖的过去现在和未来
Apache Hudi是一个开源数据湖管理平台,用于简化增量数据处理和数据管道开发,该平台可以有效地管理业务需求,例如数据生命周期,并提高数据质量.Hudi的一些常见用例是记录级的插入.更新和删除.简 ...
- 基于Apache Hudi在Google云构建数据湖平台
自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...
- 基于 Apache Hudi 和DBT 构建开放的Lakehouse
本博客的重点展示如何利用增量数据处理和执行字段级更新来构建一个开放式 Lakehouse. 我们很高兴地宣布,用户现在可以使用 Apache Hudi + dbt 来构建开放Lakehouse. 在深 ...
- 使用 Apache Hudi 实现 SCD-2(渐变维度)
数据是当今分析世界的宝贵资产. 在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要. 渐变维度 (SCD) 是随时间推移存储和管理当前和历史数据的维度. 在 SCD 的类型中,我们将特别关注类 ...
- 通过Apache Hudi和Alluxio建设高性能数据湖
T3出行的杨华和张永旭描述了他们数据湖架构的发展.该架构使用了众多开源技术,包括Apache Hudi和Alluxio.在本文中,您将看到我们如何使用Hudi和Alluxio将数据摄取时间缩短一半.此 ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...
随机推荐
- 218。重复元素II(重复元素的下标差值<=K)(哈希)
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k. 示例 1: 输入: nums ...
- 突发!美商务部宣布封禁微信,TikTok——面对科技封锁,如何应对
刚刚美国商务部忽然发布了这则新闻,为了回应特朗普2020年8月6号的行政令,称这些应用程序存在安全威胁. 禁令中称,自2020年9月20日起,美国政府将: 1 禁止通过美国在线移动应用程序商店分发或维 ...
- SpringBoot-02-原理初探之主启动类
2. 原理初探 2.1 pom.xml 父依赖 主要依赖一个父项目,主要管理项目的资源过滤和插件 <parent> <groupId>org.springframework.b ...
- Apache Flink on K8s:四种运行模式,我该选择哪种?
1. 前言 Apache Flink 是一个分布式流处理引擎,它提供了丰富且易用的API来处理有状态的流处理应用,并且在支持容错的前提下,高效.大规模的运行此类应用.通过支持事件时间(event-ti ...
- 【C#上位机必看】你们要的Iot物联网项目来了
新阁教育喜科堂不得不说,工业圈是个比较奇怪的圈子,各种各样的项目需求都有,有的人就希望价格低,功能实现即可,有的人又不在乎价格,就要界面好看.最近有一个小伙伴又提出了这样的需求,用最简单的方式,最低的 ...
- Python列出指定目录下的子目录/文件或者递归列出
1.python只列出当前目录(或者指定目录)下的文件或者目录条目 import os files,dirs=[],[] for item in os.listdir(): if os.path.is ...
- SpringBoot整合MongoDB(实现一个简单缓存)
前言 SpringBoot是常用开发框架,而MongoDB也是最近越来越火的非关系型数据库,这里使用SpringBoot+MongoDB实现一个小案例,当然MongoDB实际做缓存的可能不多,但是这里 ...
- is_mobile()判断手机移动设备
is_mobile()判断手机移动设备.md is_mobile()判断手机移动设备 制作响应式主题时会根据不同的设备推送不同的内容,是基于移动设备网络带宽压力,避免全局接收pc端内容. functi ...
- 关于VS编译报错,但是错误信息未提示问题解决方案
可能代码中引用了别的类库中的函数,然后未编译被引用库导致编译报错,重新编译被引用库然后再编译当前库即可解决问题
- 理解RESTful:理论与最佳实践
什么是 REST 什么是 RESTful Richardson 成熟度模型 RESTful API 设计最佳实践 补充:HTTP 状态码及说明 什么是 REST REST 一词,是由 HTTP 协议的 ...