需求:用flink实时消费kafka信息,将信息存储到hdfs上。
方案:用flink提供的StreaimingFileSink方法。
StreaimingFileSink
forRowFormat方法
这个方法比较简单,就是把读到的信息按照行存储的格式写入hdfs上,我们这里直接看下官方提供的代码:(分桶策略后面再说)
import org.apache.flink.api.common.serialization.SimpleStringEncoder
import org.apache.flink.core.fs.Path
import org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink
import org.apache.flink.streaming.api.functions.sink.filesystem.rollingpolicies.DefaultRollingPolicy
val input: DataStream[String] = ...
val sink: StreamingFileSink[String] = StreamingFileSink
.forRowFormat(new Path(outputPath), new SimpleStringEncoder[String]("UTF-8"))
.withRollingPolicy(
//设置滚动策略
DefaultRollingPolicy.builder()
//15min 滚动,生成一个新文件
.withRolloverInterval(TimeUnit.MINUTES.toMillis(15))
//5min未接收到数据,滚动,生成一个新文件
.withInactivityInterval(TimeUnit.MINUTES.toMillis(5))
//文件大小达到1G,滚动,生成一个新文件
.withMaxPartSize(1024 * 1024 * 1024)
.build())
//设置分桶策略
.withBucketAssigner(dayAssigner)
.build()
input.addSink(sink)
我们基本看代码就能知道这个sink的使用方法了。
forBulkFormat方法
但是除了上述的按照行存储的方式,我们往往需要指定其他的存储格式,例如:parquet,Avro,ORC等等…而且,我们还需要压缩写入的文件,针对这种情况,我们就需要换另一种方法,采用另一种编码器了。
Parquet格式
这里用parquet举例,其他情况类似。
首先我们要额外引入依赖:
> <dependency>
> <groupId>org.apache.flink</groupId>
> <artifactId>flink-parquet_2.11</artifactId>
> <version>1.11.2</version>
> </dependency>
然后代码:
import org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink
import org.apache.flink.formats.parquet.avro.ParquetAvroWriters
val input: DataStream[DemoBean] = ...
val sink: StreamingFileSink[DemoBean] = StreamingFileSink
.forBulkFormat(outp

本文介绍如何使用Flink StreamingFileSink将Kafka消息保存至HDFS,并探讨不同存储格式(如Parquet)及压缩方式(如Snappy)的应用。同时,深入分析自定义分桶与滚动策略以优化文件管理和提高数据处理效率。
最低0.47元/天 解锁文章
4208

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



