flink将数据保存到hdfs中,官网支持–StreamingFileSink
public class StreamFileSinkDemo {
public static void main(String[] args)throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);
SingleOutputStreamOperator<String> upper = lines.map(String::toUpperCase);
//然后建将官网写好的代码复制到这个平台
String patha = "D:\\test\\out";
//必须要设置,检查点10秒钟
env.enableCheckpointing(10000);
//指定分区分配策略,默认按每小时分桶
BucketAssigner<String, String> assigner = new DateTimeBucketAssigner<>("yyyy-MM-dd", ZoneId.of("Asia/Shanghai"));
StreamingFileSink<String> fileSink = StreamingFileSink.<String>forRowFormat(
new Path("你的输出路径"),//hdfs-->"hdfs://198.16.1.23:9870/flink/"
new SimpleStringEncoder<>("UTF-8"))//编码格式字符集
.withRollingPolicy(
DefaultRollingPolicy.builder()//文件滚动策略
.withRolloverInterval(TimeUnit.MINUTES.toMillis(15))//至少包含 15 分钟的数据
.withInactivityInterval(TimeUnit.MINUTES.toMillis(5 ))//最近 5 分钟没有收到新的数据
.withMaxPartSize(1024 * 1024 * 1024)//文件大小已达到 1 GB
.build())
.withBucketAssigner(assigner)//指定分桶策略
.build();
// 将record-->过滤上传数据-->转换成jsonstring-->写入到hdfs
record.map(line->JSON.toJSONString(line)).addSink(fileSink);
env.execute();
}
}
--你在8888端口依次输入:
--我要保存在本地路:
--他就会在你的D:\\test\\下生成一个out文件夹,里面就有我们刚才输入的信息!