开发者社区> 问答> 正文

FlinkSQL 使用 streamingSink 写入 hive orc数据,如何控制文件数量。

需求 假设,我的hive表为tmp表,若干字段,如何以dt、hour、sid为分区,其中sid为渠道的含义。 我当前基于FlinkSQL从kafka表中读取数据,转写到hive表tmp中,采用流式写入,提交策略metastore、success-file,触发假设用process-time,delay为1h。 检查点每1min检查一次,连续2次检查点间隔10min,本质就是10min做一次检查点。

当前情况 由于数据量较大,kafka分区数量为60,因此我的任务并发可以选择60以内,假设并发也选了60。 那么对于每个时间点,dt肯定只有1个,hour也基本只有1个,sid的话假设有10个。 文件数情况为: 每10分钟,10(sid)*60(parallelism)= 600个。 每小时有6个10分钟(即6次检查点),那么就是6000个文件。 如上,每小时差不多6000个文件生成,只会多不会少,因为考虑到roll policy等。

目前我需要的是,由于不同sid的数据量不一样,我想能否对于小数据量的sid,只被1个subtask消费,这样对于这个sid对应的分区下,每10分钟的文件数量就是1个,而不是60个。 对于数据量大的sid,则多个并行subtask消费。 大概想法类似于datastream api中先keyBy sid(当然这里可能有数据倾斜,我可以自己去想法解决,比如将大流量sid分散为sid+randomInt),然后基于streamingSink来消费并写入hive。

请问如上想法datastream、以及 flinkSQL 是否都能实现呢?

目前我看insert into tmp select ... from kafka_tmp;这样的话,默认生成2个task,一个kafkaSouce+streamSink(chain在一起)+ partition commiter,这是不满足需要的肯定。*来自志愿者整理的flink邮件归档

展开
收起
moonlightdisco 2021-12-08 09:41:31 833 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Comparison of Spark SQL with Hive 立即下载
Hive Bucketing in Apache Spark 立即下载
2019大数据技术公开课第五季—Hive迁移到MaxCompute最佳实践 立即下载