新问题忽略,估计是因为数据小,我换了个数据量大的,看到inprogress的情况了,是基于 . 开头控制可见性的。

yidan zhao <hinobl...@gmail.com> 于2021年11月3日周三 下午1:14写道:

> 还有个问题,我看FlinkSQL写的文件的命名不像文档中说的如下格式:
>
> └── 2019-08-25--12
>     ├── prefix-0-0.ext
>     ├── prefix-0-1.ext.inprogress.bd053eb0-5ecf-4c85-8433-9eff486ac334
>     ├── prefix-1-0.ext
>     └── prefix-1-1.ext.inprogress.bc279efe-b16f-47d8-b828-00ef6e2fbd11
>
> 实际我看到的是,part-8201db8e-36d4-49d2-986d-611f6766b22f-0-351,不存在inprogress的状态,貌似是检查点的时候才一次性写?
>
>
> Caizhi Weng <tsreape...@gmail.com> 于2021年11月3日周三 上午10:20写道:
>
>> Hi!
>>
>> hive sink 有文件合并功能可以在同一个 checkpoint 内把同一个 partition 的数据整理到同一个文件里。详见 [1]
>>
>> [1]
>>
>> https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/table/filesystem/#file-compaction
>>
>> yidan zhao <hinobl...@gmail.com> 于2021年11月3日周三 上午10:03写道:
>>
>> > 需求
>> > 假设,我的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,这是不满足需要的肯定。
>> >
>>
>

回复