hive查看表中列的信息命令_Flink深入浅出:Hive读取原理分析

961b0f049470ef720874018a426e7bec.png

随着Flink 1.10版本的发布,Table API&SQL得以完善,现在可以基于Flink SQL实现离线分析了。在离线分析的场景中,最经常的使用场景是读取Hive做分析处理,这时就不得不研究下Flink读取Hive的原理了。在阅读本文之前,可以思考两个问题:

1 Flink是如何读取Hive数据?

2 Flink如何控制读取的并行度?

1 Flink如何识别Hive表

Flink读取Hive表跟其他的外部数据源不太一样,其他的组件是通过with属性中的type+SPI服务扫描对应的Factory类实现,而hive则是直接基于HiveCatalog创建。

0c2bd1c69a131bca64185828f60a4801.png

创建TableFactory之后的套路,就都一样了。比如创建对应的HiveTableSource,在调用TableSource的getDataStream方法时,创建对应的HiveTableInpurtFormat,最后基于这个inputFormat执行查询操作。

2 如何读取Hive中的数据

先来看看第一个问题,一个标准的Hive表创建后,可以在hive命令行中查看对应的创建信息,使用的命令为:hive> describe formatted table_name;

38fd3fea6276bd03e76f7fe84790f43b.png

可以看到原生的hive表使用的是ParquetHiveSerDe作为序列化工具,MapredParquetInputFormat 作为查询格式。因此我们可以使用下面的代码直接读取:

56677003e29864d30f92691cd983b3c1.png

看到这里应该就能猜想到Flink是如何读取数据的了吧:
1 获取HiveCatalog中的定义,拿到对应的目录地址、SerDe、InputFormat

2 通过反射创建对应的反序列化器和InputFormat,获得一条结果

3 调用recordReader.next()获取下一条数据.....

3 Hive表的并行度控制

在HiveTableSource调用getDataStream的第一步会初始化分区信息,返回当前sql匹配的分区。然后创建对应的InputFormat,当开启了并行度自动推断后,基于前面的分区信息,统计文件个数,并把对应的文件内容放入InputSplit[]中。这个数组有两个作用:

1 后面判断并行度时,根据该数组的长度与默认配置进行比较,确定最终并行度

2 切分形成Task后,task会基于这个数组确定每个Slot读取的文件(流程类似前面分享的jdbc的分区抢占)

4bba14b0e730e371949aa9bb3a3ed7af.png

4 总结流程

d1541144406536c9948388a44d3aae1d.png

通过前面两个问题,再来梳理下读取Hive的整体流程:

1 Flink基于calcite解析sql,确定表来源于hive,在HiveCatalog中创建HiveTableFactory

2 HiveTableFactory基于配置文件创建HiveTableSource

3 HiveTableSource在真正执行时,调用getDataStream方法

4 在getDataStream中先确定查询匹配的分区信息,然后创建表对应的InputFormat,并确定并行度

5 根据并行度确定slot分发HiveMapredSplitReader任务

6 在TaskManager端的Slot中,基于split确定读取的内容

7 基于Hive中定义的序列化工具、InpurtFormat执行读取返序列化,得到value值

8 循环执行reader.next获取value,基于HiveInspectors解析成Row

以上就是flink读取hive数据的大致流程,更多内容可以参考专辑列表。

更多内容参考公众号:

http://weixin.qq.com/r/-yjG3iTEbnkRrWC9933t (二维码自动识别)

java flink是一个高性能的分布式流式计算框架,可以实现大规模的数据处理和分析。而hive是一个分布式数据仓库工具,可以用于存储和查询大规模的结构化数据。redis是一个高性能的内存数据库,可以用于存储和检索数据。 要实现java flink读取hive表中的数据写入redis,我们可以按照以下步骤进行操作: 1. 在java flink中,首先需要配置并连接到hive数据库。可以使用FlinkHiveCatalog来创建一个连接到Hive的catalog,并设置相关的hive metastore地址、用户名和密码等。 2. 根据需要,编写flink程序来读取hive表的数据。可以使用flink的DataStream或Table API来读取hive数据,并将其转换为适当的数据流或表。 3. 在准备好数据之后,我们可以使用flink的RedisSink来将数据写入redis中。在使用RedisSink之前,需要先引入flink-connector-redis的依赖包,并在flink配置文件中配置好redis的连接参数,如redis的主机地址、端口号、密码等。 4. 编写代码将数据写入redis。可以根据数据的特点,选择将整个数据写入一个redis数据结构中,或者将数据分解为多个key-value对存储到redis中。 5. 在代码编写完成后,我们可以使用flink提供的命令或者IDE工具来运行flink程序,它会自动连接到hive数据库和redis,并完成数据读取和写入。 通过以上步骤,java flink就可以实现读取hive表中的数据并写入redis。这样可以通过flink的分布式计算和hive数据存储能力,结合redis的高速读写能力,实现大规模数据的处理和查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值