Flink目前对于外部Exactly-Once写支持提供了两种的sink,一个是Kafka-Sink,另一个是Hdfs-Sink,这两种sink实现的Exactly-Once都是基于Flink checkpoint提供的hook来实现的两阶段提交模式来保证的,主要应用在实时数仓、topic拆分、基于小时分析处理等场景下。本篇将会介绍StreamingFileSink的基本用法、如何压缩数据以及合并产生的小文件。
一、基本用法
StreamingFileSink提供了基于行、列两种文件写入格式,用法:
//行
StreamingFileSink.forRowFormat(new Path(path),
new SimpleStringEncoder<T>())
.withBucketAssigner(new PaulAssigner<>()) //分桶策略
.withRollingPolicy(new PaulRollingPolicy<>()) //滚动策略
.withBucketCheckInterval(CHECK_INTERVAL) //检查周期
.build();
//列 parquet
StreamingFileSink.forBulkFormat(new Path(path),
ParquetAvroWriters.forReflectRecord(clazz))
.withBucketAssigner(new PaulBucketAssigner<>())
.withBucketCheckInterval(CHECK_INTERVAL)
.build();
这两种写入格式除了文件格式的不同,另外一个很重要的区别就是回滚策略

本文介绍了Flink的StreamingFileSink在实时数仓中的应用,包括基本用法、文件压缩(如Parquet的SNAPPY压缩)、小文件处理策略(如减少并行度、增大checkpoint周期、下游任务合并处理)。重点关注了如何避免和处理小文件问题,以提高效率和降低成本。
最低0.47元/天 解锁文章
4046

被折叠的 条评论
为什么被折叠?



