Java版Flink使用指南——分流导出

大纲

在之前的案例中,我们一直使用的是单个Sink来做数据的输出。实际上,Flink是支持多个输出流的。本文我们就来讲解如何在Flink数据输出时做分流处理。

我们将基于《Java版Flink使用指南------自定义无界流生成器》的输入流,按生成数字的奇偶性,将其分流输出到不同的RabbitMQ队列中。

新建工程

我们新建一个名字叫MultiSinkTo的工程。

Archetype:org.apache.flink:flink-quickstart-java

版本:1.19.1

编码

Pom.xml

因为我们要往RabbitMQ中输出,所以需要引入相关连接组件。

xml 复制代码
		<dependency>
			<groupId>org.apache.flink</groupId>
			<artifactId>flink-connector-rabbitmq</artifactId>
			<version>3.0.1-1.17</version>
		</dependency>

自定义无界流

新建src/main/java/org/example/generator/UnBoundedStreamGenerator.java

这块的代码可以见《Java版Flink使用指南------自定义无界流生成器》

它会每隔1秒钟生成一个递增的数字

java 复制代码
package org.example.generator;

import org.apache.flink.streaming.api.functions.source.RichSourceFunction;

public class UnBoundedStreamGenerator extends RichSourceFunction<Long> {
    private volatile boolean isRunning = true;

    @Override
    public void run(SourceContext<Long> ctx) throws Exception {
        long count = 0L;
        while (isRunning) {
            Thread.sleep(1000); // Simulate delay
            ctx.collect(count++); // Emit data
        }
    }

    @Override
    public void cancel() {
        isRunning = false;
        System.out.println("UnBoundedStreamGenerator canceled");
    }
}

分流

我们通过下面的代码生成数据流

java 复制代码
		DataStreamSource<Long> longDataStreamSource = env.addSource(new UnBoundedStreamGenerator());

然后奇数发布到odd.data.to.rbtmq队列;偶数发布到even.data.to.rbtmq。

分流主要是通过filter来区分数据,然后针对不同的数据addSink来发布到不同的队列。

如果不需要区分数据,只是将相同的数据发布到不同的目的地,则可以直接多次addSink来达成。

java 复制代码
		String host = "172.25.103.252"; // IP of the rabbitmq server
		int port = 5672;
		String username = "admin";
		String password = "fangliang";
		String virtualHost = "/";
		RMQConnectionConfig rmqConnectionConfig = new RMQConnectionConfig.Builder()
				.setHost(host)
				.setPort(port)
				.setUserName(username)
				.setPassword(password)
				.setVirtualHost(virtualHost)
				.build();

		int parallelism = 1;
		
		String oddSinkQueueName = "odd.data.to.rbtmq"; 
		RMQSink<String> oddRMQSink = new RMQSink<>(rmqConnectionConfig, oddSinkQueueName, new SimpleStringSchema());
		longDataStreamSource.filter(value -> value % 2 != 0).map(Object::toString).addSink(oddRMQSink).setParallelism(parallelism).name("oddSink");

		String evenSinkQueueName = "even.data.to.rbtmq";
		RMQSink<String> evenRMQSink = new RMQSink<>(rmqConnectionConfig, evenSinkQueueName, new SimpleStringSchema());
		longDataStreamSource.filter(value -> value % 2 == 0).map(Object::toString).addSink(evenRMQSink).setParallelism(parallelism).name("evenSink");

测试

执行一段时间后,我们看到两个队列相序增加

奇数队列

偶数队列

工程代码

https://github.com/f304646673/FlinkDemo

相关推荐
通往曙光的路上1 分钟前
SpringIOC-注解
java·开发语言
一 乐11 分钟前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
TT哇12 分钟前
【面经 每日一题】面试题16.25.LRU缓存(medium)
java·算法·缓存·面试
青云交13 分钟前
Java 大视界 -- 基于 Java 的大数据联邦学习在跨行业数据协同创新中的实践突破
java·分布式计算·隐私保护·apache flink·大数据联邦学习·跨行业数据协同·安全通信
合作小小程序员小小店13 分钟前
桌面开发,在线%考试管理%系统,基于eclipse,java,swing,mysql数据库。
java·数据库·mysql·eclipse·jdk
oioihoii17 分钟前
C/C++混合项目中的头文件管理:.h与.hpp的分工与协作
java·c语言·c++
一瓢一瓢的饮 alanchan29 分钟前
Flink原理与实战(java版)#第2章 Flink的入门(第二节Flink简介)
java·大数据·flink·kafka·实时计算·离线计算·流批一体化计算
vx_bscxy32230 分钟前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于微信小程序的民宿预约系统22398 (上万套实战教程,赠送源码)
java·spring boot·mysql·微信小程序·课程设计
z_鑫1 小时前
Java线程池原理深度解析
java·开发语言·后端
春生野草1 小时前
启动Nginx
java·微服务·架构