一、应用场景:
Flink 消费 Kafka 数据进行实时处理,并将结果写入 HDFS。
二、Streaming File Sink
由于流数据本身是无界的,所以,流数据将数据写入到分桶(bucket)中。默认使用基于系统时间(yyyy-MM-dd–HH)的分桶策略。在分桶中,又根据滚动策略,将输出拆分为 part 文件。
1、Flink 提供了两个分桶策略,分桶策略实现了
org.apache.flink.streaming.api.functions.sink.filesystem.BucketAssigner 接口:
- BasePathBucketAssigner,不分桶,所有文件写到根目录;
- DateTimeBucketAssigner,基于系统时间(yyyy-MM-dd–HH)分桶。
除此之外,还可以实现BucketAssigner接口,自定义分桶策略。
2、Flink 提供了两个滚动策略,滚动策略实现了
org.apache.flink.streaming.api.functions.sink.filesystem.RollingPolicy 接口:
- DefaultRollingPolicy 当超过最大桶大小(默认为 128 MB),或超过了滚动周期(默认为 60 秒),或未写入数据处于不活跃状态超时(默认为 60 秒)的时候,滚动文件;
- OnCheckpointRollingPolicy 当 checkpoint 的时候,滚动文件。
三、编码。
1.pom文件具体依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-filesystem_${
scala.binary.version}</artifactId>
<version>${
flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_${
scala.binary.version}</artifactId>
<version>${
flink.version}</version>
2.为了方便,我们这边使用Socket方式创建source
DataStreamSource<String> socketTextStream = FUtils.createSocketTextStream("cdh1", 13701);
3、添加Sink。
DefaultRollingPolicy<String, String> defaultRollingPolicy