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

Flink零基础入门,一篇吃透Flink核心概念+本地环境搭建+首个实战程序 前言在大数据领域离线计算看Hadoop实时计算看Flink几乎是行业共识。日常开发中用户行为日志、支付订单、直播弹幕、物联网设备数据都是源源不断产生的实时数据传统离线计算框架只能T1统计数据完全无法满足实时大屏、实时风控、实时推荐等业务需求。而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主流日常实时开发核心APITable 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 / JDK11Flink主流兼容版本Maven 3.6Mac/Linux/Windows均可4.2 下载安装Flink推荐使用1.18.x稳定版企业生产主流版本官网下载http://Downloads | Apache Flink解压安装包tar -zxvf flink-1.18.0-bin.tgz cd flink-1.18.04.3 启动本地单机集群start-cluster.sh启动成功后访问WebUIhttp://localhost:8081可以看到集群节点、可用资源、任务列表代表环境搭建成功停止集群命令stop-cluster.sh五、IDEA项目搭建 首个Flink实战程序WordCount我们用最经典的流式WordCount入门实现实时读取数据、分词、计数、输出结果。5.1 Maven核心依赖新建Maven项目引入Flink核心依赖统一版本1.18.0dependencies !-- Flink 流式计算核心依赖 -- dependency groupIdorg.apache.flink/groupId artifactIdflink-streaming-java/artifactId version1.18.0/version scopeprovided/scope /dependency !-- Flink 客户端依赖 -- dependency groupIdorg.apache.flink/groupId artifactIdflink-clients/artifactId version1.18.0/version scopeprovided/scope /dependency /dependencies5.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输入 DataStreamSourceString dataStreamSource env.socketTextStream(hadoop11, 8888); SingleOutputStreamOperatorString flattedMap dataStreamSource.flatMap(new FlatMapFunctionString, String() { Override public void flatMap(String line, CollectorString collector) throws Exception { String[] arr line.split( ); for (String word : arr) { collector.collect(word); } } }); SingleOutputStreamOperatorTuple2String, Integer map flattedMap.map(new MapFunctionString, Tuple2String, Integer() { Override public Tuple2String, Integer map(String word) throws Exception { return Tuple2.of(word, 1); } }); KeyedStreamTuple2String, Integer, String keyedStream map.keyBy(new KeySelectorTuple2String, Integer, String() { Override public String getKey(Tuple2String, Integer value) throws Exception { return value.f0; } }); SingleOutputStreamOperatorTuple2String, 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流式程序都遵循固定五步法获取流执行环境StreamExecutionEnvironment读取数据源文件、端口、Kafka、数据库数据转换处理flatMap、filter、keyBy、sum等数据输出打印、写入Kafka、MySQL、Hive触发任务执行env.execute()6.3 并行度机制并行度决定任务执行线程数可在三个层级设置代码级别env.setParallelism()优先级最高提交任务级别命令行指定并行度集群默认配置级别优先级最低七、Flink常见应用场景学完基础了解企业真实落地场景明确学习方向实时大屏电商实时销售额、实时UV、订单量统计实时风控金融刷单、盗刷、异常交易实时拦截实时推荐根据用户实时行为调整推荐内容实时数仓替代离线数仓实现秒级数据更新日志实时分析运维日志、业务日志实时监控告警物联网实时计算设备数据实时采集、清洗、统计八、新手避坑总结忘记execute()不写执行方法任务不会运行新手最高频错误并行度过高本地测试建议设置并行度为1避免输出日志混乱端口占用8888端口被占用可更换其他端口保证代码与监听端口一致版本不兼容依赖版本和集群版本必须统一否则报类找不到异常九、总结与后续学习路线本文我们从零入门Flink掌握了Flink核心定位、优势、批流一体思想集群核心组件架构与运行原理本地环境搭建、集群启停、WebUI使用完整流式WordCount实战掌握Flink编程五步法