当前位置: 首页 > news >正文

Flink零基础入门,一篇吃透Flink核心概念+本地环境搭建+首个实战程序

前言

在大数据领域,离线计算看Hadoop,实时计算看Flink几乎是行业共识。

日常开发中,用户行为日志、支付订单、直播弹幕、物联网设备数据都是源源不断产生的实时数据,传统离线计算框架只能T+1统计数据,完全无法满足实时大屏、实时风控、实时推荐等业务需求。

Apache Flink作为当下最主流的分布式实时流处理框架,凭借低延迟、高吞吐、 Exactly-Once 精准一次性语义、支持批流一体等优势,已成为互联网、金融、物流行业实时数仓的核心技术。


一、Flink是什么?通俗理解

官方定义:Apache Flink 是一个分布式、高性能、实时的批流统一计算框架,用于对无界(实时流)和有界(离线批)数据流进行状态化计算。

1.1 通俗类比

  • 离线计算(Hadoop/Spark Batch):像水库蓄水,攒够一天/一小时数据,统一放水统计,延迟高、实时性差

  • 实时计算(Flink):像河流流水,数据来一条处理一条,秒级响应,实时性极强

1.2 核心定位:批流一体

Flink 打破了批处理和流处理的边界:流是本质,批是流的特例

  • 无界流(实时):用户行为、订单数据、设备日志,持续不断产生

  • 有界流(离线):历史文件、批量日志,数据有起始和结束


二、Flink 核心优势

2.1 低延迟、高吞吐

基于增量流式计算,数据秒级处理,支持高并发海量数据写入,远超Spark Streaming微批延迟。

2.2 精准一次性语义(Exactly-Once)

这是Flink最核心的杀手锏!通过状态+检查点(Checkpoint)机制,保证数据不丢、不重,金融、支付等对数据一致性要求极高的场景首选。

2.3 天然支持状态计算

支持窗口计算、聚合统计、累计计算等带状态业务,比如统计当日UV、实时销售额、累计访问量。

2.4 丰富的分层API

从底层到高层全覆盖,适配不同开发场景:

  • Process API(底层):极致灵活,自定义复杂逻辑

  • DataStream API(主流):日常实时开发核心API

  • Table API & Flink SQL(高层):类SQL开发,上手简单、效率高

2.5 高可用、容错性强

故障自动重启、状态自动恢复,7*24小时稳定运行,适配生产环境。


三、Flink 核心架构与组件

Flink 分布式架构主要分为四大核心组件,理解这部分就能看懂Flink运行机制。

3.1 JobManager(管理者)

  • 集群核心调度中心,全局唯一主节点

  • 负责接收任务、解析任务、生成执行计划、分配资源、故障恢复

  • 相当于团队的项目经理,负责统筹调度

3.2 TaskManager(工作者)

  • 集群工作节点,多节点部署

  • 负责真正执行计算任务、缓存数据、维护状态

  • 相当于团队的开发人员,负责具体干活

  • 核心概念:Slot(任务槽),是TaskManager的资源最小单位,决定并行度

3.3 Client(客户端)

负责提交任务到Flink集群,任务提交后不参与运行,仅负责提交和参数解析。

3.4 WebUI(可视化监控)

默认端口8081,可实时查看集群状态、任务运行情况、资源占用、日志、报错信息,调试必备。


四、本地环境搭建

4.1 前置环境

  • JDK 8 / JDK11(Flink主流兼容版本)

  • Maven 3.6+

  • Mac/Linux/Windows均可

4.2 下载安装Flink

推荐使用1.18.x稳定版(企业生产主流版本)

官网下载:http://Downloads | Apache Flink

解压安装包:

tar -zxvf flink-1.18.0-bin.tgz cd flink-1.18.0

4.3 启动本地单机集群

start-cluster.sh

启动成功后,访问WebUI:http://localhost:8081

可以看到集群节点、可用资源、任务列表,代表环境搭建成功!

停止集群命令:

stop-cluster.sh

五、IDEA项目搭建 + 首个Flink实战程序(WordCount)

我们用最经典的流式WordCount入门,实现:实时读取数据、分词、计数、输出结果。

5.1 Maven核心依赖

新建Maven项目,引入Flink核心依赖(统一版本1.18.0)

<dependencies> <!-- Flink 流式计算核心依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> <!-- Flink 客户端依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> </dependencies>

5.2 完整实战代码(可直接运行)

本地流式WordCount,监听端口数据,实时统计单词次数

package com.bigdata.day01; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.KeyedStream; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; public class SocketDemo02 { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 监听linux上的socket输入 DataStreamSource<String> dataStreamSource = env.socketTextStream("hadoop11", 8888); SingleOutputStreamOperator<String> flattedMap = dataStreamSource.flatMap(new FlatMapFunction<String, String>() { @Override public void flatMap(String line, Collector<String> collector) throws Exception { String[] arr = line.split(" "); for (String word : arr) { collector.collect(word); } } }); SingleOutputStreamOperator<Tuple2<String, Integer>> map = flattedMap.map(new MapFunction<String, Tuple2<String, Integer>>() { @Override public Tuple2<String, Integer> map(String word) throws Exception { return Tuple2.of(word, 1); } }); KeyedStream<Tuple2<String, Integer>, String> keyedStream = map.keyBy(new KeySelector<Tuple2<String, Integer>, String>() { @Override public String getKey(Tuple2<String, Integer> value) throws Exception { return value.f0; } }); SingleOutputStreamOperator<Tuple2<String, Integer>> sum = keyedStream.sum(1); sum.print(); env.execute(); } }

5.3 运行测试步骤

第一步:开启端口监听

新开终端,启动8888端口数据流:

nc -lk 8888

第二步:运行Java程序

启动FlinkWordCount主类,程序会持续监听端口。

第三步:输入测试数据

在nc终端输入内容:

flink java flink bigdata java flink

第四步:查看控制台实时统计结果

可以看到数据实时累加,每输入一行,实时更新统计结果,真正实现来一条处理一条


六、Flink核心运行机制(新手必懂)

6.1 惰性执行机制

Flink所有转换操作都是懒加载,代码执行到env.execute()才会真正触发任务运行,前面只是构建执行拓扑图。

6.2 编程通用流程

所有Flink流式程序,都遵循固定五步法:

  1. 获取流执行环境StreamExecutionEnvironment

  2. 读取数据源(文件、端口、Kafka、数据库)

  3. 数据转换处理(flatMap、filter、keyBy、sum等)

  4. 数据输出(打印、写入Kafka、MySQL、Hive)

  5. 触发任务执行env.execute()

6.3 并行度机制

并行度决定任务执行线程数,可在三个层级设置:


七、Flink常见应用场景

学完基础,了解企业真实落地场景,明确学习方向:


八、新手避坑总结


九、总结与后续学习路线

本文我们从零入门Flink,掌握了:

  1. Flink核心定位、优势、批流一体思想

  2. 集群核心组件架构与运行原理

  3. 本地环境搭建、集群启停、WebUI使用

  4. 完整流式WordCount实战,掌握Flink编程五步法

http://www.jsqmd.com/news/943173/

相关文章:

  • 免费小说资源终极指南:开源书源助你告别书荒
  • 郑州装修公司推荐|2026年6月 避坑必看!本土靠谱装修怎么选,这 8 大雷区千万别踩 - 博客万
  • Spring个人知识体系总结
  • 2026年PDF转Word免费详细教程:无需注册的在线工具和小程序推荐 - AI测评专家
  • 四川高校科技成果转化如何避坑?从技术评估到交易撮合的深度解构
  • 如何快速优化AI输入:Jina Reader智能网页转换工具完全指南
  • 云尖信息与杭州电子科技大学共建就业实习基地,深度赋能产教融合新生态
  • Matlab纯代码实现CVRP遗传算法求解:含路径可视化与参数自定义
  • 颠覆性抖音内容管理革命:douyin-downloader让你的创作效率提升300%
  • 贵阳花溪区创源靠谱吗?2026年6月聚焦铝车身冰雹坑专修工艺,深挖原厂漆无损精修硬核实力 - 十大排行榜推荐
  • 2026 南京钻石回收怎么选?梳理靠谱钻石回收渠道 - 薛定谔的梨花猫
  • Libre Barcode革命:让条码生成像打字一样简单的终极解决方案
  • 实测对比:用vLLM直接推理LoRA微调后的模型,比LLaMA-Factory的API部署快5倍
  • 基于Arduino与步进电机的自动喂食机DIY:从原理到实践
  • 北京西装定制权威指南:2024年5家顶级店铺专业测评 - 西装爱好者
  • 大模型也要翻资料:一篇读懂 RAG 检索增强生成
  • Windows 11系统优化终极指南:用开源工具Win11Debloat重获清爽体验
  • 海外直播拍卖订单履约难点:跨境链路协同与流程优化
  • 机器人仿真技术解析:Gazebo Sim 开源仿真平台深度剖析
  • 用剪映做短视频,别死磕基础操作,选对工具和素材,真的能少走 90% 的弯路
  • VisionPro棋盘格校准工具CogCalibCheckerboardTool保姆级教程:从选板到实战测量
  • 干货合集:2026年最值得信赖的专业AI论文平台
  • 多模态不再是口号:Gemini 3.5 原生多模态能力的落地价值解析
  • 私有化音视频系统/视频高清直播点播EasyDSS重塑企业视频门户新生态
  • 【上饶 + 闲置金银变现 + 靠谱回收门店五强榜单】 - 余生黄金回收
  • Python抓取抖音评论的3种方案(2026版)
  • 欢迎来到英飞凌TC3XX芯片的世界
  • 如何快速降低电脑噪音:FanControl风扇控制终极指南
  • 企业级项目管理系统Leantime的生产环境部署架构设计
  • 建议收藏|2026年必备一键生成论文工具榜单,免费生成高质初稿无忧