Flink,Hudi集成,Flink Sql和Hive Client端

一 背景说明

Flink版本1.15.3,Hudi版本0.12.2,进行flink数据入湖,spark和hive都可进行数据读写,实现hudi元数据同步及数据共享.

大数据平台为CDP7.5.1

二 环境配置

1 配置Flink环境变量

#Flink Home
export FLINK_HOME=/opt/apache/flink/flink-1.15.3
export PATH=$PATH:$FLINK_HOME/bin

2 Jar包拷贝,拷贝完之后重启对应的服务,确保jar包加载

2.1HudiJar包放到hive目录,

hudi-hadoop-mr-bundle-0.12.2.jar

hudi-hive-sync-bundle-0.12.2.jar

2.2 Hive Jar包放到flink目录,flink同步元数据到Hive

cp ./hive-exec-3.1.3000.7.1.7.0-551.jar /opt/apache/flink/flink-1.15.3/lib/
cp ./libfb303-0.9.3.jar /opt/apache/flink/flink-1.15.3/lib/

3 Flink Jar包下载

wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-connector-hive_2.12/1.15.3/flink-connector-hive_2.12-1.15.3.jar
wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-3.1.2_2.12/1.15.3/flink-sql-connector-hive-3.1.2_2.12-1.15.3.jar

4 其他jar包

环境不同,需要的Jar包不同,具体任务拉起后。提交任务,看flink jobmanager日志,根据具体报错去hive或hadoop安装目录下把具体安装包拷贝到flin lib目录下即可。

类型错误的问题,一般情况下都能通过上述方法搞定。

三 Flink建表,数据同步

3.1 MERGE_ON_READ 类型表

#创建catalog,断开连接后需要重新创建
CREATE CATALOG hive_catalog WITH (
    'type' = 'hudi',
    'default-database' = 'default',
	'catalog.path' = 'hdfs:///hudi/test',
    'hive.conf.dir' = '/opt/cloudera/parcels/CDH/lib/hive/conf'
);

use catalog hive_catalog;
#选择具体database
use hudi;

#创建表,表类型为MERGE_ON_READ
CREATE TABLE test_hudi_flink5 (
id int PRIMARY KEY NOT ENFORCED,
name VARCHAR(10),
price int,
ts int,
dt VARCHAR(10)
)
PARTITIONED BY (dt)
WITH (
'connector' = 'hudi',
'path' = 'hdfs:///hudi/test/hudi/test_hudi_flink5',
'table.type' = 'MERGE_ON_READ',
'hoodie.datasource.write.keygenerator.class' = 'org.apache.hudi.keygen.ComplexAvroKeyGenerator',
'hoodie.datasource.write.recordkey.field' = 'id',
'hoodie.datasource.write.hive_style_partitioning' = 'true',
'hive_sync.enable' = 'true',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://node20:9083',
'hive_sync.conf.dir'='/opt/cloudera/parcels/CDH/lib/hive/conf',
'hive_sync.db' = 'hudi',
'hive_sync.table' = 'test_hudi_flink5',
'hive_sync.partition_fields' = 'dt',
'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor'
);

#插入数据
insert into test_hudi_flink5 values (1,'hudi',10,100,'2022-10-31'),(2,'hudi',10,100,'2022-10-31'),(3,'hudi',10,100,'2022-10-31'),(4,'hudi',10,100,'2022-10-31'),(5,'hudi',10,100,'2022-10-31'),(6,'hudi',10,100,'2022-10-31');
#查询数据
select * from _hudi_flink5;

在hive中查看,这里存在一个问题,hive中查询不到具体数据,后续再研究

 

 3.2 COPY_ON_WRITE类型表

#创建表,表类型为MERGE_ON_READ
CREATE TABLE test_hudi_flink7 (
id int PRIMARY KEY NOT ENFORCED,
name VARCHAR(10),
price int,
ts int,
dt VARCHAR(10)
)
PARTITIONED BY (dt)
WITH (
'connector' = 'hudi',
'path' = 'hdfs:///hudi/test/hudi/test_hudi_flink7',
'table.type' = 'COPY_ON_WRITE',
'hoodie.datasource.write.keygenerator.class' = 'org.apache.hudi.keygen.ComplexAvroKeyGenerator',
'hoodie.datasource.write.recordkey.field' = 'id',
'hoodie.datasource.write.hive_style_partitioning' = 'true',
'hive_sync.enable' = 'true',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://node20:9083',
'hive_sync.conf.dir'='/opt/cloudera/parcels/CDH/lib/hive/conf',
'hive_sync.db' = 'hudi',
'hive_sync.table' = 'test_hudi_flink7',
'hive_sync.partition_fields' = 'dt',
'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor'
);

#插入数据
insert into test_hudi_flink7 values (1,'hudi',10,100,'2022-10-31'),(2,'hudi',10,100,'2022-10-31'),(3,'hudi',10,100,'2022-10-31'),(4,'hudi',10,100,'2022-10-31'),(5,'hudi',10,100,'2022-10-31'),(6,'hudi',10,100,'2022-10-31');
#查询数据
select * from test_hudi_flink7;

HIve中查看,生成一张表,且能查到数据

 四 Spark建表,数据同步

4.1 Flink SQL 写入Spark创建的Hudi分区表

#----------------------------------------------------------------------Flink SQL 写入Hudi分区表-------------------------------------------------
#Flink中向由Spark创建的Hudi表写入数据
create database hudiods;

create table hudiods.flow_business_mor (
    id STRING PRIMARY KEY NOT ENFORCED,
    cost DOUBLE COMMENT '费用',
    DATA_DT STRING
 ) 
PARTITIONED BY (DATA_DT)
WITH (
'connector' = 'hudi',
'path' = 'hdfs:warehouse/tablespace/external/hive/hudiods.db/flow_business_mor',
'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'='hdfs:///warehouse/tablespace/external/hive/hudiods.db/flow_business_mor',
'hoodie.datasource.write.keygenerator.class' = 'org.apache.hudi.keygen.ComplexAvroKeyGenerator',
'hoodie.datasource.write.recordkey.field' = 'id',
'hoodie.datasource.write.hive_style_partitioning' = 'true',
'hive_sync.enable' = 'true',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://node20:9083',
'hive_sync.conf.dir'='/opt/cloudera/parcels/CDH/lib/hive/conf',
'hive_sync.db' = 'hudi',
'hive_sync.table' = 'flow_business_mor',
'hive_sync.partition_fields' = 'DATA_DT',
'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor'
);

insert into hudiods.flow_business_mor values ('hudi',10100.01,'2022-10-31'),('spark',10100.02,'2023-05-26'),('flink',10100.06,'2023-05-27'),('hive',10100.00,'2023-05-28');

#Hive中查看数据

alter table flow_business_mor add if not exists partition(`DATA_DT`='2023-05-28') location 'hdfs:///warehouse/tablespace/external/hive/hudiods.db/flow_business_cow/2023-05-28';
 
select * from flow_business_mor where `data_dt`='2023-05-28';

4.2 Flink SQL 写入Spark创建的Hudi分区表

create table hudiods.flow_business_cow (
    id STRING PRIMARY KEY NOT ENFORCED,
    cost DOUBLE COMMENT '费用',
    DATA_DT STRING
 ) 
WITH (
'connector' = 'hudi',
'path' = 'hdfs:warehouse/tablespace/external/hive/hudiods.db/flow_business_cow',
'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'='hdfs:///warehouse/tablespace/external/hive/hudiods.db/flow_business_cow',
'hoodie.datasource.write.keygenerator.class' = 'org.apache.hudi.keygen.ComplexAvroKeyGenerator',
'hoodie.datasource.write.recordkey.field' = 'id',
'hoodie.datasource.write.hive_style_partitioning' = 'true',
'hive_sync.enable' = 'true',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://node20:9083',
'hive_sync.conf.dir'='/opt/cloudera/parcels/CDH/lib/hive/conf',
'hive_sync.db' = 'hudi',
'hive_sync.table' = 'flow_business_cow',
'hive_sync.partition_fields' = 'DATA_DT',
'hive_sync.partition_extractor_class' = 'org.apache.hudi.hive.HiveStylePartitionValueExtractor'
);

insert into hudiods.flow_business_cow values ('hudi',10100.01,'2022-10-31'),('spark',10100.02,'2023-05-26'),('flink',10100.06,'2023-05-27'),('hive',10100.00,'2023-05-28');

#Hive中查看数据

 
select * from flow_business_cow;

 5 结论

1)由flink创建的Hudi表,需要同步元数据到hive,后续Hive SQL,Spark SQL都可以进行查询

2)由Spark SQL创建的Hudi表,Flink SQL也可以操作,但在操作之前需要进行数据库和表的创建

3)不管是什么方式创建的Hudi表,想要用其他引擎进行操作,需要将元数据同步到Hive,同时,其他引擎在操作的时候,需要对catalog、database及table进行映射,这是很关键的点,区别于其他数据库系统

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
随着互联网的发展,数据的不断膨胀,从刚开始的关系型数据库到非关系型数据库,再到大数据技术,技术的不断演进最终是随着数据膨胀而不断改变,最初的数据仓库能解决我们的问题,但是随着时代发展,企业已经不满足于数据仓库,希望有更强大的技术来支撑数据的存储,包括结构化,非结构化的数据等,希望能够积累企业的数据,从中挖掘出更大的价值。基于这个背景,数据湖的技术应运而生。本课程基于真实的企业数据湖案例进行讲解,结合业务实现数据湖平台,让大家在实践中理解和掌握数据湖技术,未来数据湖的需求也会不断加大,希望同学们抓住这个机遇。项目中将以热门的互联网电商业务场景为案例讲解,具体分析指标包含:流量分析,订单分析,用户行为分析,营销分析,广告分析等,能承载海量数据的实时分析,数据分析涵盖全(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.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。  
Apache Flink 和 Apache Hudi 都是 Apache 软件基金会的开源项目,它们都是处理大规模数据的工具。Apache Flink 是一个分布式流处理引擎,而 Apache Hudi 是一个分布式数据湖,可以实现数据仓库中数据的更新、删除和插入。 要集成 Apache Flink 和 Apache Hudi,可以按照以下步骤进行操作: 1.下载 Apache Flink 和 Apache Hudi,将它们解压到本地文件夹。 2.启动 Apache Flink 集群。可以使用以下命令启动: ``` ./bin/start-cluster.sh ``` 3.启动 Apache Hudi。可以使用以下命令启动: ``` ./bin/start-hoodie.sh ``` 4.在代码中使用 Apache Flink 和 Apache Hudi。可以使用以下代码示例: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.source.SourceFunction; import org.apache.hudi.client.HoodieWriteClient; import org.apache.hudi.client.WriteStatus; import org.apache.hudi.client.common.HoodieFlinkEngineContext; import org.apache.hudi.client.common.HoodieSparkEngineContext; import org.apache.hudi.common.model.HoodieTableType; import org.apache.hudi.common.util.CommitUtils; import org.apache.hudi.common.util.ReflectionUtils; import org.apache.hudi.common.util.TypedProperties; import org.apache.hudi.common.util.ValidationUtils; import org.apache.hudi.flink.HoodieFlinkWriteConfiguration; import org.apache.hudi.flink.HoodieFlinkWriter; import org.apache.hudi.flink.HoodieFlinkWriterFactory; import org.apache.hudi.flink.source.StreamReadOperator; import org.apache.hudi.flink.utils.CollectSink; import org.apache.hudi.flink.utils.TestConfigurations; import org.apache.hudi.flink.utils.TestData; import org.apache.hudi.flink.utils.TestDataGenerator; import org.apache.hudi.streamer.FlinkStreamer; import org.apache.kafka.clients.consumer.ConsumerRecord; import java.util.List; import java.util.Properties; public class FlinkHudiIntegrationExample { public static void main(String[] args) throws Exception { // set up the streaming execution environment final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // create a Kafka source SourceFunction<ConsumerRecord<String, String>> kafkaSource = KafkaSource.<String, String>builder() .setBootstrapServers("localhost:9092") .setTopics("test_topic") .build(); // create a Hudi sink TypedProperties properties = new TypedProperties(); properties.setProperty("hoodie.datasource.write.recordkey.field", "id"); properties.setProperty("hoodie.datasource.write.partitionpath.field", "ts"); properties.setProperty("hoodie.table.name", "test_table"); properties.setProperty("hoodie.table.type", HoodieTableType.COPY_ON_WRITE.name()); properties.setProperty("hoodie.datasource.write.keygenerator.class", ReflectionUtils.loadClass( "org.apache.hudi.keygen.SimpleKeyGenerator").getName()); properties.setProperty("hoodie.datasource.write.payload.class", ReflectionUtils.loadClass( "org.apache.hudi.example.data.SimpleJsonPayload").getName()); properties.setProperty("hoodie.datasource.write.hive_style_partitioning", "true"); HoodieFlinkWriteConfiguration writeConfig = HoodieFlinkWriteConfiguration.newBuilder() .withProperties(properties) .build(); HoodieFlinkWriter<ConsumerRecord<String, String>> hudiSink = HoodieFlinkWriterFactory.<ConsumerRecord<String, String>>newInstance() .writeConfig(writeConfig) .withEngineContext(new HoodieFlinkEngineContext(env)) .build(); // add the Kafka source and Hudi sink to the pipeline env.addSource(kafkaSource) .map(new StreamReadOperator()) .addSink(hudiSink); // execute the pipeline env.execute("Flink Hudi Integration Example"); } } ``` 这个代码示例展示了如何在 Apache Flink 中使用 Apache Hudi。它使用 Kafka 作为数据源,将数据写入到 Hudi 表中。 以上就是集成 Apache Flink 和 Apache Hudi 的步骤。需要注意的是,集成过程中可能会遇到一些问题,需要根据具体情况进行解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值