10分钟了解Flink SQL使用

news/2024/9/27 19:23:11

Flink 是一个流处理和批处理统一的大数据框架,专门为高吞吐量和低延迟而设计。开发者可以使用SQL进行流批统一处理,大大简化了数据处理的复杂性。本文将介绍Flink SQL的基本原理、使用方法、流批统一,并通过几个例子进行实践。

1、Flink SQL基本原理

Flink SQL建立在Apache Flink之上,利用Flink的强大处理能力,使得用户可以使用SQL语句进行流数据和批数据处理。Flink SQL既支持实时的流数据处理,也支持有界的批数据处理。

Flink SQL用SQL作为处理数据的接口语言,将SQL语句转换成数据流图(Dataflow Graph),再由Flink引擎执行。

2、Flink SQL固定编码套路

使用Flink SQL时,我们通常会遵循如下编码套路,这些套路和使用Flink API的套路是一样的:

  • 环境准备:初始化一个TableEnvironment对象,它是执行Flink SQL语句的核心。这个环境可以是流数据环境,也可以是批数据环境。
  • 数据源定义:通过CREATE TABLE语句定义输入数据源(source),可以是Kafka、CSV文件等。
  • 数据处理:编写SQL语句对数据进行处理,如查询、过滤、聚合等。
  • 数据输出:通过CREATE TABLE定义输出数据源(sink),并将处理结果输出。

3、Flink SQL代码示例

以下是一个从CSV文件读取数据,通过SQL查询,再将数据输出到CSV的完整例子。

  • 先准备input.csv文件内容,如下:
1,product_A,10.5
2,product_B,20.3
3,product_C,15.8
1,product_D,12.2
2,product_A,18.7
  • 编写demo代码

编写代码之前先在pom.xml中添加依赖:

<dependency><groupId>org.apache.flink</groupId><artifactId>flink-csv</artifactId><version>${flink.version}</version>
</dependency>
<dependency><groupId>org.apache.flink</groupId><artifactId>flink-json</artifactId><version>${flink.version}</version>
</dependency>

示例代码如下:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;public class FlinkSqlDemo {public static void main(String[] args) throws Exception {// 设置环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(1); //为了方便测试看效果,这里并行度设置为1// 使用EnvironmentSettings创建StreamTableEnvironment,明确设置为批处理模式EnvironmentSettings settings = EnvironmentSettings.newInstance().inBatchMode() // 设置为批处理模式,这样后续才能一次性的输出到csv中.build();StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);// 定义输入数据源String createSourceTableDdl = "CREATE TABLE csv_source (" +" user_id INT," +" product STRING," +" order_amount DOUBLE" +") WITH (" +" 'connector' = 'filesystem'," +" 'path' = 'file:///path/input.csv'," +" 'format' = 'csv'" +")";tableEnv.executeSql(createSourceTableDdl);//        // 编写 SQL 查询
//        String query = "SELECT user_id, SUM(order_amount) AS total_amount FROM csv_source GROUP BY user_id";
//        // 执行查询并打印
//        tableEnv.executeSql(query).print();
//        env.execute("Flink SQL Demo");// 定义输出数据源String createSinkTableDdl = "CREATE TABLE csv_sink (" +" user_id INT," +" total_amount DOUBLE" +") WITH (" +" 'connector' = 'filesystem'," +" 'path' = 'file:///path/output.csv'," +" 'format' = 'csv'" +")";tableEnv.executeSql(createSinkTableDdl);// 执行查询并将结果输出到csv_sinkString query = "INSERT INTO csv_sink " +"SELECT user_id, SUM(order_amount) as total_amount " +"FROM csv_source " +"GROUP BY user_id";tableEnv.executeSql(query);
//        env.execute("Flink SQL Job");}
}
  • 执行结果如下:

4、Flink SQL做流批统一

什么是流批统一?

流批统一是大数据处理领域的一个概念,它指的是使用一套代码来同时处理流数据(Streaming)和批数据(Batching)。

流处理和批处理的区别如下:

  1. 批处理(Batch Processing):
    • 批处理是指在某一时间点处理大量数据的手段。
    • 它通常涉及到对大量静止的(不再变化的)数据集进行一次性的处理。
    • 批处理作业通常在数据集完整可用后开始执行,并且经常是在数据仓库中进行。
    • 例如,一个电商平台可能在一天结束时运行一个批处理作业来处理当天所有的交易记录。
  2. 流处理(Stream Processing):
    • 流处理是指对数据实时进行处理,通常是数据生成或接收的同时立即进行。
    • 流处理适用于连续的数据输入,这些数据一直在变化,需要立即响应。
    • 例如,社交媒体平台在接收到新的帖子时,可能会实时分析这些帖子的内容和流行趋势。

在早期,流处理和批处理通常需要不同的系统来执行。对于批处理,可能使用如Hadoop这样的框架;而对于流处理,可能使用如Apache Storm这样的框架。这就导致开发者要同时学习多种框架才能处理不同类型的数据作业。

流批统一的概念,就是将这两种数据处理方式合并到一个平台中,这样一个系统既可以处理静止的大批量数据集,也可以处理实时的数据流。这样做的优点是显而易见的:

  • 统一的API:开发人员只需要学习和使用一套工具和API,可以共享更多的代码和逻辑。
  • 维护简便:只需维护一个系统,可以减少学习成本,减轻运维压力,减少故障点。
  • 灵活的数据处理:可以根据不同的业务需求灵活选择数据处理方式。

Flink SQL流批一体的实现原理

Flink很好的实现了流批统一,可以让开发人员用相同的方式来编写批处理和流处理程序。不论是对有界(批处理)还是无界(流处理)的数据源,Flink都可以使用相同的API和处理逻辑来处理数据。

Flink 通过内置的表抽象来实现流批一体,这里的"表"可以是动态变化的(例如,来自实时数据流的表)或是静态的(例如,存储在文件或数据库中的批量数据表)。Flink SQL引擎会根据数据的实际来源自动优化执行计划。

Flink SQL的流批统一核心在于三点:

  • 统一的API和SQL语义:Flink SQL提供一致的查询构建块(如窗口、时间处理函数),这些在流处理和批处理中语义一致,确保不同模式下行为的统一性。
  • 透明的状态处理:无论是流处理还是批处理,Flink都能够保持和恢复状态,为开发者提供一致的高容错性体验。
  • 多模态存储和处理能力:Flink SQL能够访问不同存储介质的数据,这意味着相同的SQL语句可以无缝在流数据和存储的批量数据上执行。

Flink SQL流批统一的代码示例

以下是一个完整的代码示例,用Flink来实现流批统一处理。Flink同时从Kafka 和 CSV读取数据,然后合并查询再输出结果:

  • 代码示例

代码中,先配置了Flink的流处理环境和表环境,然后用DDL语句在Flink中注册了Kafka和文件系统数据源。接着执行了一个SQL查询来合并来自这两种数据源的数据,并计算总金额。最后,打印出查询结果并开始执行Flink作业。

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;public class StreamBatchUnifiedDemo {public static void main(String[] args) throws Exception {// 设置流处理的环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().build();StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);// Kafka 流处理表String createKafkaSourceDDL = "CREATE TABLE kafka_stream_orders (" +"order_id STRING," +"amount DOUBLE)" +"WITH (" +"'connector' = 'kafka'," +"'topic' = 'topic_test'," +"'properties.bootstrap.servers' = '10.20.1.26:9092'," +"'format' = 'json'," +"'scan.startup.mode' = 'latest-offset'" +")";tableEnv.executeSql(createKafkaSourceDDL);// 文件系统批处理表String createFilesystemSourceDDL = "CREATE TABLE file_batch_orders (" +"order_id STRING," +"amount DOUBLE)" +"WITH (" +"'connector' = 'filesystem'," +"'path' = 'file:///Users/yclxiao/Project/bigdata/flink-blog/doc/input_order.csv'," +"'format' = 'csv'" +")";tableEnv.executeSql(createFilesystemSourceDDL);// 执行统一查询,计算总金额Table resultTable = tableEnv.sqlQuery("SELECT SUM(amount) FROM (" +"SELECT amount FROM kafka_stream_orders " +"UNION ALL " +"SELECT amount FROM file_batch_orders)");// 打印结果tableEnv.toRetractStream(resultTable, Row.class).print();// 开始执行程序env.execute("Stream-Batch Unified Job");}
}
  • 执行效果

通过以上示例代码,可以看出Flink SQL的流批一体设计:相同的SQL语句可以用在流处理和批处理中,而不需要做任何修改。Flink背后的执行引擎会自动根据数据的特性(流或者批)来进行相应的优化执行。

这就是Flink SQL非常强大的地方,它减少了开发者需要写不同代码逻辑的需求,简化了复杂的数据处理流程。

5、总结

Flink SQL是一个非常强大的数据处理工具,可以应对多种复杂的数据处理场景。

本文主要介绍了Flink SQL的基本原理、编码套路、流批统一,再结合正确的代码示例进行实践。希望对你有帮助。

完整代码地址:https://github.com/yclxiao/flink-blog

======>>>>>> 关于我 <<<<<<======

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/WqyCjiIMK49T6eDl_Upc1A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

读天才与算法:人脑与AI的数学思维笔记25_涌现理论

读天才与算法:人脑与AI的数学思维笔记25_涌现理论1. 人工智能新闻 1.1. 人工智能新闻报道算法的核心是如何将未经处理的原始数据转换成新闻报道 1.2. 很少有记者为美联社决定使用机器来帮助报道这些新闻持反对意见 1.2.1. 像“Wordsmith”这样的算法,具有自动化的洞察力、科学…

autoit au3 IT管理员使用指南(一)

简介 AutoIt 是一款完全免费的Windows自动化工具,支持各种 Windows 操作系统,可以用于自动运行基于GUI和非GUI程序,与系统进行交互,以及创建自定义的 GUI 窗体,完成各种自动化任务。 对我们IT管理员来说,什么办公自动化就算了,我们用的最多的其实是安装软件。曾到处收集…

SciTech-EE-数显智能-电烙铁+焊台热风拆焊台-4线发热芯

热风拆焊台的主要特点有什么?有什么好推荐的? 1、主要采用无刷式风机、脱离传统气泵式, 噪音极小、无须装风嘴直接吹焊! 2、有的款, 加装电源功能; 用途更广,专为修手机设计的。 3、四线发热芯:两粗线: 发热电阻丝(大概220V/70Ω, 110V/16Ω)电源线; 两细线(红+蓝-): 温…

在LCD屏幕上渐变显示sRGB所有范围颜色, 最大可渐变16,581,375种颜色

①能够自动获取开发板的LCD驱动参数, ②能够刷新屏幕为指定颜色(清屏) ③能够在LCD屏幕上自然地渐变显示颜色, 最大可渐变16,581,375种颜色, 可帧率, 显示时间, 颜色范围V1.0 2024/05/12 发布于博客园目录功能及原理函数Get_Screeninfo( )Clear_Screen( )Displays_GradientColo…

SciTech-EE-焊台热风拆焊台-

热风拆焊台的主要特点有什么?有什么好推荐的? 1、主要采用无刷式风机、脱离传统气泵式, 噪音极小、无须装风嘴直接吹焊! 2、有的款, 加装电源功能; 用途更广,专为修手机设计的。

平头哥芯片技术参数

平头哥芯片技术参数 800不露,光而不耀,高性能人工智能推理芯片 整体介绍架构特征特色技术软硬件协同行业应用 含光800 含光800是平头哥发布的首颗数据中心芯片。含光800是一颗高性能人工智能推理芯片,基于12nm工艺, 集成170亿晶体管,性能峰值算力达820 TOPS。 在业界标准的…

I2C

I2CI2C1. I2C是什么? 2. I2C总线的特点 3. 5种速率模式 3. I2C总线的硬件设计 4. I2C总线协议4.1. I2C总线术语的定义 4.2. 数据传输方式 4.3. 4种信号5. 总结 others参考链接:UM10204 I2C-bus specification and user manual Rev. 7.0 一文看懂I2C协议 - 王超的文章 - 知乎 …