Flink--Source(集合,文件)

该博客介绍了如何使用Apache Flink处理温度传感器数据。首先定义SensorReading类,接着创建流处理环境,然后从集合和文件中读取数据。数据源包括预定义的SensorReading实例列表和一个文本文件。通过fromCollection和readTextFile方法读取数据后,将数据流打印并执行任务。这展示了Flink的快速、灵活和实时处理能力。

从集合、文件中读取数据

基于Flink快速,灵巧,实时性高的特点以温度传感器的数据采集为场景做练习。

------集合------

第一步:定义传感器样例类

case class SensorReading(id:String,timeStamp:Long,temperature:Double)

第二步:创建执行环境(流式数据)

val env = StreamExecutionEnvironment.getExecutionEnvironment

第三步:定义数据源集合

val sensorList = List (
      SensorReading("Sensor_1", 1547718199, 36.0),
      SensorReading("Sensor_2", 1547718257, 35.2),
      SensorReading("Sensor_3", 1547718358, 34.8),
      SensorReading("Sensor_4", 1547718455, 32.8),
      SensorReading("Sensor_5", 1547718587, 32.5),
      SensorReading("Sensor_6", 1547718698, 31.3),
      SensorReading("Sensor_7", 1547718785, 37.9)
      )

第四步:从集合中读取数据

val sensorData: DataStream[SensorReading] = env.fromCollection(sensorList)

//也可以使用fromelements方法
val sensorData: DataStream[SensorReading] = env.fromElements(
        SensorReading("Sensor_1", 1547718199, 36.0),
        SensorReading("Sensor_2", 1547718257, 35.2),
        SensorReading("Sensor_3", 1547718358, 34.8),
        SensorReading("Sensor_4", 1547718455, 32.8),
        SensorReading("Sensor_5", 1547718587, 32.5),
        SensorReading("Sensor_6", 1547718698, 31.3),
        SensorReading("Sensor_7", 1547718785, 37.9))

fromCollection参数为包含数据的一个seq.
fromElements参数直接为数据。这些数据可以是不同类型的,可用于测试,但是不常用

第五步:打印

sensorData.print()

第六步:执行

env.execute("apitest")

结果:
2> SensorReading(Sensor_1,1547718199,36.0)
3> SensorReading(Sensor_2,1547718257,35.2)
2> SensorReading(Sensor_5,1547718587,32.5)
3> SensorReading(Sensor_6,1547718698,31.3)
1> SensorReading(Sensor_4,1547718455,32.8)
4> SensorReading(Sensor_3,1547718358,34.8)
4> SensorReading(Sensor_7,1547718785,37.9)

虽然代码中只对数据进行了读取和打印,依然需要进行隐式转换
因为里面设计了typeinformation的隐式转换

因为数据源为有界流数据处理完会直接结束

------文件------

第一步:创建执行环境(流式数据)
第二步:创建数据源文件
source下创建txt文件
“Sensor_1”, 1547718199, 36.0
“Sensor_2”, 1547718257, 35.2
“Sensor_3”, 1547718358, 34.8
“Sensor_4”, 1547718455, 32.8
“Sensor_5”, 1547718587, 32.5
“Sensor_6”, 1547718698, 31.3
“Sensor_7”, 1547718785, 37.9
第三步:读取文件

val inputpath = "F:\\idea1\\flinktest\\src\\main\\resources\\sensorfile.txt"
val sensorData2: DataStream[String] = env.readTextFile(inputpath)

第四步:打印
第五步:执行
完整代码

package com.erke.apitest

import org.apache.flink.streaming.api.scala._

//定义样例类
case class SensorReading(id:String,timeStamp:Long,temperature:Double)

object SourceTest {
  def main(args: Array[String]): Unit = {

    //创建执行环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    //定义数据源集合
    val sensorList = List (
      SensorReading("Sensor_1", 1547718199, 36.0),
      SensorReading("Sensor_2", 1547718257, 35.2),
      SensorReading("Sensor_3", 1547718358, 34.8),
      SensorReading("Sensor_4", 1547718455, 32.8),
      SensorReading("Sensor_5", 1547718587, 32.5),
      SensorReading("Sensor_6", 1547718698, 31.3),
      SensorReading("Sensor_7", 1547718785, 37.9)
      )

    //读取集合中数据
    val sensorData: DataStream[SensorReading] = env.fromCollection(sensorList)

    //读取文件中数据
    val inputpath = "F:\\idea1\\flinktest\\src\\main\\resources\\sensorfile.txt"
    val sensorData2: DataStream[String] = env.readTextFile(inputpath)

    //打印
    sensorData.print()
    sensorData2.print()

    //执行
    env.execute("apitest")
  }
}
你问得非常好:**Flink 的部署流程真的这么麻烦吗?能不能自己编译 Flink 1.17.2 中所需的 MySQL CDC 和 Elasticsearch 相关的 JAR,一劳永逸地解决依赖问题?** 我们来 **直击痛点、层层拆解**。 --- ## ✅ 简短回答: > ❌ **你不应该也不需要“自己编译整个 Flink”来获取 MySQL/ES 的 connector JAR。** > > ✅ 但你可以通过 **Maven 构建独立项目 + 打包 fat jar** 的方式,**一键生成包含所有所需功能(MySQL CDC + ES Sink)的可运行作业包**,完全不需要手动找 JAR 或修改 Flink 发行版。 > > 🚫 不推荐重新编译 Flink 发行版,因为: > - 它不解决根本问题 > - 成本高、易出错 > - 实际上也没必要 --- ## 🔍 为什么“编译 Flink”不是正确方向? ### 误解澄清:Flink 发行版 ≠ 功能集合 Apache Flink 的官方发行版(如 `flink-1.17.2-bin-scala_2.12.tgz`)是一个**通用流计算框架**,它并不内置: - 数据源连接器(如 MySQL CDC) - 外部系统输出(如 Elasticsearch) 这些是 **插件式组件(connectors)**,设计上就是 **按需引入** 的。 👉 就像你不会为了用 Chrome 浏览器看视频而去重新编译 Chrome 内核一样,你也不该为了加个 MySQL 连接器去重新编译 Flink--- ## ✅ 正确思路:把你的同步逻辑打包成一个“自带轮子的汽车” 与其修改 Flink 引擎本身,不如写一个 **Flink 应用程序(Job)**,然后用 Maven 把所有依赖打进去,变成一个 **可提交的 fat jar**。 这样你就实现了: - ✅ 不用手动下载任何 JAR - ✅ 所有依赖自动管理 - ✅ 提交一个文件即可运行 - ✅ 可重复构建、易于维护 --- ## 💡 推荐做法:使用 Maven 构建一个带完整依赖的 Flink Job 工程(适用于 Flink 1.17.2) 下面是一个最小可运行示例,支持: - MySQL 8.0 CDC 同步 - 写入 Elasticsearch 7.x - 使用 Flink 1.17.2 - JDK8 兼容 --- ### ✅ `pom.xml`(Flink 1.17.2 + CDC 2.3.2 + ES7) ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelModelVersion> <groupId>com.example</groupId> <artifactId>flink-mysql-to-es</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <flink.version>1.17.2</flink.version> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- Flink Core --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> </dependency> <!-- Flink Table API & Planner --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner-loader</artifactId> <version>${flink.version}</version> </dependency> <!-- MySQL CDC Connector (Ververica) --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-sql-connector-mysql-cdc</artifactId> <version>2.3.2</version> </dependency> <!-- Elasticsearch 7 Sink --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-elasticsearch7</artifactId> <version>${flink.version}</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <!-- Shade Plugin: 打包为 fat jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.FlinkSyncJob</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> ``` --- ### ✅ `src/main/java/com/example/FlinkSyncJob.java` ```java package com.example; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; public class FlinkSyncJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); // 设置 checkpoint(用于 exactly-once) env.enableCheckpointing(5000); // 创建 MySQL 源表 String mysqlSource = "" + "CREATE TABLE mysql_users (" + " id INT PRIMARY KEY NOT ENFORCED," + " name STRING," + " age INT," + " email STRING," + " update_time TIMESTAMP(3)" + ") WITH (" + " 'connector' = 'mysql-cdc'," + " 'hostname' = 'localhost'," + " 'port' = '3306'," + " 'database-name' = 'test_db'," + " 'table-name' = 'users'," + " 'username' = 'flinkuser'," + " 'password' = 'flinkpw'," + " 'server-time-zone' = 'Asia/Shanghai'," + " 'ssl-mode' = 'disabled'" + ")"; // 创建 ES 目标表 String esSink = "" + "CREATE TABLE es_users (" + " id INT," + " name STRING," + " age INT," + " email STRING," + " update_time TIMESTAMP(3)," + " PRIMARY KEY (id) NOT ENFORCED" + ") WITH (" + " 'connector' = 'elasticsearch-7'," + " 'hosts' = 'http://localhost:9200'," + " 'index' = 'users_index'" + ")"; tableEnv.executeSql(mysqlSource); tableEnv.executeSql(esSink); tableEnv.executeSql("INSERT INTO es_users SELECT * FROM mysql_users"); } } ``` --- ### ✅ 构建命令(一键生成完整 JAR) ```bash mvn clean package ``` 生成的 JAR: ``` target/flink-mysql-to-es-1.0-SNAPSHOT.jar ``` 这个 JAR 包含了: - Flink 运行时 API - MySQL CDC(含 Debezium) - Elasticsearch 7 Sink - MySQL JDBC Driver ✅ **全部依赖都在里面,无需额外放任何 JAR 到 `lib/` 目录!** --- ### ✅ 提交到 Flink 集群运行 ```bash # 启动集群(如果没启动) /path/to/flink-1.17.2/bin/start-cluster.sh # 提交任务 /path/to/flink-1.17.2/bin/flink run -c com.example.FlinkSyncJob ./target/flink-mysql-to-es-1.0-SNAPSHOT.jar ``` 🎉 完成!从此告别手动找 JAR 的时代。 --- ## ✅ 总结:Flink 部署到底麻不麻烦? | 场景 | 是否麻烦 | 建议 | |------|----------|------| | 手动下载 JAR → 放 `lib/` → 调试冲突 | ⛔ 很麻烦 | 不推荐 | | 自己编译 Flink 发行版 | ⛔ 极其麻烦且没必要 | 绝对不要做 | | 用 Maven 构建 fat jar 应用 | ✅ 简单高效 | 强烈推荐 ✅ | | 使用 Docker Compose 一键环境 | ✅ 更高级方案 | 后续可考虑 | --- ## 🧩 额外建议:如何简化 Flink 部署体验? 1. **使用 Flink SQL Gateway + REST API**(未来趋势) 2. **使用 Ververica Platform / Flink Kubernetes Operator**(生产级) 3. **封装脚本一键部署**(开发测试可用) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值