flink sink 到hdfs文件系统

本文介绍如何使用 Apache Flink 将实时数据流写入 HDFS,并通过 StreamingFileSink 进行详细配置,包括设置检查点、文件滚动策略及分区策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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文件夹,里面就有我们刚才输入的信息!
### Flink 批处理作业中设置 SinkHDFS 的最佳实践 #### 配置批处理环境 为了在Flink中配置批处理并将其数据sinkHDFS,首先需要创建一个`ExecutionEnvironment`实例。对于批处理应用而言,通常会使用`getExecutionEnvironment()`方法获取默认的执行环境[^2]。 ```java ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); ``` 这里设置了并行度为1以便简化示例;实际部署时应根据集群资源调整此参数以优化性能。 #### 数据源读取 接着定义输入数据源。可以利用API中的各种方式加载本地文件系统或分布式存储上的静态数据集作为批处理任务的数据源: ```java DataSet<String> input = env.readTextFile("hdfs://namenode:8020/path/to/input"); ``` 上述代码片段展示了如何从指定路径下的HDFS位置读取文本文件的内容作为批量处理的数据流起点[^4]。 #### 使用 StreamingFileSink 进行高效写入 当涉及到向HDFS写出大量记录时,建议采用`StreamingFileSink`组件来完成这项工作。该类提供了良好的吞吐量以及可靠性保障机制,在多线程环境下表现尤为出色[^1]。 下面是一个具体的例子说明怎样通过编程接口构建这样的输出端点: ```java import org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink; import org.apache.flink.core.fs.Path; StreamingFileSink<String> sinkToHdfs = StreamingFileSink.forRowFormat( new Path("hdfs://namenode:8020/output/directory"), Encoder.simpleStringEncoder()) .withBucketAssigner(new BasePathBucketAssigner<>()) // 默认按时间分桶策略 .build(); input.writeAsText(sinkToHdfs.getPath().toString()); ``` 这段代码实现了将批处理的结果保存至给定的目标目录下,并且采用了简单的字符串编码器来进行序列化操作。同时指定了基于基本路径分配bucket的方式,默认情况下这将以小时级别的时间戳进行分区管理[^3]。 需要注意的是,虽然这里是针对批处理场景编写的案例,但是由于`StreamingFileSink`本身支持增量式的持续追加特性,因此同样适用于某些特定类型的准实时应用场景之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值