云小课|MRS 基础原理之 Hudi 介绍
本文分享自华为云社区《【云小课】EI第39课 MRS基础原理之Hudi介绍》,作者:Hello EI。
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。
Hudi 是数据湖的文件组织层,对 Parquet 格式文件进行管理提供数据湖能力,支持多种计算引擎,提供 IUD 接口,在 HDFS 的数据集上提供了插入更新和增量拉取的流原语。
Hudi 结构
Hudi 的架构如下图所示:
Hudi 支持两种表类型
Copy On Write
写时复制表也简称 cow 表,使用 parquet 文件存储数据,内部的更新操作需要通过重写原始 parquet 文件完成。
优点:读取时,只读取对应分区的一个数据文件即可,较为高效。
缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后
Merge On Read
读时合并表也简称 mor 表,使用列格式 parquet 和行格式 Avro 两种方式混合存储数据。其中 parquet 格式文件用于存储基础数据,Avro 格式文件(也可叫做 log 文件)用于存储增量数据。
优点:由于写入数据先写 delta log,且 delta log 较小,所以写入成本较低。
缺点:需要定期合并整理 compact,否则碎片文件较多。读取性能较差,因为需要将 delta log 和 老数据文件合并。
Hudi 支持三种视图,针对不同场景提供相应的读能力
Snapshot View
实时视图:该视图提供当前 hudi 表最新的快照数据,即一旦有最新的数据写入 hudi 表,通过该视图就可以查出刚写入的新数据。
cow 表和 mor 均支持这种视图能力。
Incremental View
增量视图:该视图提供增量查询的能力,可以查询指定 COMMIT 之后的增量数据,可用于快速拉取增量数据。
cow 表支持该种视图能力, mor 表也可以支持该视图,但是一旦 mor 表完成 compact 操作其增量视图能力消失。
Read Optimized View
读优化视图:该视图只会提供最新版本的 parquet 文件中存储的数据。
该视图在 cow 表和 mor 表上表现不同:
对于 cow 表,该视图能力和实时视图能力是一样的(cow 表只用 parquet 文件存数据)。
对于 mor 表,仅访问基本文件,提供给定文件片自上次执行 compact 操作以来的数据, 可简单理解为该视图只会提供 mor 表 parquet 文件存储的数据,log 文件里面的数据将被忽略。 该视图数据并不一定是最新的,但是 mor 表一旦完成 compact 操作,增量 log 数据被合入到了 base 数据里面,这个时候该视图和实时视图能力一样。
如何使用 Hudi
目前 Hudi 集成在 MRS 集群的 Spark2x 服务中,使用 Hudi 需要安装 Spark2x 组件,并安装客户端。
MRS 集群的创建可参考创建集群,例如购买 MRS 3.1.0 版本集群。
安装 Spark2x 客户端,可参考安装客户端,例如客户端安装目录为:“/opt/client”。
安全模式(开启 Kerberos 认证)集群,在使用 Hudi 时,需要创建一个具有访问 Hudi 权限的用户,可参考创建用户,用户组选择 hadoop、hive 和 supergroup,主组选择 hadoop,角色选择 System_administrator,例如创建人机用户“testuser”。
使用 root 用户登录集群客户端节点,执行如下命令:cd /opt/client source bigdata_env source Hudi/component_env kinit testuser
执行以下命令进入 Spark SQL 命令行。spark-sql --master yarn
准备 Hive 数据表。drop table if exists hivetb_text; create table hivetb_text (id int, comb long, name string, dt date) row format delimited fields terminated by ',' stored as textfile; insert into hivetb_text values (3,301,'0003','2021-09-11'),(4,400,'0004','2021-09-11');
创建 Hudi Cow 分区表。drop table if exists hudi_test1; create table hudi_test1 (id int, comb long, name string, dt date) using hudi partitioned by (dt) options(type='cow',primaryKey='id', preCombineField='comb');
执行 insert,插入数据,并查询结果。insert into hudi_test1 values (1,100,'aaa','2021-08-28'),(2,200,'bbb','2021-08-28'); insert into hudi_test1 select 3,300,'ccc','2021-09-11'; select id,comb,dt,name from hudi_test1;
执行 update,更新数据,并查询结果。update hudi_test1 set name='0001' where id = 1; select id,comb,dt,name from hudi_test1;
执行 delete,删除数据,并查询结果。delete from hudi_test1 where id = 2; select id,comb,dt,name from hudi_test1;
执行 merge,写入增量数据,并查询结果。merge into hudi_test1 t1 using hivetb_text t2 on t1.id = t2.id when matched then update set id=t2.id, comb=t2.comb, name='aaaa', dt=t2.dt when not matched then insert *; select id,comb,dt,name from hudi_test1;
好了,本期云小课就介绍到这里,快去体验 MapReduce(MRS)更多功能吧!猛戳这里
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/c6955822e55ec7b795204e71b】。文章转载请联系作者。
评论