阿里云全托管flink-vvp平台hudi connector实践(基于emr集群oss-hdfs存储)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
对象存储 OSS,20GB 3个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 阿里云全托管flink-vvp平台hudi sink connector实践,本文数据湖hudi基于阿里云E-MapReduce产品,以云对象存储oss-hdfs作为存储

1. 上游数据准备

上游数据以mysql为例作为hudi入湖的上游应用表,详细的建表、插入及更新语句如下

droptable if exists `sunyf_db`.`flink_test_02_hudi`;createtable if not EXISTS `sunyf_db`.`flink_test_02_hudi`(  id BIGINTnotnull PRIMARY KEY 
,`name` varchar(20),datime TIMESTAMP,price FLOAT);INSERTINTO `sunyf_db`.`flink_test_02_hudi` values(1,'zhao', CURRENT_TIMESTAMP,20);INSERTINTO `sunyf_db`.`flink_test_02_hudi` values(2,'qian', CURRENT_TIMESTAMP,30);INSERTINTO `sunyf_db`.`flink_test_02_hudi` values(3,'sun', CURRENT_TIMESTAMP,40);INSERTINTO `sunyf_db`.`flink_test_02_hudi` values(4,'li', CURRENT_TIMESTAMP,50);INSERTINTO `sunyf_db`.`flink_test_02_hudi` values(5,'zhou', CURRENT_TIMESTAMP,60);select*from `sunyf_db`.`flink_test_02_hudi`
update `sunyf_db`.`flink_test_02_hudi` set `name` ='sunyf35'where id =3;


2. Flink-SQL任务

flink-hudi-connector参数参考:https://hudi.apache.org/docs/basic_configurations#Flink-Options

--********************************************************************---- Author:         sunyf-- Created Time:   2023-07-03 17:52:47-- Description:    Write your description here-- Hints:          You can use SET statements to modify the configuration--********************************************************************--CREATE TEMPORARY TABLE mysqlcdc_source
(    id            bigint,`name`      STRING
,datime       TIMESTAMP,price      float,PRIMARY KEY (id)NOT ENFORCED
)WITH ('connector'='mysql','hostname'='rm-xxx.mysql.rds.aliyuncs.com','port'='3306','username'='用户名','password'='密码','database-name'='sunyf_db','table-name'='flink_test_02_hudi');CREATE TEMPORARY TABLE hudi_sink
(    id       bigintNOTNULL,`name`  STRING
,`price` float,PRIMARY KEY (id)NOT ENFORCED
-- 或者直接在id字段后面写 id int not null primary key 也可以-- 或者 指定如下参数 hoodie.datasource.write.recordkey.field)WITH ('connector'='hudi','oss.endpoint'='oss-cn-xx-internal.aliyuncs.com','accessKeyId'='用户名','accessKeySecret'='密码','path'='oss://sunyf-oss-emr02-hudi/emr_hudi_cluster0630.db/flink_test_03_hudi_cow','table.type'='COPY_ON_WRITE'--MERGE_ON_READ,'write.operation'='insert'-- ,'precombine.field' = 'ts'-- ***************-- 下面的元数据相关参数如果不指定的话--hive_sync.enable=false,仅落地文件,需要参考(标题3)中的两种方案建表,'hive_sync.db'='emr_hudi_cluster0630','hive_sync.table'='flink_test_03_hudi_cow','hive_sync.enable'='true','hive_sync.mode'='hms','dlf.catalog.endpoint'='dlf-vpc.cn-beijing.aliyuncs.com','dlf.catalog.region'='cn-beijing'-- ***************-- 在线压缩参数-- ,'compaction.async.enabled' = 'false'-- 指定分区字段,'hoodie.datasource.write.partitionpath.field'='name'-- 指定使用hive的分区表达方式来展示-- 文件夹名为:(day=20230101),不然的话分在oss上展示为20230101,'hoodie.datasource.write.hive_style_partitioning'='true');CREATE TEMPORARY TABLE print_sink
(    id       bigintNOTNULL,`name`  STRING
,datime       TIMESTAMP,`price` float,PRIMARY KEY (id)NOT ENFORCED
)WITH ('connector'='print','logger'='true','print-identifier'='sunyfOutputFormat');BEGIN STATEMENT SET;INSERTINTO hudi_sink
SELECTid
,`name`
,price
FROM mysqlcdc_source
;INSERTINTO print_sink
SELECT*FROM mysqlcdc_source
;end;

3. 建表方案

3.1. 创建hive外表读hudi文件

-- 使用hive外表的时候可以不指定flink hudi sink表中hive_sync 相关参数-- 直接采用外表的属性即可,这个外表的数据没有hudi的元数据字段createtable flink_sink_hudi_externel
(    id    bigintnotnull primary key
,`name` string
,price  float)ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'LOCATION 'oss://sunyf-oss-emr02-hudi/emr_hudi_cluster0630.db/flink_sink_hudi';

3.2. 创建spark hudi外表

# /bin/bash on spark 3.xspark-sql \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \--conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog'# sql on spark
use emr_hudi_cluster0630;# 指定location在oss而非默认的oss-hdfs((标题4)中有相关说明)createtable emr_hudi_cluster0630.spark_hudi_location_cow(  id bigint,  name string,  price float)using hudi options(type ='cow',primaryKey='id')location 'oss://sunyf-oss-emr02-hudi/emr_hudi_cluster0630.db/spark_hudi_location_cow';-- 为了避免字段类型不一致,导致的spark报错,这里伪造的原始数据都进行了一下cast-- 有些值cast过后会有精度的损失,hiveinsertinto emr_hudi_cluster0630.spark_hudi_location_cowvalues(cast(1asbigint),'sun',       cast(999.2asfloat)),(cast(2asbigint),'li',        cast(12.1asfloat));

3.3. 外表的删除

# 任一客户端执行:droptable emr_hudi_cluster0630.flink_test_02_hudi_cow;# 外表要手动删除oss上的文件,drop表仅drop元数据,不会删除数据文件
hdfs dfs -rm -f -r oss://sunyf-oss-emr02-hudi/emr_hudi_cluster0630.db/flink_test_02_hudi_cow

4. hudi表更新

通过修改参数实现cow表的实时更新

'write.operation' = 'insert'

image.png

'write.operation' = 'upsert'

image.png

5. 踩坑问题

5.1. spark创建hudi表

创建的时候指定location,desc的时候就会看到表是EXTERNAL 而不是 MANAGED,要注意表删除时相关数据是否留存或者删表重建,数据异常的问题

5.2. spark与hive获取元数据差异

在oss或者通过hdfs dfs命令对hudi表的文件进行删除或者更改后,维持当前的spark-sql-session是不能获取到这一元数据更改的,select查询该表会报文件不存在的异常,需要重启spark-sql客户端或者

refresh table[table_name]

进行元数据更新,hive侧正常执行。

5.3. 字段类型报错

hudi表字段类型与flink的表结构中字段类型要对应,否则在某些增量(手动写入+flink写入)场景下,可能导致数据读取异常(spark),hive兼容性较好,会进行字段类型的隐式转换,但是会有精度损失,如double->float

image.pngimage.png

5.4. flink hudi con对oss-hdfs支持问题

  1. 根据dlf中表存储的path(图3)直接添加到with参数(图1)中,会报非法参数异常(图2)
  2. 尝试:将oss-hdfs的路径后面的endpoint更改到endpoint参数中,jobmanager可以正常启动,但是写下的文件还是不在该内表指定的oss-hdfs存储路径下(日志中可以观察到,图4),oss上验证文件写入情况,如(图5,6)
  3. 查了下oss-hdfs的文档,应该是目前还不支持这个connector直接写默认存储在oss-hdfs的表。
  1. 参考文档:https://help.aliyun.com/document_detail/419069.html?spm=a2c4g.427753.0.i0
  2. 参考文档:https://help.aliyun.com/document_detail/471050.html?spm=a2c4g.141562.0.i6
  1. 绕行方案:在hudi建表的时候指定location在oss正常的bucket路径中,而不是oss-hdfs,可以正常使用image.pngimage.pngimage.pngimage.pngimage.pngimage.png

5.5. oss目录未删除问题

oss-hdfs 删除的db未删除(图1),dlf中已删除(图2 show databases 与dlf结果一致)

hdfs dfs -rm -f -r oss://sunyf-oss-emr02-hudi/emr_hudi_cluster0630.db/flink_sink_hudi_location

image.png

image.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 人工智能 开发工具
AI场景下的对象存储OSS数据管理实践
本文介绍了对象存储(OSS)在AI业务中的应用与实践。内容涵盖四个方面:1) 对象存储作为AI数据基石,因其低成本和高弹性成为云上数据存储首选;2) AI场景下的对象存储实践方案,包括数据获取、预处理、训练及推理阶段的具体使用方法;3) 国内主要区域的默认吞吐量提升至100Gbps,优化了大数据量下的带宽需求;4) 常用工具介绍,如OSSutil、ossfs、Python SDK等,帮助用户高效管理数据。重点讲解了OSS在AI训练和推理中的性能优化措施,以及不同工具的特点和应用场景。
28 10
|
2天前
|
弹性计算 人工智能 数据管理
AI场景下的对象存储OSS数据管理实践
本文介绍了ECS和OSS的操作流程,分为两大部分。第一部分详细讲解了ECS的登录、密码重置、安全组设置及OSSUTIL工具的安装与配置,通过实验创建并管理存储桶,上传下载文件,确保资源及时释放。第二部分则聚焦于OSSFS工具的应用,演示如何将对象存储挂载为磁盘,进行大文件加载与模型训练,强调环境搭建(如Conda环境)及依赖安装步骤,确保实验结束后正确清理AccessKey和相关资源。整个过程注重操作细节与安全性,帮助用户高效利用云资源完成实验任务。
38 10
|
6天前
|
SQL 安全 Serverless
活动实践 | 基于EMR StarRocks实现游戏玩家画像和行为分析
基于阿里云EMR Serverless StarRocks,利用其物化视图和DLF读写Paimon等能力,构建游戏玩家画像和行为分析平台。通过收集、处理玩家行为日志,最终以报表形式展示分析结果,帮助业务人员决策。
|
24天前
|
弹性计算 数据管理 应用服务中间件
活动实践 | 借助OSS搭建在线教育视频课程分享网站
本教程指导用户在阿里云ECS实例上搭建在线教育网站,包括重置ECS密码、配置安全组、安装Nginx、创建网站页面、上传数据至OSS、开通OSS传输加速、配置生命周期策略及清理资源等步骤,实现高效、低成本的数据管理和网站运营。
活动实践 | 借助OSS搭建在线教育视频课程分享网站
|
11天前
|
Serverless BI
有奖实践,基于EMR StarRocks实现游戏玩家画像和行为分析
阿里云EMR-StarRocks联合镜舟科技,基于EMR-StarRocks实现游戏实时湖仓分析,免费试用物化视图、Paimon写入查询等新能力,前45位赢取StarRocks定制T恤、Lamy钢笔,小米充电宝,阿里云拍拍灯等活动礼品,前500位均可获得创意马克杯。
64 3
|
2月前
|
SQL 存储 缓存
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
本文介绍了阿里云EMR StarRocks在数据湖分析领域的应用,涵盖StarRocks的数据湖能力、如何构建基于Paimon的实时湖仓、StarRocks与Paimon的最新进展及未来规划。文章强调了StarRocks在极速统一、简单易用方面的优势,以及在数据湖分析加速、湖仓分层建模、冷热融合及全链路ETL等场景的应用。
320 8
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
|
2月前
|
SQL 存储 缓存
降本60% ,阿里云 EMR StarRocks 全新发布存算分离版本
阿里云 EMR Serverless StarRocks 现已推出全新存算分离版本,该版本不仅基于开源 StarRocks 进行了全面优化,实现了存储与计算解耦架构,还在性能、弹性伸缩以及多计算组隔离能力方面取得了显著进展。
380 6
|
2月前
|
SQL 分布式计算 Serverless
EMR Serverless Spark:一站式全托管湖仓分析利器
本文根据2024云栖大会阿里云 EMR 团队负责人李钰(绝顶) 演讲实录整理而成
170 2
|
2月前
|
SQL 存储 缓存
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
讲师焦明烨介绍了StarRocks的数据湖能力,如何使用阿里云EMR StarRocks构建基于Paimon的极速实时湖仓,StarRocks与Paimon的最新进展及未来规划。
143 3
|
3月前
|
SQL 分布式计算 Serverless
阿里云 EMR Serverless Spark 版正式开启商业化
阿里云 EMR Serverless Spark 版正式开启商业化,内置 Fusion Engine,100% 兼容开源 Spark 编程接口,相比于开源 Spark 性能提升300%;提供 Notebook 及 SQL 开发、调试、发布、调度、监控诊断等一站式数据开发体验!
170 3
阿里云 EMR Serverless Spark 版正式开启商业化
下一篇
DataWorks