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

FLINK 分流

在Apache Flink中,分流(Stream Splitting)是指将一条数据流拆分成完全独立的两条或多条流的过程。这通常基于一定的筛选条件,将符合条件的数据拣选出来并放入对应的流中。以下是关于Flink分流的详细解释:

一、分流方式

在这里插入图片描述

Flink提供了多种分流方式,以满足不同的数据处理需求:

  1. 基于filter的分流:
    • 这是最直接的分流方式,通过多次调用.filter()方法,将符合不同条件的数据筛选出来,形成不同的流。
    • 例如,可以将一个整数数据流拆分为奇数流和偶数流。
  2. 基于split的分流(已废弃):
    • 在早期的Flink版本中,.split()方法允许用户根据条件将数据流拆分为多个流。
    • 但由于该方法限制了数据类型转换,且随着Flink的发展,更灵活和高效的分流方式(如侧输出流)被引入,因此.split()方法已被废弃。
  3. 基于侧输出流(Side Output)的分流:
    • 侧输出流是Flink提供的一种更灵活和高效的分流方式。
    • 它允许用户在处理函数(如.process())中,根据条件将数据输出到不同的侧输出流中。
    • 使用侧输出流时,需要先定义输出标签(OutputTag),然后在处理函数中通过ctx.output()方法将数据写入对应的侧输出流。
    • 最后,可以通过getSideOutput()方法从侧输出流中获取数据。

三、内部机制

  1. 数据流的拆分:
    • 当数据流通过分流操作时,Flink会根据用户定义的筛选条件或处理函数,将数据元素分发到不同的子流中。
    • 这个过程通常是在Flink的算子(如filter算子、process算子)内部实现的,算子会根据输入数据的属性和条件来决定数据元素的去向。
  2. 子流的独立性:
    • 一旦数据流被拆分成多个子流,这些子流在后续的处理中就是相互独立的。
    • 用户可以对每个子流进行独立的操作和处理,如转换、聚合、窗口计算等。
  3. 资源的分配和调度:
    • Flink会根据任务的并行度和资源情况,动态地分配和调度资源来处理这些子流。
    • 这确保了每个子流都能得到足够的资源来处理数据,并且能够在满足性能要求的同时,尽可能地提高系统的吞吐量和效率。

四、应用场景

分流在Flink中有着广泛的应用场景,包括但不限于:

  • 数据路由:根据数据的某些属性(如用户ID、地区等)将数据路由到不同的处理路径上。
  • 异常检测:将正常数据和异常数据分开处理,以便对异常数据进行更详细的分析和处理。
  • 数据过滤:从原始数据流中筛选出符合特定条件的数据进行进一步处理。
  • 多版本处理:在处理数据升级或迁移时,将旧版本数据和新版本数据分开处理。

五、示例

1. filter分流

基于整数的奇偶性进行分流

import org.apache.flink.api.common.functions.FilterFunction;  
import org.apache.flink.streaming.api.datastream.DataStream;  
import org.apache.flink.streaming.api.datastream.DataStreamSource;  
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;  
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;  public class FlinkFilterSplitExample {  public static void main(String[] args) throws Exception {  // 创建Flink执行环境  StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  // 从Socket接收数据流(这里假设Socket发送的是整数数据)  DataStreamSource<String> socketStream = env.socketTextStream("localhost", 9999);  // 将字符串数据流转换为整数数据流  SingleOutputStreamOperator<Integer> intStream = socketStream.map(Integer::valueOf);  // 使用filter算子进行分流:偶数流和奇数流  SingleOutputStreamOperator<Integer> evenStream = intStream.filter(new FilterFunction<Integer>() {  @Override  public boolean filter(Integer value) throws Exception {  return value % 2 == 0;  }  });  SingleOutputStreamOperator<Integer> oddStream = intStream.filter(new FilterFunction<Integer>() {  @Override  public boolean filter(Integer value) throws Exception {  return value % 2 != 0;  }  });  // 打印偶数流和奇数流  evenStream.print("Even Stream: ");  oddStream.print("Odd Stream: ");  // 执行Flink程序  env.execute("Flink Filter Split Example");  }  
}

说明:

  1. 创建执行环境:首先,我们创建了一个Flink的执行环境StreamExecutionEnvironment。
  2. 接收数据流:通过env.socketTextStream(“localhost”, 9999),我们从本地的9999端口接收一个文本数据流。这里假设发送的是整数数据的字符串表示。
  3. 数据类型转换:使用map算子,我们将接收到的字符串数据流转换为整数数据流。
  4. 分流操作:
    • 使用filter算子,我们根据整数的奇偶性将数据流拆分为偶数流和奇数流。
    • evenStream包含所有偶数,oddStream包含所有奇数。
  5. 打印结果:最后,我们使用print算子打印偶数流和奇数流的结果。
  6. 执行程序:通过调用env.execute(),我们启动了Flink程序。

2. split分流(已废弃)

基于传感器温度的split分流

import org.apache.flink.api.common.functions.OutputSelector;  
import org.apache.flink.streaming.api.datastream.DataStream;  
import org.apache.flink.streaming.api.datastream.DataStreamSplit;  
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;  
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;  // 传感器数据类  
class SensorReading {  String deviceNo;  long timestamp;  double temperature;  // 构造函数、getter和setter方法省略  
}  public class FlinkSplitExample {  public static void main(String[] args) throws Exception {  // 创建Flink执行环境  StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  // 假设有一个数据源,这里使用一个简单的示例数据源  SingleOutputStreamOperator<SensorReading> sensorStream = env.fromElements(  new SensorReading("device1", 1610035289736L, 84.3),  new SensorReading("device2", 1610035371758L, 38.8),  // ... 其他传感器数据  );  // 使用split算子进行分流  DataStreamSplit<SensorReading> splitStream = sensorStream.split(new OutputSelector<SensorReading>() {  @Override  public Iterable<String> select(SensorReading sensorReading) {  ArrayList<String> output = new ArrayList<>();  if (sensorReading.temperature > 70.0) {  output.add("high");  } else {  output.add("low");  }  return output;  }  });  // 从SplitStream中选择出高温流和低温流  DataStream<SensorReading> highTempStream = splitStream.select("high");  DataStream<SensorReading> lowTempStream = splitStream.select("low");  // 打印结果  highTempStream.print("High Temperature Stream: ");  lowTempStream.print("Low Temperature Stream: ");  // 执行Flink程序  env.execute("Flink Split Example");  }  
}

3. 侧输出流(Side Output)分流

基于整数的奇偶性进行分流

import org.apache.flink.api.common.typeinfo.Types;  
import org.apache.flink.streaming.api.datastream.DataStream;  
import org.apache.flink.streaming.api.datastream.DataStreamSource;  
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;  
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;  
import org.apache.flink.streaming.api.functions.ProcessFunction;  
import org.apache.flink.util.Collector;  
import org.apache.flink.util.OutputTag;  
import org.apache.flink.api.common.functions.FilterFunction;  public class SplitStreamByOutputTag {  // 定义输出标签  private static final OutputTag<Integer> evenTag = new OutputTag<Integer>("even") {};  private static final OutputTag<Integer> oddTag = new OutputTag<Integer>("odd") {};  public static void main(String[] args) throws Exception {  // 创建Flink上下文环境  StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  env.setParallelism(1);  // Source  DataStreamSource<String> dataStreamSource = env.socketTextStream("localhost", 8888);  // Transform  SingleOutputStreamOperator<Integer> mapResult = dataStreamSource.map(input -> {  int i = Integer.parseInt(input);  return i;  });  // Process and split  SingleOutputStreamOperator<Integer> processedStream = mapResult.process(new ProcessFunction<Integer, Integer>() {  @Override  public void processElement(Integer value, Context ctx, Collector<Integer> out) throws Exception {  if (value % 2 == 0) {  ctx.output(evenTag, value);  } else {  ctx.output(oddTag, value);  }  // 注意:这里不向主输出流输出任何数据,所有数据都通过侧输出流输出。  // 如果需要同时向主输出流输出数据,可以在else分支中添加 out.collect(value);  }  });  // 获取侧输出流并打印  DataStream<Integer> evenStream = processedStream.getSideOutput(evenTag);  DataStream<Integer> oddStream = processedStream.getSideOutput(oddTag);  evenStream.print("Even Stream: ");  oddStream.print("Odd Stream: ");  // 执行  env.execute();  }  
}

相关文章:

FLINK 分流

在Apache Flink中&#xff0c;分流&#xff08;Stream Splitting&#xff09;是指将一条数据流拆分成完全独立的两条或多条流的过程。这通常基于一定的筛选条件&#xff0c;将符合条件的数据拣选出来并放入对应的流中。以下是关于Flink分流的详细解释&#xff1a; 一、分流方式…...

从零开始:构建一个高效的开源管理系统——使用 React 和 Ruoyi-Vue-Plus 的实战指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

windows下pycharm社区版2024下载与安装(包含新建第一个工程)

windows下pycharm社区版2024下载与安装 下载pycharm pycharm官网 安装pycharm 1.进入官网 pycharm官网 下载 点击Download–>右侧Other versions 下载对应的社区版&#xff08;如下图&#xff09;&#xff1a;下载网址 2.点击运行下载好的安装包 点击下一步 3.更改pychar…...

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…...

表格编辑demo

<el-form :model"form" :rules"status ? rules : {}" ref"form" class"form-container" :inline"true"><el-table :data"tableData"><el-table-column label"计算公式"><templat…...

企业自建邮件系统选U-Mail ,功能强大、安全稳定

在现代企业运营中&#xff0c;电子邮件扮演着至关重要的角色&#xff0c;随着企业规模的增长和业务的多样化&#xff0c;传统的租用第三方企业邮箱服务逐渐显现出其局限性。例如&#xff0c;存储空间受限、数据安全风险、缺乏灵活的管理和备份功能&#xff0c;以及无法与其他企…...

蓝桥杯题目理解

1. 一维差分 1.1. 小蓝的操作 1.1.1. 题目解析&#xff1a; 这道题提到了对于“区间”进行操作&#xff0c;而差分数列就是对于区间进行操作的好方法。 观察差分数列&#xff1a; 给定数列&#xff1a;1 3 5 2 7 1 差分数列&#xff1a;1 2 2 -3 5 6 题目要求把原数组全部…...

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…...

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp&#xff08;如果安装了则跳过&#xff09;启动xrdp服务 3.3 远程服务…...

# 渗透测试#安全见闻8 量子物理面临的安全挑战

# 渗透测试#安全见闻8 量子物理面临的安全挑战 ##B站陇羽Sec## 量子计算原理与技术 量子计算是一种基于量子力学原理的计算方式&#xff0c;它利用量子位&#xff08;qubits&#xff09;来进行信息处理和计算…...

【rabbitmq】实现问答消息消费示例

目录 1. 说明2. 截图2.1 接口调用截图2.2 项目结构截图 3. 代码示例 1. 说明 1.实现的是一个简单的sse接口&#xff0c;单向的长连接&#xff0c;后端可以向前端不断输出数据。2.通过调用sse接口&#xff0c;触发rabbitmq向队列塞消息&#xff0c;向前端返回一个sseEmitter对象…...

单片机_RTOS__架构概念

经典单片机程序 void main() {while(1){函数1&#xff08;&#xff09;&#xff1b;函数2&#xff08;&#xff09;&#xff1b;}} 有无RTOS区别 裸机 RTOS RTOS程序 喂饭&#xff08;&#xff09; {while&#xff08;1&#xff09;{喂一口饭&#xff08;&#xff09;;} } …...

ClickHouse在百度MEG数据中台的落地和优化

导读 百度MEG上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统&#xff0c;包括Turing Data Engine(TDE)计算引擎、Turing Dat…...

B/S架构(Browser/Server)与C/S架构(Client/Server)

基本概念 B/S架构&#xff08;Browser/Server&#xff09;&#xff1a;即浏览器/服务器架构。在这种架构中&#xff0c;用户通过浏览器&#xff08;如Chrome、Firefox、Safari等&#xff09;访问服务器上的应用程序。服务器端负责处理业务逻辑、存储数据等核心功能&#xff0c;…...

idea中自定义注释模板语法

文章目录 idea 自定义模板语法1.自定义模板语法是什么&#xff1f;2.如何在idea中设置呢&#xff1f; idea 自定义模板语法 1.自定义模板语法是什么&#xff1f; 打开我的idea&#xff0c;创建一个测试类&#xff1a; 这里看到我的 test 测试类里面会有注释&#xff0c;这是怎…...

基于SSM的儿童教育网站【附源码】

基于SpringBoot的课程作业管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统模块设计 4.3.3 数据库表设计 5 系统实现 5.1 管理员功能模块的实现 5.1.1 视频列表 5.1.2 文章信息管理 5.1.3 文章类…...

深挖自闭症病因与孩子表现的关联

自闭症&#xff0c;亦称为孤独症&#xff0c;乃是一种对儿童发展有着严重影响的神经发育障碍性疾病。深入探寻自闭症的病因与孩子表现之间的联系&#xff0c;对于更深刻地理解并助力自闭症儿童而言&#xff0c;可谓至关重要。 当前&#xff0c;自闭症的病因尚未完全明晰&#x…...

[网络协议篇] UDP协议

文章目录 1. 简介2. 特点3. UDP数据报结构4. 基于UDP的应用层协议5. UDP安全性问题6. 使用udp传输数据的系统就一定不可靠吗&#xff1f;7. 基于UDP的主机探活 python实现 1. 简介 User Datagram Protocol&#xff0c;用户数据报协议&#xff0c;基于IP协议提供面向无连接的网…...

关系型数据库(1)----MySQL(初阶)

目录 1.mysql 2.mysqld 3.mysql架构 1.连接层 2.核心服务层 3.存储引擎层 4.数据存储层 4.SQL分类 5.MySQL操作库 6.MySQL数据类型 1. 数值类型 2. 日期和时间类型 3. 字符串类型 4. 空间类型 5. JSON数据类型 7.MySQL表的约束 1. 主键约束&#xff08;PRIMARY…...

计算机毕业设计Python+大模型租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 用到的技术: 1. python…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...