flink操作hudi数据表

4 篇文章 0 订阅

基于flink1.14、spark3.2、hudi0.11,演示flink往hudi数据湖流式地写数据,hive和spark从数据湖读数据

一、为hadoop、hive、flink添加hudi存储格式的支持

1、编译hudi bundle

cd /apps/src/hudi-release-0.11.1
export JAVA_HOME=/apps/svr/jdk1.8.0_144
export MAVEN_OPTS="-Xss64m -Xmx4g -XX:ReservedCodeCacheSize=2g -Dhadoop.version=2.9.2 -Dhive.version=2.3.6"
mvn -DskipTests -DskipITs -Dcheckstyle.skip=true -Drat.skip=true -Pflink-bundle-shade-hive2 -Pscala-2.11 package

各个bundle的jar包在packaging目录下

2、hudi-flink1.14-bundle_2.11-0.11.1.jar放入flink的lib目录;然后重新部署一个flink on yarn实例

3、hudi-hadoop-mr-bundle-0.11.1.jar放入hadoop的share/hadoop/hdfs/lib目录;然后重启所有nodeManager、resourceManager节点

4、hudi-hadoop-mr-bundle-0.11.1.jar、hudi-hive-sync-bundle-0.11.1.jar放入hive的auxlib目录;然后重新启动hiveServer2服务

二、flink写入hudi

重新部署一个flink on yarn实例后,使用flink sql-client创建hudi格式数据表,支持同步元数据信息到hive可解析的数据表定义里,让hive mr也可以读取同一份parquet列存数据:

-- 创建kafka动态source
CREATE TABLE wzp.kafka_monitor (
  `partition` INT METADATA VIRTUAL,
  `offset` BIGINT METADATA VIRTUAL,
  `timestamp` TIMESTAMP(3) METADATA VIRTUAL,
  `svc_id` STRING,
  `type` STRING,
  `app` STRING,
  `url` STRING,
  `span` INT
) WITH (
  'connector' = 'kafka',
  'topic' = 'monitor-log',
  'properties.bootstrap.servers' = '10.0.0.1:9092,10.0.0.2:9092',
  'properties.group.id' = 'wzp_test_flink',
  'scan.startup.mode' = 'latest-offset',
  'format' = 'json',
  'json.fail-on-missing-field' = 'false',
  'json.ignore-parse-errors' = 'true'
);
 
-- 创建hudi sink
USE hudi_flink;
CREATE TABLE rest_response_mor(
  `svc_id` STRING PRIMARY KEY NOT ENFORCED,
  `url` STRING,
  `span` INT,
  `timestamp` TIMESTAMP(3),
  `app` STRING
)
PARTITIONED BY (`app`)
WITH (
  'connector' = 'hudi',
  'path' = 'hdfs://flink/huditables/rest_response_mor',
  'table.type' = 'MERGE_ON_READ', -- this creates a MERGE_ON_READ table, by default is COPY_ON_WRITE
  'hoodie.datasource.write.recordkey.field' = 'svc_id',
  'hoodie.datasource.write.hive_style_partitioning' = 'true',
  'hoodie.datasource.write.partitionpath.urlencode' = 'true',
  'hoodie.parquet.compression.codec'= 'snappy',
  'write.operation' = 'upsert',
  'write.precombine' = 'true',
  'write.precombine.field' = 'timestamp',
  'compaction.async.enabled' = 'true',
  'compaction.trigger.strategy' = 'num_and_time',
  'compaction.delta_commits' = '3',
  'compaction.delta_seconds' = '30',
  'hive_sync.enable' = 'true',
  'hive_sync.use_jdbc' = 'false',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'thrift://machine1:9083',
  'hive_sync.db' = 'hudi_external',
  'hive_sync.table' = 'rest_response_mor',
  'hive_sync.assume_date_partitioning' = 'false',
  'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor', -- 默认按日期分区
  'hive_sync.partition_fields' = 'app',
  'hive_sync.support_timestamp'= 'true'
);

-- 开启checkpoint才会写入数据到hudi sink
set execution.checkpointing.interval=10sec;
insert into hudi_flink.rest_response_mor(`svc_id`,`url`,`span`,`timestamp`,`app`) select `svc_id`,`url`,`span`,`timestamp`,`app` from wzp.kafka_monitor;

可以看到metastore的hudi_external库里自动额外创建了ro和rt两张外部表,分区信息也同步到了metastore里,让其他引擎(hive mr、spark)能够读取到flink写入到hdfs的hudi格式数据:
在这里插入图片描述

三、flink查询hudi

(一)Streaming Query

读取实时变更记录:

USE hudi_flink;
SET 'execution.runtime-mode' = 'streaming';
select * from rest_response_mor/*+ OPTIONS('read.streaming.enabled'='true', 'read.start-commit'='20220718000000')*/;

(二)Snapshot Query

读取最新数据快照,默认hoodie.datasource.query.type就是snapshot:

USE hudi_flink;
SET 'execution.runtime-mode' = 'batch';
select * from rest_response_mor/*+ OPTIONS('hoodie.datasource.query.type'='snapshot')*/;

(三)Read Optimized Query

仅读取列存数据:

USE hudi_flink;
SET 'execution.runtime-mode' = 'batch';
select * from rest_response_mor/*+ OPTIONS('hoodie.datasource.query.type'='read_optimized')*/;

(四)Incremental Query

可实现时间旅行,即读取指定历史时间段内提交的数据:

USE hudi_flink;
SET 'execution.runtime-mode' = 'batch';
select * from rest_response_mor/*+ OPTIONS('read.start-commit'='20220719101500','read.end-commit'='20220719101900')*/;

四、hive查询hudi

必须hudi-hadoop-mr-bundle-0.11.1.jar放入hadoop的share/hadoop/hdfs/lib目录;然后重启所有nodeManager、resourceManager节点

set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;
-- 仅查询已按列存优化的数据
SELECT * FROM hudi_external.rest_response_mor_ro;
-- 查询列存、行存合并后的最新数据
SELECT * FROM hudi_external.rest_response_mor_rt;

五、spark查询hudi

(一)重新编译spark要使用的hudi bundle:

mvn -DskipTests -DskipITs -Dcheckstyle.skip=true -Drat.skip=true -Pspark-bundle-shade-hive -Pspark3.2 -Pscala-2.12 package

把hudi-spark3.2-bundle_2.12-0.11.1.jar放入spark的jars目录

(二)准备spark-sql启动参数:

spark安装目录下的conf/spark-defaults.conf文件里,添加hudi要求的启动参数:

spark.sql.catalogImplementation=hive
# metastore服务地址
spark.hadoop.hive.metastore.uris=thrift://machine1:9083
# hive数据表的namenode,要和hiveServer2使用的namenode一致
spark.hadoop.fs.defaultFS=hdfs://hive
# hive数据表存储路径
spark.sql.warehouse.dir=/hivetables
 
# cli工具的内存
spark.driver.memory=1g
# yarn的application master的内存
spark.yarn.am.memory=2g
spark.executor.memory=3g
spark.executor.instances=3
 
# hudi要求的配置
spark.serializer=org.apache.spark.serializer.KryoSerializer
spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension
spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog

然后spark就可以直接使用hive metastore的hudi_external库里自动同步的数据表定义,读取flink写在hdfs上的hudi格式数据

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着互联网的发展,数据的不断膨胀,从刚开始的关系型数据库到非关系型数据库,再到大数据技术,技术的不断演进最终是随着数据膨胀而不断改变,最初的数据仓库能解决我们的问题,但是随着时代发展,企业已经不满足于数据仓库,希望有更强大的技术来支撑数据的存储,包括结构化,非结构化的数据等,希望能够积累企业的数据,从中挖掘出更大的价值。基于这个背景,数据湖的技术应运而生。本课程基于真实的企业数据湖案例进行讲解,结合业务实现数据湖平台,让大家在实践中理解和掌握数据湖技术,未来数据湖的需求也会不断加大,希望同学们抓住这个机遇。项目中将以热门的互联网电商业务场景为案例讲解,具体分析指标包含:流量分析,订单分析,用户行为分析,营销分析,广告分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。Apache Hudi代表Hadoop Upserts anD Incrementals,管理大型分析数据集在HDFS上的存储。Hudi的主要目的是高效减少摄取过程中的数据延迟。Hudi的出现解决了现有hadoop体系的几个问题:1、HDFS的可伸缩性限制 2、需要在Hadoop中更快地呈现数据 3、没有直接支持对现有数据的更新和删除 4、快速的ETL和建模 5、要检索所有更新的记录,无论这些更新是添加到最近日期分区的新记录还是对旧数据的更新,Hudi都允许用户使用最后一个检查点时间戳,此过程不用执行扫描整个源表的查询。 本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.9.0、HudiClickHouseHadoop2.7.5 Hbase2.2.6Kafka2.1.0 Hive2.2.0HDFS、MapReduceSpark、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.2.RELEASE SpringCloud Finchley.RELEASEVue.js、Nodejs、HighchartsLinux Shell编程课程亮点: 1.与企业接轨、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.大数据热门技术Flink4.Flink join 实战 5.Hudi数据湖技术6.集成指标明细查询 7.主流微服务后端系统 8.数据库实时同步解决方案 9.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS 10.集成SpringCloud实现统一整合方案 11.互联网大数据企业热门技术栈 12.支持海量数据的实时分析 13.支持全端实时数据分析 14.全程代码实操,提供全部代码和资料 15.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。  
Flink 中使用 Hudi 同时写入多个表,可以按照以下步骤进行: 1. 引入依赖:在 Flink 项目中的 pom.xml 文件中,添加 Hudi 相关的依赖,例如 hudi-flinkhudi-client 等。 2. 创建 Flink 流式作业:使用 Flink 的 DataStream API 创建流式作业,处理输入数据并准备写入 Hudi 表。 3. 配置 Hudi 写入:为每个需要写入的 Hudi 表创建一个 HudiTableConfig 对象,配置相应的表名、Schema、主键等信息。 4. 转换数据并写入 Hudi 表:根据需要写入的多个表,使用 Flink 的 DataStream API 进行数据转换操作,并将数据写入对应的 Hudi 表中。可以使用 `hudiWrite()` 函数将转换后的数据写入 Hudi 表。 ```java dataStream .map(new MyMapper()) // 自定义数据转换逻辑 .addSink(HoodieFlinkSink.create(hudiTableConfig1, ...)) // 将数据写入第一个 Hudi 表 .name("Hudi Sink 1"); dataStream .map(new MyMapper()) // 自定义数据转换逻辑 .addSink(HoodieFlinkSink.create(hudiTableConfig2, ...)) // 将数据写入第二个 Hudi 表 .name("Hudi Sink 2"); // 可以根据需要继续添加更多的 Hudi 表写入操作 ``` 5. 配置并执行 Flink 作业:为 Flink 作业配置必要的参数,例如并行度、检查点等,并执行作业。 ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // 设置并行度 env.enableCheckpointing(5000); // 开启检查点 // 创建流式作业,处理数据并写入 Hudi 表 env.execute("Flink Hudi Multiple Tables Job"); ``` 需要注意的是,在配置 Hudi 表时,要确保每个表都有唯一的表名和主键,且 Schema 结构与输入数据一致。另外,为了保证数据一致性和容错能力,在 Flink 作业中开启检查点功能是一个好的实践。 以上是一个简单的示例,具体的实现还需要根据你的实际需求和数据处理逻辑进行调整。同时,还需要根据 HudiFlink 的版本进行适配和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值