一文说清flink从编码到摆设上线

[复制链接]
发表于 2025-12-12 15:21:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
弁言:如今flink的文章比力多,但一样寻常都关注某一特定方面,很少有一个文章,从一个简朴的例子入手,说清楚从编码、构建、摆设全流程是怎么样的。以是编写本文,本身做个纪录备查同时跟各人分享一下。本文以简朴的mysql cdc为例睁开阐明。
    环境阐明:MySQL:5.7;flink:1.14.0;hadoop:3.0.0;操纵体系:CentOS 7.6;JDK:1.8.0_401。
  1.MySQL

1.1 创建数据库和测试数据

数据库脚本:
  1. CREATE DATABASE `flinktest`;
  2. USE `flinktest`;
  3. CREATE TABLE `products` (
  4.   `id` int(11) NOT NULL AUTO_INCREMENT,
  5.   `name` varchar(255) NOT NULL,
  6.   `description` varchar(512) DEFAULT NULL,
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
  9. insert  into `products`(`id`,`name`,`description`) values
  10. (1,'aaa','aaaa'),
  11. (2,'ccc','ccc'),
  12. (3,'dd','ddd'),
  13. (4,'eeee','eee'),
  14. (5,'ffff','ffff'),
  15. (6,'hhhh','hhhh'),
  16. (7,'iiii','iiii'),
  17. (8,'jjjj','jjjj');
复制代码
账号利用root就行。
1.2 开启binlog

参考:
踩坑:测试过程中发现mysql 9.0不停无法获取更新的数据,终极利用的5.7。
2.编码

2.1 EnvUtil实现

EnvUtil用于创建flink的运行环境。
  1. package com.zl.utils;
  2. import org.apache.flink.api.common.restartstrategy.RestartStrategies;
  3. import org.apache.flink.api.common.time.Time;
  4. import org.apache.flink.configuration.Configuration;
  5. import org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackend;
  6. import org.apache.flink.streaming.api.CheckpointingMode;
  7. import org.apache.flink.streaming.api.environment.CheckpointConfig;
  8. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  9. import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
  10. import java.time.Duration;
  11. import java.time.ZoneOffset;
  12. import java.util.concurrent.TimeUnit;
  13. /**
  14. * EnvUtil
  15. * @description:
  16. */
  17. public class EnvUtil {
  18.     /**
  19.      * 设置flink执行环境
  20.      * @param parallelism 并行度
  21.      */
  22.     public static StreamExecutionEnvironment setFlinkEnv(int parallelism) {
  23.         // System.setProperty("HADOOP_USER_NAME", "用户名") 对应的是 hdfs文件系统目录下的路径:/user/用户名的文件夹名,本文为root
  24.         System.setProperty("HADOOP_USER_NAME", "root");
  25.         Configuration conf = new Configuration();
  26.         conf.setInteger("rest.port", 1000);
  27.         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
  28.         if (parallelism >0 ){
  29.             //设置并行度
  30.             env.setParallelism(parallelism);
  31.         } else {
  32.             env.setParallelism(1);// 默认1
  33.         }
  34.         // 添加重启机制
  35.         env.setRestartStrategy(RestartStrategies.fixedDelayRestart(50, Time.minutes(6)));
  36.         // 启动checkpoint,设置模式为精确一次 (这是默认值),10*60*1000=60000
  37.         env.enableCheckpointing(600000, CheckpointingMode.EXACTLY_ONCE);
  38.         //rocksdb状态后端,启用增量checkpoint
  39.         env.setStateBackend(new EmbeddedRocksDBStateBackend(true));
  40.         //设置checkpoint路径
  41.         CheckpointConfig checkpointConfig = env.getCheckpointConfig();
  42.         // 同一时间只允许一个 checkpoint 进行(默认)
  43.         checkpointConfig.setMaxConcurrentCheckpoints(1);
  44.         //最小间隔,10*60*1000=60000
  45.         checkpointConfig.setMinPauseBetweenCheckpoints(60000);
  46.         // 取消任务后,checkpoint仍然保存
  47.         checkpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
  48.         //checkpoint容忍失败的次数
  49.         checkpointConfig.setTolerableCheckpointFailureNumber(5);
  50.         //checkpoint超时时间 默认10分钟
  51.         checkpointConfig.setCheckpointTimeout(TimeUnit.MINUTES.toMillis(10));
  52.         //禁用operator chain(方便排查反压)
  53.         env.disableOperatorChaining();
  54.         return env;
  55.     }
  56.     public static StreamTableEnvironment getFlinkTenv(StreamExecutionEnvironment env) {
  57.         StreamTableEnvironment tenv = StreamTableEnvironment.create(env);
  58.         //设置时区 东八
  59.         tenv.getConfig().setLocalTimeZone(ZoneOffset.ofHours(8));
  60.         Configuration configuration = tenv.getConfig().getConfiguration();
  61.         // 开启miniBatch
  62.         configuration.setString("table.exec.mini-batch.enabled", "true");
  63.         // 批量输出的间隔时间
  64.         configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
  65.         // 防止OOM设置每个批次最多缓存数据的条数,可以设为2万条
  66.         configuration.setString("table.exec.mini-batch.size", "20000");
  67.         // 开启LocalGlobal
  68.         configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE");
  69.         //设置TTL API指定
  70.         tenv.getConfig().setIdleStateRetention(Duration.ofHours(25));
  71.         return tenv;
  72.     }
  73. }
复制代码
2.2 核心代码

  1. package com.zl;
  2. import com.ververica.cdc.connectors.mysql.source.MySqlSource;
  3. import com.ververica.cdc.connectors.mysql.table.StartupOptions;
  4. import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
  5. import com.zl.utils.EnvUtil;
  6. import org.apache.flink.api.common.eventtime.WatermarkStrategy;
  7. import org.apache.flink.api.common.restartstrategy.RestartStrategies;
  8. import org.apache.flink.api.common.time.Time;
  9. import org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackend;
  10. import org.apache.flink.streaming.api.CheckpointingMode;
  11. import org.apache.flink.streaming.api.environment.CheckpointConfig;
  12. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  13. import java.util.Arrays;
  14. import java.util.List;
  15. import java.util.concurrent.TimeUnit;
  16. public class MysqlExampleDatastream {
  17.     public static void main(String[] args) throws Exception {
  18.         List<String> SYNC_TABLES = Arrays.asList("flinktest1.products");
  19.         MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
  20.                 .hostname("10.86.37.169")
  21.                 .port(3306)
  22.                 .databaseList("flinktest1")
  23.                 .tableList(String.join(",", SYNC_TABLES))
  24.                 .username("root")
  25.                 .password("pwd")// 记得修改为实际密码
  26.                 .startupOptions(StartupOptions.initial())
  27.                 .deserializer(new JsonDebeziumDeserializationSchema())
  28.                 .build();
  29.         // 配置运行环境,并行度1
  30.         StreamExecutionEnvironment env = EnvUtil.setFlinkEnv(1);
  31.         // 程序间隔离,每个程序单独设置
  32.         env.getCheckpointConfig().setCheckpointStorage("hdfs://10.86.97.191:9000/flinktest/MysqlExampleDatastream");
  33.         // 如果不能正常读取mysql的binlog:①可能是mysql没有打开binlog或者mysql版本不支持(当前在mysql5.7.20环境下,功能正常);
  34.         // ②可能是数据库ip、port、账号、密码错误。
  35.         env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
  36.                 .setParallelism(1).print();
  37.         env.execute("Print MySQL Snapshot + Binlog");
  38.     }
  39. }
复制代码
2.3 依靠

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4.          http://maven.apache.org/maven-v4_0_0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>com.zl.flinkcdc</groupId>
  7.     <artifactId>FlickCDC</artifactId>
  8.     <packaging>jar</packaging>
  9.     <version>1.0-SNAPSHOT</version>
  10.     <name>FlickCDC</name>
  11.     <properties>
  12.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14.         <maven.compiler.source>8</maven.compiler.source>
  15.         <maven.compiler.target>8</maven.compiler.target>
  16.         <flink-version>1.14.0</flink-version>
  17.         <flink-cdc-version>2.4.0</flink-cdc-version>
  18.         <hadoop.version>3.0.0</hadoop.version>
  19.         <slf4j.version>1.7.25</slf4j.version>
  20.         <log4j.version>2.16.0</log4j.version>
  21.     </properties>
  22.     <dependencies>
  23.         <dependency>
  24.             <groupId>junit</groupId>
  25.             <artifactId>junit</artifactId>
  26.             <version>3.8.1</version>
  27.             <scope>test</scope>
  28.         </dependency>
  29.         <dependency>
  30.             <groupId>org.apache.flink</groupId>
  31.             <artifactId>flink-java</artifactId>
  32.             <version>${flink-version}</version>
  33.         </dependency>
  34.         <dependency>
  35.             <groupId>org.apache.flink</groupId>
  36.             <artifactId>flink-streaming-java_2.11</artifactId>
  37.             <version>${flink-version}</version>
  38.         </dependency>
  39.         <dependency>
  40.             <groupId>com.ververica</groupId>
  41.             <artifactId>flink-connector-mysql-cdc</artifactId>
  42.             <version>${flink-cdc-version}</version>
  43.         </dependency>
  44.         <dependency>
  45.             <groupId>org.apache.flink</groupId>
  46.             <artifactId>flink-shaded-guava</artifactId>
  47.             <version>30.1.1-jre-15.0</version>
  48.         </dependency>
  49.         <!--<dependency>
  50.             <groupId>org.apache.flink</groupId>
  51.             <artifactId>flink-shaded-guava</artifactId>
  52.             <version>18.0-13.0</version>
  53.         </dependency>-->
  54.         <dependency>
  55.             <groupId>org.apache.flink</groupId>
  56.             <artifactId>flink-connector-base</artifactId>
  57.             <version>${flink-version}</version>
  58.         </dependency>
  59.         <dependency>
  60.             <groupId>org.apache.flink</groupId>
  61.             <artifactId>flink-clients_2.11</artifactId>
  62.             <version>${flink-version}</version>
  63.         </dependency>
  64.         <dependency>
  65.             <groupId>org.apache.flink</groupId>
  66.             <artifactId>flink-table-common</artifactId>
  67.             <version>${flink-version}</version>
  68.         </dependency>
  69.         <dependency>
  70.             <groupId>org.apache.flink</groupId>
  71.             <artifactId>flink-runtime-web_2.11</artifactId>
  72.             <version>${flink-version}</version>
  73.         </dependency>
  74.         <!--        hadoop相关依赖-->
  75.         <dependency>
  76.             <groupId>org.apache.hadoop</groupId>
  77.             <artifactId>hadoop-client</artifactId>
  78.             <version>${hadoop.version}</version>
  79.             <scope>provided</scope>
  80.             <exclusions>
  81.                 <exclusion>
  82.                     <artifactId>commons-cli</artifactId>
  83.                     <groupId>commons-cli</groupId>
  84.                 </exclusion>
  85.                 <exclusion>
  86.                     <artifactId>commons-compress</artifactId>
  87.                     <groupId>org.apache.commons</groupId>
  88.                 </exclusion>
  89.                 <exclusion>
  90.                     <artifactId>guava</artifactId>
  91.                     <groupId>com.google.guava</groupId>
  92.                 </exclusion>
  93.                 <exclusion>
  94.                     <artifactId>jackson-annotations</artifactId>
  95.                     <groupId>com.fasterxml.jackson.core</groupId>
  96.                 </exclusion>
  97.                 <exclusion>
  98.                     <artifactId>jackson-core</artifactId>
  99.                     <groupId>com.fasterxml.jackson.core</groupId>
  100.                 </exclusion>
  101.                 <exclusion>
  102.                     <artifactId>jackson-databind</artifactId>
  103.                     <groupId>com.fasterxml.jackson.core</groupId>
  104.                 </exclusion>
  105.                 <exclusion>
  106.                     <artifactId>slf4j-api</artifactId>
  107.                     <groupId>org.slf4j</groupId>
  108.                 </exclusion>
  109.             </exclusions>
  110.         </dependency>
  111.         <dependency>
  112.             <groupId>org.apache.hadoop</groupId>
  113.             <artifactId>hadoop-common</artifactId>
  114.             <version>${hadoop.version}</version>
  115.             <scope>provided</scope>
  116.             <exclusions>
  117.                 <exclusion>
  118.                     <artifactId>asm</artifactId>
  119.                     <groupId>org.ow2.asm</groupId>
  120.                 </exclusion>
  121.                 <exclusion>
  122.                     <artifactId>avro</artifactId>
  123.                     <groupId>org.apache.avro</groupId>
  124.                 </exclusion>
  125.                 <exclusion>
  126.                     <artifactId>commons-cli</artifactId>
  127.                     <groupId>commons-cli</groupId>
  128.                 </exclusion>
  129.                 <exclusion>
  130.                     <artifactId>commons-codec</artifactId>
  131.                     <groupId>commons-codec</groupId>
  132.                 </exclusion>
  133.                 <exclusion>
  134.                     <artifactId>commons-compress</artifactId>
  135.                     <groupId>org.apache.commons</groupId>
  136.                 </exclusion>
  137.                 <exclusion>
  138.                     <artifactId>commons-io</artifactId>
  139.                     <groupId>commons-io</groupId>
  140.                 </exclusion>
  141.                 <exclusion>
  142.                     <artifactId>commons-lang3</artifactId>
  143.                     <groupId>org.apache.commons</groupId>
  144.                 </exclusion>
  145.                 <exclusion>
  146.                     <artifactId>commons-logging</artifactId>
  147.                     <groupId>commons-logging</groupId>
  148.                 </exclusion>
  149.                 <exclusion>
  150.                     <artifactId>commons-math3</artifactId>
  151.                     <groupId>org.apache.commons</groupId>
  152.                 </exclusion>
  153.                 <exclusion>
  154.                     <artifactId>guava</artifactId>
  155.                     <groupId>com.google.guava</groupId>
  156.                 </exclusion>
  157.                 <exclusion>
  158.                     <artifactId>jackson-databind</artifactId>
  159.                     <groupId>com.fasterxml.jackson.core</groupId>
  160.                 </exclusion>
  161.                 <exclusion>
  162.                     <artifactId>jaxb-api</artifactId>
  163.                     <groupId>javax.xml.bind</groupId>
  164.                 </exclusion>
  165.                 <exclusion>
  166.                     <artifactId>log4j</artifactId>
  167.                     <groupId>log4j</groupId>
  168.                 </exclusion>
  169.                 <exclusion>
  170.                     <artifactId>nimbus-jose-jwt</artifactId>
  171.                     <groupId>com.nimbusds</groupId>
  172.                 </exclusion>
  173.                 <exclusion>
  174.                     <artifactId>slf4j-api</artifactId>
  175.                     <groupId>org.slf4j</groupId>
  176.                 </exclusion>
  177.                 <exclusion>
  178.                     <artifactId>slf4j-log4j12</artifactId>
  179.                     <groupId>org.slf4j</groupId>
  180.                 </exclusion>
  181.                 <exclusion>
  182.                     <artifactId>zookeeper</artifactId>
  183.                     <groupId>org.apache.zookeeper</groupId>
  184.                 </exclusion>
  185.                 <exclusion>
  186.                     <artifactId>jsr305</artifactId>
  187.                     <groupId>com.google.code.findbugs</groupId>
  188.                 </exclusion>
  189.                 <exclusion>
  190.                     <artifactId>gson</artifactId>
  191.                     <groupId>com.google.code.gson</groupId>
  192.                 </exclusion>
  193.             </exclusions>
  194.         </dependency>
  195.         <dependency>
  196.             <groupId>org.apache.hadoop</groupId>
  197.             <artifactId>hadoop-hdfs</artifactId>
  198.             <version>${hadoop.version}</version>
  199.             <scope>provided</scope>
  200.             <exclusions>
  201.                 <exclusion>
  202.                     <artifactId>commons-cli</artifactId>
  203.                     <groupId>commons-cli</groupId>
  204.                 </exclusion>
  205.                 <exclusion>
  206.                     <artifactId>guava</artifactId>
  207.                     <groupId>com.google.guava</groupId>
  208.                 </exclusion>
  209.                 <exclusion>
  210.                     <artifactId>jackson-databind</artifactId>
  211.                     <groupId>com.fasterxml.jackson.core</groupId>
  212.                 </exclusion>
  213.             </exclusions>
  214.         </dependency>
  215.         <dependency>
  216.             <groupId>commons-cli</groupId>
  217.             <artifactId>commons-cli</artifactId>
  218.             <version>1.5.0</version>
  219.         </dependency>
  220.         <!--mvn install:install-file -Dfile
  221.         =D:/maven/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar
  222.        -DgroupId=org.apache.flink -DartifactId
  223.        =flink-shaded-hadoop-3 -Dversion=3.1.1.7.2.9.0-173-9.0 -Dpackaging=jar-->
  224.         <dependency>
  225.             <groupId>org.apache.flink</groupId>
  226.             <artifactId>flink-shaded-hadoop-3</artifactId>
  227.             <version>3.1.1.7.2.9.0-173-9.0</version>
  228.         </dependency>
  229.     </dependencies>
  230.     <build>
  231.         <plugins>
  232.             <plugin>
  233.                 <groupId>org.apache.maven.plugins</groupId>
  234.                 <artifactId>maven-assembly-plugin</artifactId>
  235.                 <version>3.0.0</version>
  236.                 <configuration>
  237.                     <descriptorRefs>
  238.                         <descriptorRef>jar-with-dependencies</descriptorRef>
  239.                     </descriptorRefs>
  240.                     <archive>
  241.                         <manifest>
  242.                             <addClasspath>true</addClasspath>
  243.                             <mainClass>com.zl.MysqlExampleDatastream</mainClass>
  244.                         </manifest>
  245.                     </archive>
  246.                 </configuration>
  247.                 <executions>
  248.                     <execution>
  249.                         <id>make-assembly</id>
  250.                         <phase>package</phase>
  251.                         <goals>
  252.                             <goal>single</goal>
  253.                         </goals>
  254.                     </execution>
  255.                 </executions>
  256.             </plugin>
  257.         </plugins>
  258.     </build>
  259. </project>
复制代码
完备代码见:https://gitee.com/core815/flink-cdc-mysql
3.打包

mvn版本:3.5.4。
到pom.xml所在路径,实行“mvn package”

打包效果:

4.jar直接运行

  1. java -jar FlickCDC-1.0-SNAPSHOT-jar-with-dependencies.jar
复制代码

5.flink yarn运行

hadoop、flink、yarn环境见:
把FlickCDC-1.0-SNAPSHOT-jar-with-dependencies.jar放到“/home”路径下。
实行下面下令:
  1. flink run-application -t yarn-application -Dparallelism.default=1 -Denv.java.opts=" -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" -Dtaskmanager.memory.process.size=1g -Dyarn.application.name="FlinkCdcMysql"  -Dtaskmanager.numberOfTaskSlots=1 -c com.zl.MysqlExampleDatastream /home/FlickCDC-1.0-SNAPSHOT-jar-with-dependencies.jar
复制代码
控制台看到如下打印:

yarn管理页面:

运行日记检察步调:




下面即可看到完备日记:

6.常见题目

6.1 题目1

日记错误:
The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone Asia/Shanghai. Specify the right server-time-zone to avoid inconsistencies for time-related fields.
办理:
修改my.cnf文件。
[mysqld]
default-time-zone=‘Asia/Shanghai’
重启MySQL服务。
6.2 题目2:hdfs

日记错误:
Permission denied: user=PC2023, access=WRITE, inode=“/”:root:supergroup:drwxr-xr-x
办理:
  1. 临时解决
  2. hadoop fs -chmod -R 777 /
复制代码
6.3 题目3:guava30 guava18辩论

分析:
flink 1.13 cdc2.3的组合轻易出这个题目。
办理:
参考:https://developer.aliyun.com/ask/574901
flink 利用1.14.0版本;cdc利用2.4.0版本。
6.4 题目4

日记错误:
/user/root/.flink/application_1733492706887_0002/log4j.properties could only be written to 0 of the 1 minReplication nodes
办理:
https://www.pianshen.com/article/1554707968/
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表