StreamingFileSink壓縮與合併小文件

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();

這兩種寫入格式除了文件格式的不同,另外一個很重要的區別就是回滾策略的不同,forRowFormat行寫可基於文件大小、滾動時間、不活躍時間進行滾動,但是對於forBulkFormat列寫方式只能基於checkpoint機制進行文件滾動,即在執行snapshotState方法時滾動文件,如果基於大小或者時間滾動文件,那麼在任務失敗恢復時就必須對處於in-processing狀態的文件按照指定的offset進行trunc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章