Flink安装和Flink CDC实现数据同步

 一,Flink 和Flink CDC

1, Flink

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。

中文文档 Apache Flink Documentation | Apache Flink

官方文档 :https://flink.apache.org
Flink 中文社区视频课程:https://github.com/flink-china/flink-training-course
Flink 中文社区 :https://www.slidestalk.com/FlinkChina
ververica 教程 :https://training.ververica.com/
ververica 教程中文文档:https://ci.apache.org/projects/flink/flink-docs-master/zh/
源码:https://github.com/apache/flink
Flink 知识图谱 https://developer.aliyun.com/article/744741

2,Flink CDC

CDC 的全称是 Change Data Capture ,在广义的概念上,只要是能捕获数据变更的技术,我们都可以称之为 CDC 。

目前通常描述的 CDC 技术主要面向数据库的变更,是一种用于捕获数据库中数据变更的技术。CDC 技术的应用场景非常广泛:

  •  数据迁移:常用于数据库备份、容灾等;
  •  数据分发:将一个数据源分发给多个下游,常用于业务解耦、微服务;
  •  数据采集:将分散异构的数据源集成到数据仓库中,消除数据孤岛,便于后续的分析。

目前业界主流的 CDC 实现机制可以分为两种:

2.1 基于查询的 CDC

  • 离线调度查询作业,批处理。依赖表中的更新时间字段,每次执行查询去获取表中最新的数据;
  • 无法捕获删除事件,从而无法保证数据一致性;
  • 无法保障实时性,基于离线调度存在天然的延迟。

2.2 基于日志的 CDC

  • 实时消费日志,流处理。例如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把binlog 文件当作流的数据源;
  • 保障数据一致性,因为 binlog 文件包含了所有历史变更明细;
  • 保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。

2.3 主流CDC技术对比

1) DataX 不支持增量同步,Canal 不支持全量同步。虽然两者都是非常流行的数据同步工具,但在场景支持上仍不完善。

2) 在全量+增量一体化同步方面,只有 Flink CDC、Debezium、Oracle Goldengate 支持较好。

3) 在架构方面,Apache Flink 是一个非常优秀的分布式流处理框架,因此 Flink CDC 作为Apache Flink 的一个组件具有非常灵活的水平扩展能力。而 DataX 和 Canal 是个单机架构,在大数据场景下容易面临性能瓶颈的问题。

4) 在数据加工的能力上,CDC 工具是否能够方便地对数据做一些清洗、过滤、聚合,甚至关联打宽。Flink CDC 依托强大的 Flink SQL 流式计算能力,可以非常方便地对数据进行加工。而Debezium 等则需要通过复杂的 Java 代码才能完成,使用门槛比较高。

5) 另外,在生态方面,这里指的是上下游存储的支持。Flink CDC 上下游非常丰富,支持对接MySQL、PostgreSQL 等数据源,还支持写入到 TiDB、HBase、Kafka、Hudi 等各种存储系统中,也支持灵活的自定义 connector。

二,安装Flink

1,为了运行Flink,只需提前安装好 Java 11或以上版本

java -version

2,下载Flink

下载地址:Index of /dist/flinkicon-default.png?t=O83Ahttps://archive.apache.org/dist/flink

可以找到你要安装的版本

wget https://archive.apache.org/dist/flink/flink-1.19.1/flink-1.19.1-bin-scala_2.12.tgz

3,解压

 tar -xzf flink-1.19.1-bin-scala_2.12.tgz

4,进入到flink-1.19.1目录,启动集群

./bin/start-cluster.sh

5,如果想访问WebUI,可以看下面

【问题解决】Flink在linux上运行成功但是无法访问webUI界面_flink web ui的ip访问-CSDN博客

6,停止集群

./bin/stop-cluster.sh

三,运行Flink示例

在examples目录下有很多示例,可以试着运行

1,运行单词统计示例

./bin/flink run examples/streaming/WordCount.jar

进入到log目录,查看日志

tail -f flink-root-taskexecutor-0-rocky8-template.out

四,运行Flink CDC示例

1,通过编写sql脚本来实现同步数据

SET execution.checkpointing.interval = 5s;drop table if exists  order_01;
CREATE TABLE order_01 (id INT NOT NULL,`order_id`  VARCHAR,amount VARCHAR,remark VARCHAR,PRIMARY KEY (`id`) NOT ENFORCED) WITH ('connector' = 'mysql-cdc','hostname' = 'x.x.x.x','port' = '3306','username' = 'root','password' = 'p4ssword','database-name' = 'account','server-time-zone' = 'UTC','table-name' = 'order_01');drop table if exists  order_02;
CREATE TABLE order_02 (id INT NOT NULL,`order_id`  VARCHAR,amount VARCHAR,remark VARCHAR,PRIMARY KEY (`id`) NOT ENFORCED) WITH ('connector' = 'jdbc','url' = 'jdbc:mysql://x.x.x.x:3306/account?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC','username' = 'root','password' = 'p4ssword','table-name' = 'order_02','driver' = 'com.mysql.cj.jdbc.Driver','scan.fetch-size' = '200');INSERT INTO order_02
SELECT id,order_id,amount,remark
FROM order_01;

编写以上脚本,命名为flinkCdc2Mysql.sql,上传到flink的sql目录下,这里的sql是我新建的,你可以自己指定。

需要下载flink-connecter和flink-sql-connector包

下载地址:Central Repository: com/ververica

 通过以下命令执行

./bin/sql-client.sh -f ./sql/flinkCdc2Mysql.sql

就可以完成数据从order_01表同步到order_02表。

2, 编写Java类,编译成jar,执行jar来实现数据同步

AccountVoucherSumaryDWSSQL类
package com.xxx.demoimport org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;/*** @date 2024/10/31 下午3:57*/
public class AccountVoucherSumaryDWSSQL {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);env.enableCheckpointing(5000);final StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);tEnv.executeSql("CREATE DATABASE IF NOT EXISTS account");// 动态表,此为source表tEnv.executeSql("CREATE TABLE account.order_01 (\n" +"    id                           INT,\n" +"    order_id                     VARCHAR,\n" +"    amount                       VARCHAR,\n" +"    remark                       VARCHAR,\n" +"    PRIMARY KEY (id) NOT ENFORCED\n" +") WITH (\n" +"  'connector' = 'mysql-cdc',\n" +"  'hostname' = 'x.x.x.x',\n" +"  'port' = '3306',\n" +"  'username' = 'root',\n" +"  'password' = 'p4ssword',\n" +"  'database-name' = 'account',\n" +"  'table-name' = 'order_01',\n" +"  'server-time-zone' = 'UTC',\n" +"  'scan.incremental.snapshot.enabled' = 'false'\n" +")");// 动态表,此为sink表。sink表和source表的connector不一样tEnv.executeSql("CREATE TABLE account.order_02 (\n" +"    id                           INT,\n" +"    order_id                     VARCHAR,\n" +"    amount                       VARCHAR,\n" +"    remark                       VARCHAR,\n" +"    PRIMARY KEY (id) NOT ENFORCED\n" +") WITH (\n" +"  'connector' = 'jdbc',\n" +"  'url' = 'jdbc:mysql://x.x.x.x:3306/account?useSSL=false&allowPublicKeyRetrieval=true&connectionTimeZone=UTC',\n" +"  'username' = 'root',\n" +"  'password' = 'p4ssword',\n" +"  'table-name' = 'order_02',\n" +"  'sink.buffer-flush.max-rows' = '1',\n" +"  'sink.buffer-flush.interval' = '1s',\n" +"  'sink.max-retries' = '3' \n"+")");tEnv.executeSql("INSERT INTO account.order_02 (id, order_id, amount, remark)\n" +" select t1.id,\n" +"       t1.order_id,\n" +"       t1.amount,\n" +"       t1.remark\n" +" from account.order_01 t1 \n");env.execute();}
}

pom文件
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xxx.demo</groupId><artifactId>FlinkDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><scala.version>2.12</scala.version><java.version>8</java.version><flink.version>1.19.1</flink.version><fastjson.version>1.2.62</fastjson.version><hadoop.version>2.8.3</hadoop.version><scope.mode>compile</scope.mode><slf4j.version>1.7.30</slf4j.version></properties><dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-scala-bridge_${scala.version}</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-java-bridge</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-java</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-planner_${scala.version}</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-scala_${scala.version}</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-clients</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-files</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-csv</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc</artifactId><version>3.2.0-1.19</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-kafka</artifactId><version>3.2.0-1.19</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- Add log dependencies when debugging locally --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web</artifactId><version>${flink.version}</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.7</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>compile</scope></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-runtime</artifactId><version>${flink.version}</version></dependency><!-- Test dependencies --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-test-utils</artifactId><version>${flink.version}</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-statebackend-rocksdb</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.doris</groupId><artifactId>flink-doris-connector-1.15</artifactId><version>1.2.1</version></dependency><dependency><groupId>com.ververica</groupId><artifactId>flink-connector-mysql-cdc</artifactId><version>3.0.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>8</source><target>8</target></configuration></plugin><!-- 打fatjar配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><archive><manifest><!--这里指定要运行的main类--><mainClass>com.xxx.demo.AccountVoucherSumaryDWSSQL</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id> <!-- 此处指定继承合并 --><phase>package</phase> <!-- 绑定到打包阶段 --><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>

完成之后,通过maven来打包。

上传包到flink下examples目录下,这里也新建一个目录CDC

通过以下命令来运行

./bin/flink run examples/cdc/FlinkDemo-1.0-SNAPSHOT-jar-with-dependencies.jar

上面两种运行方式运行之后,都可以去Flink的Web页面查看到运行的任务。

五,小结

上面只是搭建了Flink,并运行了示例项目,初步体验了一下Flink的功能,还完全到不了实际项目中运用的程度。后续会一步步去探索Flink在项目中应用的技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 问题概述 原因 解决方案 解决方法 潜在问题修改 最终效果呈现 额外内容 管理员界面路由配置 WebStorm背景更换 法一&#xff1a; 法二&#xff1a; 问题概…

MCU面试题

面试题 1、Crotex-M 处理器才用的架构是"v7" Cortex-M3处理器是基于ARMv7-M架构的处理器&#xff0c;支持更丰富的指令集&#xff0c;包括许多32位指令&#xff0c;这些指令可以高效的使用高位寄存器。另外&#xff0c;M3还支持&#xff1a; 查表跳转指令和条件执行&…

Mysql COUNT() 函数详解

在使用Mysql的时候&#xff0c;作为开发者&#xff0c;聚合函数是肯定会用到的&#xff0c;下面就来说说我们常用到的统计行数的聚合函数 COUNT()。 COUNT() 的几种用法 说到COUNT() 函数&#xff0c;最常用的几种方法就是 COUNT(*) 、COUNT(1)、 COUNT(column)&#xff0c;那…

基于SSM的图书馆座位预约系统+lw示例参考

#1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、座位管理、座位分类管理、图书馆管理、预约信息管理、退座管理、系统管理等&#xff09;、普通用户&#xff08;信息查看、图书馆管理、个人中心、座位预约等&#xff09;技…

【数字图像处理+MATLAB】计算并显示灰度图像的直方图(Histogram):使用 imhist 函数

引言 imhist 是 MATLAB 中的一个函数&#xff0c;用于计算并显示图像的直方图。 直方图是一种统计工具&#xff0c;用于显示图像中各个亮度级别的像素数量。直方图的垂直轴表示像素数量&#xff0c;水平轴表示亮度级别。 函数详解 基本语法&#xff1a; imhist(I) imhist(I…

了解云计算工作负载保护的重要性及必要性

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的&#xff0c;但专门设计用于服务器环境&#xff0c;而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…

0. 渲染游戏画面

1 用到的函数 # initialize env env gym.make() frame env.render() frame np.transpose(frame, (1, 0, 2)) # 调整图像方向 frame pygame.surfarray.make_surface(frame) screen.blit(frame, (0, 0)) pygame.display.flip()1.1 检查图像的形状 首先&#xff0c;我们…

【西藏】《西藏自治区本级政务信息化项目建设和运维费用预算支出标准》(藏财建〔2024〕68号)-省市费用标准解读系列08

2024年9月1日&#xff0c;西藏自治区财政厅和经济和信息化厅正式施行最新信息化建设和运维项目预算支出标准《西藏自治区本级政务信息化项目建设和运维费用预算支出标准》&#xff08;藏财建〔2024〕68号&#xff09;&#xff08;以下简称“68号文”&#xff09;。同时&#xf…

Autosar CP Transformer规范工作原理和应用场景导读

一、AUTOSAR规范中Transformer的主要功能和分类 &#xff08;一&#xff09;主要功能 数据转换与处理 从运行时环境&#xff08;RTE&#xff09;获取数据&#xff0c;进行序列化&#xff08;将复杂数据结构转换为线性字节数组&#xff09;或其他转换操作&#xff08;如添加校…

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…

天津营业执照注销流程

营业执照不注销会有什么影响&#xff1f;1、公司不经营&#xff0c;放几年自动注销&#xff1f;真相&#xff1a;不管放多长时间&#xff0c;公司是不会自动注销的。相反&#xff0c;放任长久不维护&#xff0c;公司会出现异常&#xff0c;营业执照被吊销&#xff0c;公司股东、…

MySQL数据库专栏(五)连接MySQL数据库C API篇

摘要 本篇文章主要介绍通过C语言API接口链接MySQL数据库&#xff0c;各接口功能及使用方式&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、环境配置 1.1、添加头文件 1.2、添加库目录 2、接口介绍 2.1、MySql初始化及数据清理 2.1.…

计算机课程管理:Spring Boot实现的工程认证路径

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足&#xff0c;创建了一个计算机管理基于工程教育认…

【无人机设计与控制】无人机集群路径规划:5种最新优化算法(ECO、AOA、SFOA、MGO、PLO)求解无人机集群路径规划

摘要 本文提出了基于无人机集群路径规划的研究&#xff0c;通过使用五种最新优化算法&#xff08;ECO、AOA、SFOA、MGO、PLO&#xff09;进行求解。这些算法主要优化无人机在复杂环境中的路径&#xff0c;以实现多目标规划问题的高效解。实验结果表明&#xff0c;不同算法在收…

从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色&#xff1a; publisher&#xff1a;生产者 consumer&#xff1a;消费者 exchange个&#xff1a;交换机&#xff0c;负责消息路由 queue&#xff1a;队列…

牧神记开分9.7,2024新国漫巅峰出现了

现在国漫越来越卷了&#xff0c;卷播放量也卷评分。最近&#xff0c;b站上线不久的国漫《牧神记》开分9.7&#xff0c;口碑还是相当不错的&#xff0c;已经和《凡人修仙传》评分齐平。这部国漫仅仅播出4集&#xff0c;为什么就能获得这么高的评分呢&#xff1f;下面就一起来看看…

了解GPT大模型,读这本书就够了!(文末送书)

小异最近发现&#xff0c;当国外OpenAI的权力的游戏反转再反转的时候&#xff0c;国内的AI创业者们除了吃瓜之外也没闲着。 有很多程序员正在AIGC赛道中默默发财&#xff0c;有通过短视频做内容爆火&#xff0c;接广告的&#xff1b;有卖AI解决方案的&#xff1b;有卖AI课程的…

〔 MySQL 〕数据库基础

1. 数据库基础&#xff08;重点&#xff09; 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库?文件保存数据有以下几个缺点&#xff1a; ● 文件的安全性问题 ● 文件不利于数据查询和管理 ● 文件不利于存储海量数据 …