文章目录
(1)自定义数据源说明
与上文一样,要实现自定义和数据源必须实现Flink
内置的数据源接口或者集成内置数据源抽象类
-
SourceFunction: 非并行数据源(并行度只能=1)
-
RichSourceFunction: 多功能非并行数据源(并行度只能=1)
-
ParallelSourceFunction: 并行数据源(并行度能够>=1)
-
RichParallelSourceFunction: 多功能并行数据源(并行度能够>=1)
(2)RabbitMQ中加载数据源
有时候,我们flink计算程序需要从RabbitMQ中加载数据源,然后进行数据计算处理
下边进行数据加载演示
(1)添加依赖
要从rabbitMq中加载数据,我们需要在rabbitMq原有依赖基础上添加一个rabbitMq连接器依赖
<!--rabbitMQ连接器-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-rabbitmq_2.12</artifactId>
<version>${flink.version}</version>
</dependency>
(2)自定义RabbitMQ数据源
我们自定义的RabbitMQ数据源类要继承上方依赖包提供的RMQSources
类
package com.leilei.source.rabbit;
import com.rabbitmq.client.AMQP;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.connectors.rabbitmq.RMQSource;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* @author lei
* @version 1.0
* @desc
* @date 2021-03-15 17:27
*/
public class FlinkRabbitMqSource extends RMQSource {
public String exchangeName;
/**
*
* @param rmqConnectionConfig rabbitMQ的连接器配置(ip 端口 账号 密码等)
* @param queueName 监听的队列名
* @param exchangeName 队列绑定的交换机名
* 注:此设置后如果监听的队列不存在,其会自动创建,并与指定的交换机进行绑定
*/
public FlinkRabbitMqSource(RMQConnectionConfig rmqConnectionConfig, String queueName,
String exchangeName) {
super(rmqConnectionConfig, queueName, new SimpleStringSchema(StandardCharsets.UTF_8));
this.exchangeName = exchangeName;
}
/**
* 设置消息队列 队列绑定到交换机
* @throws IOException
*/
@Override
protected void setupQueue() throws IOException {
AMQP.Queue.DeclareOk result = channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(result.getQueue(), exchangeName, "*");
}
}
(3)RabbitMQ连接器配置
同上方代码注释,我们需要配置RabbitMQ的连接器信息 包括但不限于 RabbitMQ所在的IP 端口 账号 密码等…
RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
.setHost("10.50.40.116")
.setPort(5673)
.setUserName("admin")
.setPassword("admin")
.setVirtualHost("/")
.build();
(4)加载自定义RabbitMQ数据源
使用当前flink计算环境,加载自定义RabbitMQ数据源
我自定义的FlinkRabbitMqSource有三个参数 :RabbitMQ的连接器配置、队列名、交换机名
DataStreamSource dataStreamSource = env.addSource(new FlinkRabbitMqSource(connectionConfig,
"leilei",
"paas-trans-enterprise-platform-data.fanout.location_test"));
(5)运行Flink程序
package com.leilei.source.rabbit;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;
/**
* @author lei
* @version 1.0
* @desc
* @date 2021-03-15 17:31
*/
public class FlinkSourceByRabbitMq {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
.setHost("10.50.40.116")
.setPort(5673)
.setUserName("admin")
.setPassword("admin")
.setVirtualHost("/")
.build();
DataStreamSource dataStreamSource = env.addSource(new FlinkRabbitMqSource(connectionConfig,
"leilei",
"paas-trans-enterprise-platform-data.fanout.location_test"));
dataStreamSource.print();
env.execute();
}
}
(6)测试
Flink程序启动后,查看RabbitMQ控制台,看到我自定义的队列leilei
与交换机paas-trans-enterprise-platform-data.fanout.location_test
进行了绑定
交换机
队列
模拟生产者发送消息到交换机
Flink计算程序收到MQ队列leilei
中的消息
结语
经测试,Flink程序可以拿到RabbitMQ中的数据源进行数据处理计算,Flink程序demo整合RabbitMQ 完毕