Apache Flink三种作业模式详解:Zeppelin模式、Jar模式和SQL模式

后端 潘老师 4周前 (03-25) 21 ℃ (0) 扫码查看

今天咱就来聊聊Flink的三种常见作业模式:Zeppelin模式、Jar模式和SQL模式,帮大家搞清楚在啥时候该用哪种模式,提高开发效率和系统性能。

Zeppelin模式

模式特点

Zeppelin模式借助Apache Zeppelin这个交互式开发环境来实现。这环境牛在哪呢?它支持好几种语言,像Scala、PyFlink和SQL都不在话下。而且在Zeppelin Notebook里,用户能直接编写和执行Flink任务,不管是流式还是批处理SQL都能搞定,执行完还能可视化展示结果,操作起来特别直观。

适用场景

这种模式简直就是为数据分析师和业务人员量身打造的。比如数据分析师想快速探索数据,验证自己脑袋里突然冒出来的想法,或者做个初步分析,Zeppelin模式就能派上大用场。它的交互式开发体验和可视化结果展示,能让你快速看到处理数据的效果,就像在和数据“对话”一样。

示例代码

下面这段代码展示了在Zeppelin里用Flink SQL进行数据分析的过程。先创建两个表,一个是数据源表source_table,另一个是结果输出表sink_table,然后把数据源表的数据查询出来插入到结果表中。

-- 创建数据源表source_table,包含id和name字段,数据从指定路径的CSV文件读取
%flink.ssql
CREATE TABLE source_table (
    id INT,
    name STRING
) WITH (
    'connector.type' = 'filesystem',
    'format.type' = 'csv',
    'path' = '/path/to/data'
);
-- 创建结果输出表sink_table,结构和source_table类似,数据将输出到指定路径的CSV文件
CREATE TABLE sink_table (
    id INT,
    name STRING
) WITH (
    'connector.type' = 'filesystem',
    'format.type' = 'csv',
    'path' = '/path/to/output'
);
-- 将source_table中的数据查询出来插入到sink_table中
INSERT INTO sink_table
SELECT id, name FROM source_table;

Jar模式:生产环境的“靠谱伙伴”

模式特点

Jar模式和Zeppelin模式不太一样,它得把Flink应用程序打包成Jar文件,然后通过命令行或者其他工具提交到集群去执行。这种模式的好处是灵活性超高,控制力也强,特别适合处理复杂的流处理和批处理任务。而且它支持好多部署模式,像YARN和Kubernetes都能行,在大规模集群中也能稳定运行。

适用场景

生产环境里,要是任务比较复杂,对自定义和优化的要求比较高,Jar模式就再合适不过了。比如说,业务场景很复杂,需要对数据处理过程进行深度定制,那Jar模式就能满足这种需求。而且在大规模部署的情况下,它也能轻松应对大量数据和高并发请求,保证系统稳定运行。

示例代码

下面这段Java代码实现了一个简单的Flink流处理任务。从指定的Socket端口读取数据,把每行数据映射成Tuple2类型,再按照第一个字段进行分组,统计每个分组中数据的数量,最后打印结果。

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
// 简单的Flink作业类
public class SimpleFlinkJob {
    public static void main(String[] args) throws Exception {
        // 获取流执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 从Socket获取输入流,监听localhost的9999端口
        DataStream<String> text = env.addSource(new SocketTextStreamFunction("localhost", 9999));
        // 对输入数据进行处理,映射成Tuple2类型,第一个字段是原数据,第二个字段是数量1
        DataStream<Tuple2<String, Integer>> counts = text
            .map(new MapFunction<String, Tuple2<String, Integer>>() {
                @Override
                public Tuple2<String, Integer> map(String value) throws Exception {
                    return new Tuple2<>(value, 1);
                }
            })
            // 按照Tuple2的第一个字段进行分组
            .keyBy(0)
            // 对分组后的数据,按照第二个字段进行求和,统计每个分组的数据数量
            .sum(1);
        // 打印统计结果
        counts.print();
        // 执行作业
        env.execute();
    }
}

SQL模式:快速开发的“利器”

模式特点

SQL模式主要靠Flink SQL来处理数据,它最大的优点就是提供了统一的批处理和流处理语义,这意味着不管是处理批量数据还是实时数据,用的都是一套逻辑,学习成本低。而且这种模式特别容易上手,维护起来也方便,对开发速度要求高的项目来说再合适不过了。

适用场景

如果你需要快速开发一个数据处理任务,或者做数据分析、ETL(抽取、转换、加载)工作,SQL模式就很靠谱。尤其是在实时数据分析、统计计算和报表生成这些场景里,它能发挥出很大的优势,快速实现功能。

示例代码

下面这段Flink SQL代码实现了实时数据统计功能。先创建一个从Kafka主题读取数据的源表source_table,再创建一个将统计结果写入MySQL数据库的目标表sink_table,然后对源表数据进行分组统计,把结果插入到目标表中。

-- 创建源表source_table,从Kafka主题my_topic读取数据,增加一个表示处理时间的字段ts
%flink.ssql
CREATE TABLE source_table (
    id INT,
    name STRING,
    ts AS PROCTIME()
) WITH (
    'connector.type' = 'kafka',
    'topic' ='my_topic',
    'properties.bootstrap.servers' = 'localhost:9092'
);
-- 创建目标表sink_table,用于存储统计结果,数据将写入MySQL数据库的指定表
CREATE TABLE sink_table (
    id INT,
    name STRING,
    count INT
) WITH (
    'connector.type' = 'jdbc',
    'url' = 'jdbc:mysql://localhost:3306/mydb',
    'username' = 'user',
    'password' = 'password',
    'table-name' ='my_table'
);
-- 对source_table中的数据按照id和name分组,统计每组数据的数量,并插入到sink_table中
INSERT INTO sink_table
SELECT id, name, COUNT(*) AS count
FROM source_table
GROUP BY id, name;

Apache Flink的这三种作业模式各有千秋。Zeppelin模式适合交互式开发和快速测试;Jar模式在生产环境和复杂任务处理方面表现出色;SQL模式则是快速开发和数据分析的好帮手。大家在实际开发过程中,根据具体需求选择合适的模式,才能把Flink的能力发挥到极致!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/16309.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】