Flink分布式文件Sink实战解析

目录

[1. 代码结构](#1. 代码结构)

代码解析

[(1) 主程序入口](#(1) 主程序入口)

[(2) 配置文件 Sink](#(2) 配置文件 Sink)

[(3) 添加 Sink 到数据流](#(3) 添加 Sink 到数据流)

[(4) 执行任务](#(4) 执行任务)

[3. 输出结果](#3. 输出结果)


这段代码展示了如何使用 Apache Flink 将数据流以文本形式写入文件,并配置了文件的滚动策略。以下是对代码的详细解析和说明:

1. 代码结构

  • 包声明package sink

    定义了代码所在的包。

  • 导入依赖

    导入了必要的 Java 和 Flink 相关类库,包括:

    • java.util.concurrent.TimeUnit:用于时间单位转换。
    • org.apache.flink:Flink 的核心类库。
    • org.apache.flink.streaming.api.functions.sink.filesystem:Flink 的文件 Sink 相关类。
  • sinkToFile 对象

    主程序入口,包含 Flink 流处理逻辑和文件 Sink 的配置。

Scala 复制代码
package sink

import java.util.concurrent.TimeUnit

import org.apache.flink.api.common.serialization.SimpleStringEncoder
import org.apache.flink.core.fs.Path
import org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink
import org.apache.flink.streaming.api.functions.sink.filesystem.rollingpolicies.DefaultRollingPolicy
import org.apache.flink.streaming.api.scala._


/**
 *
 * @PROJECT_NAME: flink1.13
 * @PACKAGE_NAME: sink
 * @author: 赵嘉盟-HONOR
 * @data: 2023-11-19 23:26
 * @DESCRIPTION
 *
 */
object sinkToFile {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    val data = env.fromElements(
      Event("Mary", "./home", 100L),
      Event("Sum", "./cart", 500L),
      Event("King", "./prod", 1000L),
      Event("King", "./root", 200L)
    )

    //TODO 直接一文本形式分布式写到文件中
    val fileSink = StreamingFileSink
      .forRowFormat(
        new Path("src/main/resources/output/fileSink"),
        new SimpleStringEncoder[String]("UTF-8")
      )
      .withRollingPolicy(  //指定滚动策略
        DefaultRollingPolicy.builder()
          .withRolloverInterval(TimeUnit.MINUTES.toMinutes(15)) //十五分钟混动
          .withInactivityInterval(TimeUnit.MINUTES.toMinutes(5)) //五分钟无数据滚动
          .withMaxPartSize(1024*1024*1024)                          //最大文件大小
          .build()
      )
      .build()
    data.map(_.toString).addSink(fileSink)

    env.execute("SinkFile")
  }
}

基于scala使用flink将读取到的数据分布式写入到文件中

可以指定滚动策略(滚动时间、滚动方式、最大文件数量等)

代码解析

(1) 主程序入口
Scala 复制代码
def main(args: Array[String]): Unit = {
  val env = StreamExecutionEnvironment.getExecutionEnvironment
  val data = env.fromElements(
    Event("Mary", "./home", 100L),
    Event("Sum", "./cart", 500L),
    Event("King", "./prod", 1000L),
    Event("King", "./root", 200L)
  )
  • 创建 Flink 流处理环境 StreamExecutionEnvironment
  • 使用 fromElements 方法生成一个包含 4 个 Event 对象的流。
(2) 配置文件 Sink
Scala 复制代码
val fileSink = StreamingFileSink
  .forRowFormat(
    new Path("src/main/resources/output/fileSink"),
    new SimpleStringEncoder[String]("UTF-8")
  )
  .withRollingPolicy(
    DefaultRollingPolicy.builder()
      .withRolloverInterval(TimeUnit.MINUTES.toMinutes(15)) // 15 分钟滚动
      .withInactivityInterval(TimeUnit.MINUTES.toMinutes(5)) // 5 分钟无数据滚动
      .withMaxPartSize(1024 * 1024 * 1024) // 最大文件大小 1GB
      .build()
  )
  .build()
  • 使用 StreamingFileSink.forRowFormat 创建一个文件 Sink:
    • 指定输出路径为 src/main/resources/output/fileSink
    • 使用 SimpleStringEncoder 将数据编码为 UTF-8 格式的字符串。
  • 配置滚动策略 DefaultRollingPolicy
    • withRolloverInterval(15):每 15 分钟滚动一次文件。
    • withInactivityInterval(5):如果 5 分钟内没有新数据,则滚动文件。
    • withMaxPartSize(1024 * 1024 * 1024):当文件大小达到 1GB 时滚动文件。
(3) 添加 Sink 到数据流
Scala 复制代码
data.map(_.toString).addSink(fileSink)
  • Event 对象转换为字符串。
  • 将文件 Sink 添加到数据流中。
(4) 执行任务
Scala 复制代码
env.execute("SinkFile")
  • 启动 Flink 流处理任务,任务名称为 SinkFile

3. 输出结果

程序运行后,数据会以文本形式写入 src/main/resources/output/fileSink 目录下的文件中。文件会根据滚动策略进行分割,例如:

  • 每 15 分钟生成一个新文件。
  • 如果 5 分钟内没有新数据,则生成一个新文件。
  • 当文件大小达到 1GB 时生成一个新文件。

文件内容示例:

Scala 复制代码
Event(Mary,./home,100)
Event(Sum,./cart,500)
Event(King,./prod,1000)
Event(King,./root,200)
相关推荐
深蓝电商API9 小时前
分布式事务在跨境交易中的解决方案
分布式·跨境电商·代购系统·反向海淘·代购平台·跨境代购
我真会写代码13 小时前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
黄俊懿15 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
一叶飘零_sweeeet15 小时前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
念陌曦15 小时前
Flink总结
大数据·flink
007张三丰16 小时前
常用缓存技术全方位解析:从本地缓存到分布式缓存
分布式·缓存
tianyuanwo20 小时前
Koji 分布式编译调度机制深度解析:多架构异构节点的资源优化方案
分布式·架构
江沉晚呤时20 小时前
.NET 9 快速上手 RabbitMQ 直连交换机:高效消息传递实战指南
开发语言·分布式·后端·rabbitmq·.net·ruby
Volunteer Technology20 小时前
zookeeper基础应用与实战二
分布式·zookeeper·云原生
姚青&1 天前
Pytest 测试用例并行运行与分布式运行
分布式·测试用例·pytest