从0到1Flink的成长之路(二十)-扩展:Streaming File Sink

扩展:Streaming File Sink

streamFile
1 场景描述
StreamingFileSink是Flink1.7中推出的新特性,是为了解决如下的问题:
大数据业务场景中,经常有一种场景:

外部数据发送到kafka中,Flink作为中间件消费kafka数据并进行业务处理;处理完成之后的数据可能还需要写入到数据库或者文件系统中,如写入hdfs中。

StreamingFileSink就可以用来将分区文件写入到支持 Flink FileSystem 接口的文件系统中,支持Exactly-Once语义。
这种sink实现的Exactly-Once都是基于Flink checkpoint来实现的两阶段提交模式来保证的,主要应用在实时数仓、topic拆分、基于小时分析处理等场景下。

2 案例演示
需求
编写Flink程序,接收socket的字符串数据,然后将接收到的数据流式方式存储到hdfs

开发步骤

1.初始化流计算运行环境
2.设置Checkpoint(10s)周期性启动
3.指定并行度为1
4.接入socket数据源,获取数据
5.指定文件编码格式为行编码格式
6.设置桶分配策略
7.设置文件滚动策略
8.指定文件输出配置
9.将streamingfilesink对象添加到环境
10.执行任务

实现代码

package xx.xxxxxx.flink.dfs;
import org.apache.flink.api.common.serialization.SimpleStringEncoder;
import org.apache.flink.core.fs.Path;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.filesystem.OutputFileConfig;
import org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink;
import org.apache.flink.streaming.api.functions.sink.filesystem.bucketassigners.DateTimeBucketAssigner;
import org.apache.flink.streaming.api.functions.sink.filesystem.rollingpolicies.DefaultRollingPolicy;
import java.util.concurrent.TimeUnit;
/**
* Flink Stream 流计算,将DataStream 保存至文件系统,使用FileSystem Connector
*/
public class StreamSinkFileDemo {
public static void main(String[] args) throws Exception{
// 1. 执行环境-env
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(2);
// 启用Checkpoint,时间间隔为10秒
env.enableCheckpointing(TimeUnit.SECONDS.toMillis(10));
// 2. 数据源:source
DataStreamSource<String> inputDataStream = env.socketTextStream("node1.itcast.cn", 9999);
// 4. 数据终端-sink
// a. 输出文件名称设置
OutputFileConfig config = OutputFileConfig
.builder()
.withPartPrefix("prefix")
.withPartSuffix(".txt")
.build();
// b. FlinkSink对象创建
StreamingFileSink<String> fileSink = StreamingFileSink
.forRowFormat(
new Path("hdfs://node1.itcast.cn:8020/flink-stream/parquet"),
new SimpleStringEncoder<String>("UTF-8") ) //
/**
* 设置桶分配政策
* DateTimeBucketAssigner --默认的桶分配政策,默认基于时间的分配器,每小时产生一个桶,格式如下yyyy-MM-dd--HH
* BasePathBucketAssigner :将所有部分文件(part file)存储在基本路径中的分配器(单个全局桶)
*/
.withBucketAssigner(new DateTimeBucketAssigner<>())
/**
* 有三种滚动政策
* CheckpointRollingPolicy
* DefaultRollingPolicy
* OnCheckpointRollingPolicy
*/
.withRollingPolicy(
/**
* 滚动策略决定了写出文件的状态变化过程
* 1. In-progress :当前文件正在写入中
* 2. Pending :当处于 In-progress 状态的文件关闭(closed)了,就变为 Pending 状态
* 3. Finished 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值