Flink流:监听RabbitMq(Json)写MySQL

RabbitMq

Erlang环境安装

RabbitMQ代码是使用Erlang编写的,需要安装Erlang环境

下载安装

erlang官网地址:https://www.erlang.org/downloads

检查系统环境变量

为了稳定,安装完后要检查一下系统的环境变量,如果没有自动写入需要自行手动配置;
操作过程:此电脑(鼠标右键)__属性__高级系统设置__环境变量__新建__系统环境变量

变量名:ERLANG_HOME
变量值:Erlang的根路径

然后添加到 path
操作过程:选中Path__编辑__新建__%ERLANG_HOME%\bin__确定

验证

保存退出到桌面后打开命令提示符(CMD),输入erl显示版本号即安装成功;
erl运行结果

RabbitMq安装

下载安装

官网地址:http://www.rabbitmq.com/download.html

验证

RabbitMq会在开始界面中创建自己功能的快捷方式所以我们直接点击其中的RabbitMq Service - start运行;
开始界面

桌面会显示Service运行之后的窗口;

Rabbit Service

在浏览器链接行访问:http://localhost:15672,然后登录后即可看到它的管理页面;

默认账号密码皆为:guest

RabbitMq 管理页面

注意

管理页面登录默认端口为15672,消息推送使用的端口默认为5672

  • 4369 (epmd), 25672 (Erlang distribution)
  • 5672, 5671 (AMQP 0-9-1 without and with TLS)
  • 15672 (if management plugin is enabled)
  • 61613, 61614 (if STOMP is enabled)
  • 1883, 8883 (if MQTT is enabled)

FLink

Maven依赖

Flink Version:1.14.3
RabbitMq Version:5.14.1
Mysql Version:8.x.x

<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-java -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java</artifactId>
    <version>1.14.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.12</artifactId>
    <version>1.14.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-clients_2.12</artifactId>
    <version>1.14.3</version>
</dependency>
<!-- RabbitMq 处理 -->
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-connector-rabbitmq -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-rabbitmq_2.12</artifactId>
    <version>1.14.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.14.1</version>
</dependency>
<!-- 数据库 处理 -->
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-connector-jdbc -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-jdbc_2.12</artifactId>
    <version>1.14.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>
<!-- Json 处理 -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.1</version>
</dependency>

代码(java)

因为java和scala中间的Json转换过于繁琐,故使用Java代码开发。

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.streaming.connectors.rabbitmq.RMQSource;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;
import org.apache.flink.util.Collector;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Map;


public class RMQTransformation {

    public static void main(String[] args) throws Exception {
        // 创建Flink流运行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 链接RabbitMq的配置
        final RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
                // RabbitMq部署服务器
                .setHost("localhost")
                // RabbitMq端口
                .setPort(5672)
                // 用户名
                .setUserName("guest")
                // 端口
                .setPassword("guest")
                .setVirtualHost("/")
                .build();
        // 从数据源读取流数据的配置
        final DataStream<String> stream = env
                // 配置源
                .addSource(new RMQSource<>(
                        // 传入配置信息
                        connectionConfig,
                        // 指定监听的Queue
                        "python-test",
                        // 是否持久化
                        true,
                        // 流数据类型转换的Schema
                        new SimpleStringSchema()))
                // 设置并行度
                .setParallelism(1);
        // 处理收到的数据
        // 因为发送的数据是JSON,所以需要使用jackson解析JSON提取想要的值;
        // 因为java 无法自动推断 Flink的数据类型所以保险起见,不使用Lambda表达式;
        DataStream<String> stringStream = stream.flatMap(new FlatMapFunction<String, String>() {

            /**这两个参数是有Flink传入 我们只需编写处理他们的代码
             * @param collector 结果收集器
             * @param s 传入的元素值
             */
            @Override
            public void flatMap(String s, Collector<String> collector) throws Exception {

                ObjectMapper mapper = new ObjectMapper();
                JavaType type = mapper.getTypeFactory().constructParametricType(Map.class, String.class, String.class);
                // jackson解析JSON
                Map<String, String> map = mapper.readValue(s, type);

                for (Map.Entry<String, String> entry : map.entrySet()) {
                    //遍历收集 值
                    collector.collect(entry.getValue());
                }
            }
        });
        //控制台打印
        stringStream.print();
        //设置输出目标
        stringStream.addSink(new RichSinkFunction<String>() {

            private PreparedStatement ps = null;
            private Connection connection = null;
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/scala?serverTimezone=UTC";
            String username = "root";
            String password = "root";

            /**
             * 这个方法是过程的一部分,是在指定时刻自动调用,我们在这中间添加自己的处理代码
             * <br/>
             * open表示连接时调用,代码便是连接时执行的代码
             * @param parameters Flink自动传的配置参数,按照模板交给父类处理
             * */
            @Override
            public void open(Configuration parameters) throws Exception {
                // 用于建立连接
                super.open(parameters);
                //在此做准备工作
                //加载JDBC驱动
                Class.forName(driver);
                // JDBC 链接
                connection = DriverManager.getConnection(url, username, password);
            }

            /**
             * invoke表示调用时执行,代码便是调用时执行的代码;
             * @param value 你要操作的数据,Flink自动传到这个方法里面
             * @param context 当前代码不需要操作的内容
             * */
            @Override
            public void invoke(String value, SinkFunction.Context context) throws Exception { // 真正执行的操作
                String sql = "insert into sync_source (fn_id,fn_key,fn_content) values (?,?,?)";
                ps = connection.prepareStatement(sql);
                ps.setString(1, value);
                ps.setString(2, "key" + value);
                ps.setString(3, "value" + value);
                ps.executeUpdate();
            }

            /**
             * close表示结束时执行,代码便是结束时执行的代码;
             *
             * */
            @Override
            public void close() throws Exception {
                //在这里编写步骤做完的代码
                super.close();
                if (connection != null) {
                    connection.close();
                }
                if (ps != null) {
                    ps.close();
                }
            }
        });

        env.execute();
    }
}

抛砖引玉

本文记录从Flink以流的方式监听RabbitMq中Json格式的数据并写入MySQL数据库;
笔者目前仅为初步接触水平,如果有大神能用Scala写出相同效果,请帮忙留一下文章链接,感谢。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Singing_Towers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值