env.enableCheckpointing(30000);
// 两次checkpoint间隔最少是20秒
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(20000);
// 程序取消或者停止时不删除checkpoint
env.getCheckpointConfig().setExternalizedCheckpointCleanup(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN\_ON\_CANCELLATION);
// checkpoint必须在60秒结束,否则将丢弃
env.getCheckpointConfig().setCheckpointTimeout(60000);
// 同一时间只能有一个checkpoint
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// 设置EXACTLY\_ONCE语义,默认就是这个
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY\_ONCE);
// checkpoint存储位置
env.getCheckpointConfig().setCheckpointStorage("file:///Users/xxx/data/testData/checkpoint");
// 添加数据源(这里使用的是自定义数据源CustomizeSource,方便测试)
DataStreamSource<CustomizeBean> sourceStream = env.addSource(new CustomizeSource());
// 将数据流中的数据存储到bean对象中
SingleOutputStreamOperator<User> userMapStream = sourceStream.map(bean -> new User(bean.getName(), bean.getAge(), bean.getGender(), bean.getHobbit()));
// 构建parquetWriterFactory
ParquetWriterFactory<User> parquetWriterFactory2 = AvroParquetWriters.forReflectRecord(User.class);
// 构建FileSink
FileSink<User> parquetFileSink = FileSink
// 使用Bulk模式,并配置路径和对应的schema
.forBulkFormat(new Path("/Users/xxx/data/testData/"), parquetWriterFactory2)
// 分桶策略,使用默认的
.withBucketAssigner(new DateTimeBucketAssigner<User>())
// 每100毫秒检查一次分桶
.withBucketCheckInterval(100)
// 滚动策略,Bulk的滚动策略只有一种,就是发生Checkpoint的时候才进行滚动(为了保证列式文件的完整性)
.withRollingPolicy(OnCheckpointRollingPolicy.build())
.build();
// 输出到文件
userMapStream.sinkTo(parquetFileSink);
env.execute();
}
}
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
class