深入WPF--Style
牌弊嚷势核心依赖dependencies {// Flink核心依赖implementation org.apache.flink:flink_core:1.20.1implementation org.apache.flink:flink-streaming-java:1.20.1implementation org.apache.flink:flink-clients:1.20.1}三、SocketWordCount示例详解1. 功能介绍SocketWordCount是Flink中的经典示例它通过Socket接收实时数据流对数据流中的单词进行计数并将结果实时输出。这个示例虽然简单但包含了Flink流处理的核心要素数据源连接、数据转换、并行处理和结果输出。2. 完整代码实现package com.cn.daimajiangxin.flink;import org.apache.flink.api.common.eventtime.WatermarkStrategy;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;import org.apache.flink.util.Collector;import java.time.Duration;public class SocketWordCount {public static void main(String[] args) throws Exception {// 1. 创建执行环境StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment();// 启用检查点确保容错性env.enableCheckpointing(5000); // 每5秒创建一次检查点// 设置并行度env.setParallelism(2);// 2. 从Socket读取数据String hostname localhost;int port 9999;// 支持命令行参数传入if (args.length 0) {hostname args[0];}if (args.length 1) {port Integer.parseInt(args[1]);}DataStream text env.socketTextStream(hostname,port,\n, // 行分隔符0); // 最大重试次数// 3. 数据转换DataStream wordCounts text.flatMap(new Tokenizer()).keyBy(value - value.f0)//添加基于处理时间的滚动窗口计算.window(TumblingProcessingTimeWindows.of(Duration.ofSeconds(5)))// 使用sum聚合算子.sum(1);// 4. 输出结果wordCounts.print(Word Count);// 5. 启动作业env.execute(Socket Word Count);}// 可选使用传统的FlatMapFunction实现方式public static final class Tokenizer implements FlatMapFunction {private static final long serialVersionUID 1L;Overridepublic void flatMap(String value, Collector out) {String[] words value.toLowerCase().split(\\W);for (String word : words) {if (word.length() 0) {out.collect(Tuple2.of(word, 1));}}}}}3. 代码解析3.1 执行环境创建StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(2);这段代码创建了Flink的执行环境并设置了并行度为2。执行环境是所有Flink程序的入口点它负责管理作业的执行。3.2 数据源连接DataStream text env.socketTextStream(hostname, port);这里使用socketTextStream方法从Socket连接中读取文本数据。这是Flink提供的一种内置数据源连接器适用于测试和演示。3.3 数据转换DataStream wordCounts text.flatMap(new Tokenizer()).keyBy(value - value.f0) // 按单词分组.sum(1); // 累加计数数据转换包含三个关键步骤分词 使用flatMap操作将每行文本分割成单词并为每个单词生成(word, 1)的元组分组 使用keyBy操作按单词进行分组聚合 使用sum操作对每个单词的计数进行累加3.4 结果输出wordCounts.print(Word Count);使用print方法将结果输出到控制台这是一种内置的输出方式非常适合调试和演示。3.5 作业启动env.execute(Socket Word Count);最后调用execute方法启动作业。注意Flink程序是惰性执行的只有调用execute方法才会真正触发计算。四、Flink并行流处理机制1. 并行度概念并行度是指Flink程序中每个算子可以同时执行的任务数量。在SocketWordCount示例中我们设置了全局并行度为2这意味着每个算子都会有2个并行实例。2. 数据流分区策略Flink支持多种数据流分区策略包括Forward Partitioning 保持数据分区一个输入分区对应一个输出分区Shuffle Partitioning 随机将数据分发到下游算子的分区Rebalance Partitioning 轮询将数据分发到下游算子的分区Rescale Partitioning 类似于rebalance但只在本地节点内轮询Broadcast Partitioning 将数据广播到所有下游分区Key Group Partitioning 基于键的哈希值确定分区在SocketWordCount中keyBy操作使用了Key Group Partitioning策略确保相同单词的数据被发送到同一个分区进行处理。3. 并行执行图解sadmermaid-diagram这个图清晰地展示了Flink并行执行的流程包括Socket数据源连接FlatMap操作并行度为2及其两个子任务KeyBy/Sum操作并行度为2及其两个子任务Print输出操作并行度为2五、运行SocketWordCount1. 准备Socket服务器在运行SocketWordCount程序之前我们需要先启动一个Socket服务器作为数据源。以下是几种常用的Socket服务器搭建方法1.1 使用netcat工具Linux/Mac系统nc -lk 9999参数说明-l: 表示监听模式等待连接-k: 表示保持连接允许接受多个连接对持续测试很有用9999: 端口号Windows系统Windows有几种获取netcat的方式如果安装了Git可以使用Git Bashnc -l -p 9999如果安装了Windows Subsystem for Linux (WSL)nc -lk 9999参数说明-l: 表示监听模式等待连接-k: 表示保持连接允许接受多个连接对持续测试很有用9999: 端口号1.2 使用Java实现Socket服务端如果你想使用Java代码来创建一个更可控的Socket服务器可以参考以下示例import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class SimpleSocketServer {public static void main(String[] args) {int port 9999;try (ServerSocket serverSocket new ServerSocket(port)) {System.out.println(Socket服务器已启动监听端口: port);while (true) {try (Socket clientSocket serverSocket.accept();PrintWriter out new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in new BufferedReader(new InputStreamReader(System.in))) {System.out.println(客户端已连接输入要发送的数据输入exit退出);String inputLine;while ((inputLine in.readLine()) ! null) {if (inputLine.equalsIgnoreCase(exit)) {break;}out.println(inputLine);}} catch (IOException e) {System.err.println(客户端连接异常: e.getMessage());}}} catch (IOException e) {System.err.println(无法启动服务器: e.getMessage());}}}这个Java实现的Socket服务器具有以下特点启动后持续监听9999端口接受客户端连接并允许发送数据支持通过输入exit退出当前客户端连接异常处理更加完善1.3 测试Socket连接在启动Socket服务器后你可以使用以下方法测试连接是否正常使用telnet客户端测试telnet localhost 9999使用netcat作为客户端测试nc localhost 99991.4 常见问题与解决方法端口被占用错误信息Address already in use或类似提示解决方法更换端口号或使用lsof -i :9999Linux/Mac查找占用端口的进程防火墙阻止症状服务器启动但客户端无法连接解决方法检查系统防火墙设置确保端口9999已开放权限问题Linux/Mac症状普通用户无法绑定低端口1024解决方法使用sudo权限或选择1024以上的端口Windows特殊情况如果nc命令不可用可以使用上述PowerShell脚本或安装第三方netcat工具确保Windows Defender防火墙允许连接六、高级特性扩展1. 添加窗口计算添加基于处理时间的滚动窗口计算import org.apache.flink.api.common.typeinfo.Types;import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;DataStream wordCounts text.flatMap(new Tokenizer()).keyBy(value - value.f0).window(TumblingProcessingTimeWindows.of(Duration.ofSeconds(5))).sum(1);sad20251007145023七、常见问题与解决方案1. 连接被拒绝错误问题程序抛出Connection refused错误。解决方案确保Socket服务器已启动并且监听在正确的端口上。2. 结果不符合预期问题输出的单词计数结果不符合预期。解决方案检查分词逻辑是否正确确保单词的大小写处理和分隔符使用得当。3. 性能问题问题程序处理速度较慢。解决方案调整并行度增加资源配置或优化数据转换逻辑。八、最佳实践1. 生产环境配置设置合适的并行度根据集群资源和任务特性设置并行度启用检查点对于生产环境启用检查点机制确保容错性配置状态后端根据数据量大小选择合适的状态后端2. 代码优化建议避免使用全局变量确保函数是无状态的或正确管理状态合理设置并行度避免过度并行化导致的资源浪费九、总结与展望

相关新闻

科技行业动态

科技行业动态

简讯主题核心事件摘要热门评论风向打工人深度观点焦虑与展望1. OpenAI发布GPT-5.4(智能体执行新时代)时间:3月6日亮点:原生支持电脑键鼠操作,跨应用自主完成任务;百万Token上下文;错误率降33%。意义:AI从“…

2026/7/7 14:21:09 阅读更多 →
分享一些如何从:领域、对象、角色、职责、对象交互、场景等这些方面去分析和设计具有动态行为的领域模型的经验(附源码)

分享一些如何从:领域、对象、角色、职责、对象交互、场景等这些方面去分析和设计具有动态行为的领域模型的经验(附源码)

倏偎韵碌1. k8s 架构K8s 属于经典的主从模型(Master-Slave 架构),由 Master 和 Node 节点构成: Master 节点:负责集群的管理,协调集群中的所有活动。例如应用的运行、修改、更新等。 Node 节点:…

2026/7/6 20:33:53 阅读更多 →
《c# 实现pp文件分享与传输系统》 一、 模型

《c# 实现pp文件分享与传输系统》 一、 模型

儆厦霞叭1. 引言 复习上一篇文章《最小二乘问题详解1:线性最小二乘》中的知识,对于一个线性问题模型: f ( x ; θ )A θ 那么线性最小二乘问题可以表达为求一组待定值 θ ,使得残差的平方和最小: min θ ∥ A θ ? b …

2026/7/7 11:46:22 阅读更多 →

最新新闻

GaussDB Inside 2.23.01.280 集中式一主一备安装

GaussDB Inside 2.23.01.280 集中式一主一备安装

GaussDB Inside 2.23.01.280 集中式一主一备安装文档 一、环境规划节点主机名IP角色节点 1node110.10.9.211主库节点 2node210.10.9.212备库以下“系统准备”步骤需在两台机器上执行,除非特别注明。二、修改主机名和 hosts node1 执行 hostnamectl set-hostname nod…

2026/7/8 1:41:16 阅读更多 →
Agent 时代最重要的数据,不是答案,而是 Trajectory

Agent 时代最重要的数据,不是答案,而是 Trajectory

Agent 时代最重要的数据,不是答案,而是 Trajectory。 模型决定能力上限,轨迹质量决定能力下限。 最近一年,Agent 成了大模型领域最热门的话题之一。 从 OpenAI Operator、Deep Research,到 Manus、Cursor、Claude Cod…

2026/7/8 1:41:16 阅读更多 →
CPT Markets:把外汇用户支持体系做扎实,偏好清晰说明的读者更容易感受到的标准

CPT Markets:把外汇用户支持体系做扎实,偏好清晰说明的读者更容易感受到的标准

外汇市场信息更新频繁,平台口碑的形成更依赖长期一致性:入口是否好找、说明是否前后一致、提示是否稳定出现。在CPT Markets的外汇服务中,下面从稳定体验与信息呈现等角度做一次正面观察。在外汇相关服务中,读者最在意的通常是信息…

2026/7/8 1:35:14 阅读更多 →
扣子是什么,先说清楚

扣子是什么,先说清楚

扣子(coze.cn)是字节跳动推出的 AI 工作流平台,2026 年 1 月刚发布了 2.0 版本。用一句话说清楚它能帮你做什么:把原来需要你坐在电脑前手动操作的一系列步骤,变成一条自动运转的流水线。 你只需要在可视化的画布上拖拽…

2026/7/8 1:31:13 阅读更多 →
15个实用的Markdown编辑器,写作体验

15个实用的Markdown编辑器,写作体验

15个实用的Markdown编辑器,写作体验 # 15款高效实用的Markdown编辑器推荐:提升你的写作体验 Markdown作为一种轻量级标记语言,已经成为程序员、作家和博主们的首选写作工具。选择一个优秀的Markdown编辑器能极大提升写作效率和体验。 ## 最适…

2026/7/8 1:29:13 阅读更多 →
LangChain 实战指南:从调用模型到构建 AI 应用-9336

LangChain 实战指南:从调用模型到构建 AI 应用-9336

聊《LangChain 实战指南:一次新的项目切入》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要从个人调试 API 到团队级 AI 应用,中间隔着的不只是代码量,而是工作流的结构化能力…

2026/7/8 1:27:12 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻