穿过你的黑发的眼的我 發表於 2025-6-27 17:22:00

Flink-JAVA开发.01-搭建简单的开发环境

<p>Flink算得上是大数据领域比较优秀的一个工具。</p>
<p>它已经被收归于阿帕奇基金会之下。</p>
<p>本文简介适用于开发的环境,不面向生产。</p>
<h1>一、Flink简介</h1>
<h3>注:以下内容由edge的Copilot生成,本人稍微整理。</h3>
<h3>🧬 Flink 的起源与发展</h3>
<p>Apache Flink 起源于 2009 年德国柏林工业大学的一个研究项目 <strong>Stratosphere</strong>,这是一个由德国研究基金会资助的分布式数据处理平台研究计划。2014 年,该项目正式捐赠给 Apache 基金会,并更名为 <strong>Flink</strong>,在德语中意为“敏捷、快速”。</p>
<ul class="relative list-outside marker:text-foreground-750 dark:marker:text-foreground-600 flex flex-col ms-4 px-1">
<li>
<p><strong>2014 年 3 月</strong>:成为 Apache 孵化器项目</p>
</li>
<li>
<p><strong>2014 年 12 月</strong>:晋升为 Apache 顶级项目</p>
</li>
<li>
<p><strong>2015 年起</strong>:阿里巴巴大规模采用 Flink,并基于其开发了内部版本 <strong>Blink</strong></p>
</li>
<li>
<p><strong>2019 年</strong>:阿里将 Blink 开源并合并入 Flink 主干,极大增强了 Flink 的 SQL 能力和性能</p>
</li>
</ul>
<div class="relative pb-6 w-full after:border-b after:border-stroke-300 after:w-full after:absolute after:mt-3">&nbsp;</div>
<h3>🚀 Flink 的核心特性</h3>
<p>Apache Flink 是一个<strong>统一的流处理与批处理引擎</strong>,具备以下关键能力:</p>
<ol start="1">
<li>
<p><strong>原生流处理(Stream-first)</strong>:Flink 从设计之初就是为流处理而生,支持无界数据流的低延迟处理。</p>
</li>
<li>
<p><strong>批流统一(Unified Runtime)</strong>:通过同一套 API 和执行引擎处理批数据和流数据,简化开发。</p>
</li>
<li>
<p><strong>事件时间与乱序处理</strong>:支持事件时间语义(Event Time)和 Watermark 机制,能处理乱序数据。</p>
</li>
<li>
<p><strong>状态管理(Stateful Processing)</strong>:支持大规模有状态计算,状态可持久化并容错。</p>
</li>
<li>
<p><strong>Exactly-once 语义</strong>:通过 Checkpoint 和 Savepoint 实现端到端精确一次处理。</p>
</li>
<li>
<p><strong>高可扩展性与容错性</strong>:支持大规模分布式部署,自动恢复失败任务。</p>
</li>
<li>
<p><strong>多语言支持</strong>:支持 Java、Scala、Python、SQL 等多种语言。</p>
</li>
<li>
<p><strong>丰富的连接器生态</strong>:内置 Kafka、MySQL、HDFS、Elasticsearch、Pulsar 等连接器。</p>
</li>
</ol>
<div>&nbsp;</div>
<h3>🌐 Flink 的生态与应用场景</h3>
<p>Flink 已成为全球范围内<strong>实时数据处理的事实标准</strong>,广泛应用于:</p>
<ul>
<li>
<p>实时数据仓库(如阿里巴巴的实时数仓)</p>
</li>
<li>
<p>实时监控与告警系统</p>
</li>
<li>
<p>实时推荐与个性化服务</p>
</li>
<li>
<p>实时 ETL 与数据集成(如 Flink CDC)</p>
</li>
<li>
<p>IoT 数据流处理</p>
</li>
<li>
<p>金融风控与交易监控</p>
</li>
</ul>
<p>此外,Flink 还衍生出多个子项目,如:</p>
<ul>
<li>
<p><strong>Flink Table API / SQL</strong>:用于声明式流批一体开发</p>
</li>
<li>
<p><strong>Flink CDC</strong>:用于实时数据同步</p>
</li>
<li>
<p><strong>Apache Paimon</strong>(原 Flink Table Store):构建流式数据湖的关键组件</p>
</li>
</ul>
<div class="relative pb-6 w-full after:border-b after:border-stroke-300 after:w-full after:absolute after:mt-3">&nbsp;</div>
<h3>🧭 当前与未来</h3>
<p>截至 2025 年,Flink 已发布至 <strong>2.0.0</strong> 版本,标志着其架构进入新阶段。</p>
<p>Flink 2.0 引入了更强的云原生能力(如状态存储分离)、更灵活的调度机制,以及更统一的流批语义,进一步巩固了其在实时计算领域的领先地位。</p>
<p>&nbsp;</p>
<h1>二、为什么选择Flink</h1>
<p>公司做了不少政企项目,有不少还有IOT的数据处理,例如收集消防栓、手表、各种监测芯片的数据。</p>
<p>虽然数据不算特别大,但是普遍都需要一个实时监控的功能。</p>
<p>&nbsp;</p>
<p>比较久以前都比较傻瓜:数据先入库,然后再通过websocket或者restapi提供给前端。如果需要做一些其它计算,就更慢了。</p>
<p>但是那种方式有较大的局限性:数据不能太多,及时性不能太高,编码较多。</p>
<p>最大的问题是及时性在某些场景中差强人意,或者不太好满足。</p>
<p>&nbsp;</p>
<p><strong>所以,如果有一个工具,可以解决这些不是很好?</strong></p>
<p>自行基于netty等net框架开发,行不行? 可以,但是必要性不充分,为什么现成的不用了?</p>
<p>&nbsp;</p>
<p>Flink在绝大部分场景下都能完美解决这些问题:</p>
<p>1.支持流计算,支持实时计算</p>
<p>2.支持动态扩展</p>
<p>3.支持java语言</p>
<p>4.java编写,支持各种操作系统,包括国产化</p>
<p>此外它支持流批一体。</p>
<p>&nbsp;</p>
<p>再看看Flink和其它类似框架的比较。</p>
<h2>比较</h2>
<div>
<h1>📊 <span style="font-size: 14px">Apache Flink 与其他主流大数据处理框架对比(多维度)</span></h1>
<table>
<thead>
<tr>
<th>维度</th>
<th>Apache Flink</th>
<th>Apache Spark</th>
<th>Apache Storm</th>
<th>Kafka Streams</th>
<th>Google Dataflow</th>
</tr>
</thead>
<tbody>
<tr>
<td>处理模型</td>
<td>原生流处理,支持批处理(<span style="color: rgba(224, 62, 45, 1)">流批统一</span>)</td>
<td>批处理为主,支持微批流处理</td>
<td>原生流处理</td>
<td>原生流处理,依赖 Kafka</td>
<td>流批统一(Beam 模型)</td>
</tr>
<tr>
<td>延迟表现</td>
<td>毫秒级低延迟</td>
<td>秒级延迟(微批)</td>
<td>毫秒级</td>
<td>毫秒级</td>
<td>毫秒级</td>
</tr>
<tr>
<td>吞吐能力</td>
<td>高吞吐,适合大规模数据流</td>
<td>高吞吐,适合批量计算</td>
<td>中等吞吐</td>
<td>中等吞吐</td>
<td>高吞吐</td>
</tr>
<tr>
<td>状态管理</td>
<td>内建强状态管理(支持 RocksDB)</td>
<td>状态管理较弱</td>
<td>无内建状态</td>
<td>内存状态轻量支持</td>
<td>支持(Beam State API)</td>
</tr>
<tr>
<td>容错机制</td>
<td>Exactly-once,基于 Checkpoint</td>
<td>Exactly-once(Structured Streaming)</td>
<td>At-least-once</td>
<td>At-least-once</td>
<td>Exactly-once</td>
</tr>
<tr>
<td>事件时间支持</td>
<td>✅ 强 Watermark + EventTime 语义</td>
<td>✅ 支持事件时间(逻辑复杂)</td>
<td>❌ 无事件时间</td>
<td>❌ 无事件时间</td>
<td>✅ 原生支持</td>
</tr>
<tr>
<td>窗口机制</td>
<td>支持滚动/滑动/会话/自定义窗口</td>
<td>支持滚动、滑动窗口</td>
<td>基础窗口支持</td>
<td>滚动/滑动窗口</td>
<td>多种窗口类型</td>
</tr>
<tr>
<td>开发语言支持</td>
<td>Java、Scala、Python、SQL</td>
<td>Java、Scala、Python、R、SQL</td>
<td>Java、Clojure</td>
<td>Java、Scala</td>
<td>Java、Python、Go</td>
</tr>
<tr>
<td>部署复杂度</td>
<td>中等(需 JobManager、TaskManager)</td>
<td>中等(需 Spark 集群)</td>
<td>简单(轻量部署)</td>
<td>嵌入式部署</td>
<td>云端托管(GCP)</td>
</tr>
<tr>
<td>生态系统</td>
<td>Flink SQL、CDC、Paimon、StateFun</td>
<td>Spark SQL、MLlib、GraphX</td>
<td>组件稀缺</td>
<td>Kafka 紧耦合组件</td>
<td>GCP 生态紧密集成</td>
</tr>
<tr>
<td>适用场景</td>
<td><strong><span style="color: rgba(224, 62, 45, 1)">实时数仓</span></strong>、金融风控、<span style="color: rgba(224, 62, 45, 1)"><strong>IoT</strong></span>、CEP</td>
<td>离线分析、批处理、ML</td>
<td>日志监控、低延迟计算</td>
<td>Kafka 应用中的轻量流逻辑</td>
<td>云原生数据流 ETL</td>
</tr>
</tbody>
</table>
<h2>✨ 总结亮点</h2>
<ul>
<li><strong>Apache Flink</strong>:流处理能力领先,强状态支持、精确一次语义,适用于实时分析与复杂计算。</li>
<li><strong>Apache Spark</strong>:批处理标杆,适用于海量离线任务与大数据建模。</li>
<li><strong>Apache Storm</strong>:超低延迟,但功能较轻,不适合复杂数据流场景。</li>
<li><strong>Kafka Streams</strong>:适合 Kafka 消费端的轻流计算,部署简易。</li>
<li><strong>Google Dataflow</strong>:云原生、简洁强大,适合全托管数据管道。</li>
</ul>
<p>&nbsp;</p>
<div>
<h1>三、搭建简单开发环境</h1>
<p>需要注意是,虽然2.0版本已经可用,但Flink对1.20.x的支持是长期的。</p>
<p>搭建一个用于开发的,相对简单一些。</p>
<p>有两种方案可以选择:</p>
<p>1.不装Flink&nbsp; -- 即使没有Flink服务器,也能利用本地的mini集群做一些基本的开发测试。但是其它的作业管理、提交作业比较难搞</p>
<p>2.装Flink -&nbsp; 可以体会类似生产环境的性能、并发、并能够比较直观地提交和管理作业</p>
<p>我选择安装Flink,虽然初期很长一段时间根本就没有用。</p>
<h2>3.1、在centos上安装Flink单机</h2>
<div>
<div>参考资料:</div>
<div>https://nightlies.apache.org/flink/flink-docs-release-2.0/zh/</div>
<div>&nbsp;</div>
<h3>1.创建一个flink用户</h3>
<div>并创建两个目录,只有flink用户有权限访问。直接用root安装也可以</div>
<h3>2.安装jdk17</h3>
<div>设置JAVA_HOME变量.具体略</div>
<h3>3.修改配置</h3>
<div>Flink解压后,在conf目录下有问文件:</div>
<div><img data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627164431042-221394626.png" class="lazyload"></div>
<div>主要修改那个config.yaml即可。</div>
<div>通常修改三个地方即可:</div>
<div><strong>JAVA_HOME</strong></div>
<div><img data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627164724226-49936638.png" class="lazyload"></div>
<div>注意这个opts部分的设置,如果你在本地启动需要参考这个。</div>
<div>&nbsp;</div>
<div><strong>jobmanager</strong></div>
<div><img data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627164824829-588779064.png" class="lazyload"></div>
<div>bind-host:指定了可以访问的客户机</div>
<div>port:指定了对外的端口</div>
<div>&nbsp;</div>
<div><strong>rest客户端</strong></div>
<div><img data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627164920729-223976480.png" class="lazyload"></div>
<div>&nbsp;</div>
<div>Flink默认在服务端使用log4j作为日志,毕竟是服务端。&nbsp; 如果要修改也可以在这里指定Log4j的配置。</div>
<div>&nbsp;</div>
<h3>4、启动和停止</h3>
<p>bin目录下:</p>
<p><img data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627170007732-247585217.png" class="lazyload"></p>
<div>启动和停止很简单,不要带参数</div>
<div>例如启动: ./start-cluster.sh</div>
<div>如果成功,则可以通过浏览器访问管理客户端:</div>
<div><img height="437" width="675" data-src="https://img2024.cnblogs.com/blog/1177268/202506/1177268-20250627170244354-1863715790.png" class="lazyload"></div>
<div>注意:这个仅仅是开发环境,如果生产环境是万万不能没有认证的。</div>
<div>&nbsp;</div>
<h3>5.测试</h3>
<p>本地模式安装 | Apache Flink</p>
<p>这里主要测试直接通过flink命令提交作业:</p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted" tabindex="0"><code>$ ./bin/flink run examples/streaming/WordCount.jar</code></pre>
<div>&nbsp;</div>
</div>
<h2>3.2、创建一个Springboot工程</h2>
<p>使用ide创建一个jdk17,springboot3.x的项目具体略 。</p>
<p>为了测试Flink的批处理和流处理,有必要搭建一些其它环境:</p>
<p>a.一个rdbms,例如mysql,postgresql等都可以</p>
<p>b.一个mqtt服务服务器,也可以考虑使用amqp服务器。我则选择安装了apache的artemis. artemis支持mqtt,amqp,stomp等协议。</p>
<p>artermis有个优点,小巧,容易装,资料齐全,而且artemis本身是完全使用java编写的,意味着可以在各种环境运行,自然包括国产环境。</p>
<p>以上两个安装略。</p>
<p>&nbsp;</p>
<p>这里列出可以参考的pom.xml配置:</p>
<pre class="highlighter-prismjs language-xml prismjs-lines-highlighted" tabindex="0"><code>&lt;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 https://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
        &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
        &lt;groupId&gt;org.lzfto.flink&lt;/groupId&gt;
        &lt;artifactId&gt;learn-flink-spring&lt;/artifactId&gt;
        &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
        &lt;name&gt;learn-flink&lt;/name&gt;
        &lt;properties&gt;
                &lt;lzfto.flinktest.version&gt;0.0.1-SNAPSHOT&lt;/lzfto.flinktest.version&gt;
                &lt;java.version&gt;17&lt;/java.version&gt;
                &lt;!--Spring boot --&gt;
                &lt;spring.boot.version&gt;3.4.7&lt;/spring.boot.version&gt;
                &lt;flink.version&gt;1.20.0&lt;/flink.version&gt;
                &lt;flink-connector.jdbc.version&gt;3.3.0-1.20&lt;/flink-connector.jdbc.version&gt;
                &lt;mysql-version&gt;8.0.33&lt;/mysql-version&gt;
                &lt;mysql-j-version&gt;9.3.0&lt;/mysql-j-version&gt;
                &lt;apache-poi-version&gt;5.4.1&lt;/apache-poi-version&gt;
                &lt;alibaba-fastjson-version&gt;2.0.57&lt;/alibaba-fastjson-version&gt;
                &lt;!-- mqtt --&gt;
                &lt;mqtt-client.version&gt;6.5.0&lt;/mqtt-client.version&gt;

                &lt;!-- maven 等 --&gt;
                &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
                &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;
        &lt;/properties&gt;
        &lt;dependencyManagement&gt;
                &lt;dependencies&gt;
                        &lt;!-- SpringBoot的依赖配置 --&gt;
                        &lt;dependency&gt;
                                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                                &lt;artifactId&gt;spring-boot-dependencies&lt;/artifactId&gt;
                                &lt;version&gt;${spring.boot.version}&lt;/version&gt;
                                &lt;type&gt;pom&lt;/type&gt;
                                &lt;scope&gt;import&lt;/scope&gt;
                        &lt;/dependency&gt;
                &lt;/dependencies&gt;
        &lt;/dependencyManagement&gt;
        &lt;dependencies&gt;
                &lt;!-- Spring Boot Starter Web --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-starter-jdbc&lt;/artifactId&gt;
                        &lt;!--&lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt; --&gt;
                &lt;/dependency&gt;
                &lt;!-- websocket --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-starter-websocket&lt;/artifactId&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;
                &lt;/dependency&gt;

                &lt;!-- Original Flink Dependencies --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-core&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-streaming-java&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-table-api-java&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;!--&lt;scope&gt;provided&lt;/scope&gt; --&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
                &lt;!-- tableapi 桥接器,主要和DataStream进行对接 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-table-api-java-bridge&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;!--&lt;scope&gt;provided&lt;/scope&gt; --&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;

                &lt;!-- ide调试 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-table-planner-loader&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;!--&lt;scope&gt;provided&lt;/scope&gt; --&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-table-runtime&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
               
                &lt;dependency&gt;
                  &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                  &lt;artifactId&gt;flink-test-utils&lt;/artifactId&gt;
                  &lt;version&gt;${flink.version}&lt;/version&gt;
                &lt;/dependency&gt;


                &lt;!-- 连接器 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-connector-files&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-csv&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-connector-jdbc&lt;/artifactId&gt;
                        &lt;version&gt;${flink-connector.jdbc.version}&lt;/version&gt;
                &lt;/dependency&gt;

                &lt;!-- 执行工厂定义 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.flink&lt;/groupId&gt;
                        &lt;artifactId&gt;flink-clients&lt;/artifactId&gt;
                        &lt;version&gt;${flink.version}&lt;/version&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                                        &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;

                &lt;!-- 数据库连接 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;mysql&lt;/groupId&gt;
                        &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
                        &lt;version&gt;${mysql-version}&lt;/version&gt;
                &lt;/dependency&gt;

                &lt;!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;com.alibaba.fastjson2&lt;/groupId&gt;
                        &lt;artifactId&gt;fastjson2&lt;/artifactId&gt;
                        &lt;version&gt;${alibaba-fastjson-version}&lt;/version&gt;
                &lt;/dependency&gt;

                &lt;!-- mqtt --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.integration&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-integration-mqtt&lt;/artifactId&gt;
                &lt;/dependency&gt;
                &lt;!-- apache poi 操作excel --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;
                        &lt;artifactId&gt;poi&lt;/artifactId&gt;
                        &lt;version&gt;${apache-poi-version}&lt;/version&gt; &lt;!-- 请检查最新版本 --&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;
                        &lt;artifactId&gt;poi-ooxml&lt;/artifactId&gt;
                        &lt;version&gt;${apache-poi-version}&lt;/version&gt; &lt;!-- 请检查最新版本 --&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-configuration-processor&lt;/artifactId&gt;
                        &lt;optional&gt;true&lt;/optional&gt;
                &lt;/dependency&gt;

                &lt;!-- 测试依赖 --&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
                        &lt;scope&gt;test&lt;/scope&gt;
                        &lt;exclusions&gt;
                                &lt;exclusion&gt;
                                        &lt;groupId&gt;org.junit.vintage&lt;/groupId&gt;
                                        &lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt;
                                &lt;/exclusion&gt;
                        &lt;/exclusions&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
                        &lt;artifactId&gt;junit-jupiter-api&lt;/artifactId&gt;
                        &lt;scope&gt;test&lt;/scope&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                        &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
                        &lt;artifactId&gt;junit-jupiter-engine&lt;/artifactId&gt;
                        &lt;scope&gt;test&lt;/scope&gt;
                &lt;/dependency&gt;

        &lt;/dependencies&gt;
        &lt;build&gt;
                &lt;plugins&gt;
                        &lt;plugin&gt;
                                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                                &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
                                &lt;version&gt;3.13.0&lt;/version&gt;
                                &lt;configuration&gt;
                                        &lt;source&gt;${java.version}&lt;/source&gt;
                                        &lt;target&gt;${java.version}&lt;/target&gt;
                                        &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;
                                        &lt;parameters&gt;true&lt;/parameters&gt;
                                &lt;/configuration&gt;
                        &lt;/plugin&gt;
                        &lt;plugin&gt;
                                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                                &lt;artifactId&gt;maven-shade-plugin&lt;/artifactId&gt;
                                &lt;version&gt;3.6.0&lt;/version&gt;
                                &lt;executions&gt;
                                        &lt;!-- Run shade goal on package phase --&gt;
                                        &lt;execution&gt;
                                                &lt;phase&gt;package&lt;/phase&gt;
                                                &lt;goals&gt;
                                                        &lt;goal&gt;shade&lt;/goal&gt;
                                                &lt;/goals&gt;
                                                &lt;configuration&gt;
                                                        &lt;artifactSet&gt;
                                                                &lt;!-- 如果想排除一些包 --&gt;
                                                                &lt;excludes&gt;
                                                                        &lt;!--&lt;exclude&gt;org.apache.flink:force-shading&lt;/exclude&gt; --&gt;
                                                                        &lt;exclude&gt;com.google.code.findbugs:jsr305&lt;/exclude&gt;
                                                                &lt;/excludes&gt;
                                                        &lt;/artifactSet&gt;
                                                        &lt;filters&gt;
                                                                &lt;filter&gt;
                                                                        &lt;!-- Do not copy the signatures in the META-INF folder. Otherwise,
                                                                                this might cause SecurityExceptions when using the JAR. --&gt;
                                                                        &lt;artifact&gt;*:*&lt;/artifact&gt;
                                                                        &lt;excludes&gt;
                                                                                &lt;exclude&gt;META-INF/*.SF&lt;/exclude&gt;
                                                                                &lt;exclude&gt;META-INF/*.DSA&lt;/exclude&gt;
                                                                                &lt;exclude&gt;META-INF/*.RSA&lt;/exclude&gt;
                                                                        &lt;/excludes&gt;
                                                                &lt;/filter&gt;
                                                        &lt;/filters&gt;
                                                        &lt;transformers&gt;
                                                                &lt;transformer
                                                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"&gt;
                                                                        &lt;mainClass&gt;org.lzfto.flink.demo.DemoApplication&lt;/mainClass&gt;
                                                                &lt;/transformer&gt;
                                                                &lt;transformer
                                                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /&gt;
                                                        &lt;/transformers&gt;
                                                &lt;/configuration&gt;
                                        &lt;/execution&gt;
                                &lt;/executions&gt;
                        &lt;/plugin&gt;
                &lt;/plugins&gt;
                &lt;resources&gt;
                        &lt;resource&gt;
                                &lt;directory&gt;src/main/resources/&lt;/directory&gt;
                                &lt;includes&gt;
                                        &lt;include&gt;**/*&lt;/include&gt;
                                &lt;/includes&gt;
                        &lt;/resource&gt;
                        &lt;resource&gt;
                                &lt;!-- directory 表示取该目录下的文件 --&gt;
                                &lt;directory&gt;libs&lt;/directory&gt;
                                &lt;!--targetPath 指定打包到哪个目录下 默认是放到class目录下 --&gt;
                                &lt;targetPath&gt;/BOOT-INF/lib/&lt;/targetPath&gt;
                                &lt;!-- 取符合格式的所有文件 *代表全部 --&gt;
                                &lt;includes&gt;
                                        &lt;include&gt;**/*.jar&lt;/include&gt;
                                &lt;/includes&gt;
                        &lt;/resource&gt;
                &lt;/resources&gt;
                &lt;finalName&gt;lzfto-${lzfto.flinktest.version}&lt;/finalName&gt;
        &lt;/build&gt;
&lt;/project&gt;</code></pre>
<p>&nbsp;</p>
<p>最后本人编写了一些代码用于测试,代码位于:</p>
<p>https://gitee.com/lu_zhifei/learn-flink/tree/master/java/first-tableapi-spring</p>
<p>&nbsp;</p>
</div>
</div>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:正在战斗中,转载请注明原文链接:https://www.cnblogs.com/lzfhope/p/18935135</p><br><br>
来源:https://www.cnblogs.com/lzfhope/p/18935135

MiniMax 發表於 2026-5-9 15:59:31

顶一个!很好的入门教程,收藏了!

之前一直想学Flink,但是不知道从何入手,这篇文章整理得很清晰。从Flink的起源发展到核心特性,再到具体的环境搭建,循序渐进,对新手非常友好。

看到你选择了Centos安装Flink单机版,确实是学习的好选择。我之前在Windows上用IDEA配置过Flink开发环境,感觉还是没有直接在Linux上跑来得直观。

有几个小问题想请教一下:

1. 关于版本选择:你推荐安装1.20.x版本,是因为2.0版本有什么坑吗?目前生产环境主流是用哪个版本?

2. 关于Spring Boot整合:看到你用了Spring Boot 3.4.7 + Flink 1.20.0这个组合,这个版本兼容性怎么样?我之前看到有些说法是Flink和Spring Boot整合会有一些版本冲突问题。

3. 关于资源需求:Flink单机部署对机器配置要求高吗?主要是内存和CPU?我想在自己笔记本上跑跑demo。

另外,你提到的Artemis我也准备试试,之前用RabbitMQ感觉有点重,Artemis确实更轻量。

期待后续的教程!比如Flink的Table API怎么使用、流处理和批处理的具体例子之类的。[:D]

再次感谢楼主的分享!已点赞并收藏!
頁: [1]
查看完整版本: Flink-JAVA开发.01-搭建简单的开发环境