马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
弁言:如今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 创建数据库和测试数据
数据库脚本:
- CREATE DATABASE `flinktest`;
- USE `flinktest`;
- CREATE TABLE `products` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(255) NOT NULL,
- `description` varchar(512) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
- insert into `products`(`id`,`name`,`description`) values
- (1,'aaa','aaaa'),
- (2,'ccc','ccc'),
- (3,'dd','ddd'),
- (4,'eeee','eee'),
- (5,'ffff','ffff'),
- (6,'hhhh','hhhh'),
- (7,'iiii','iiii'),
- (8,'jjjj','jjjj');
复制代码 账号利用root就行。
1.2 开启binlog
参考:
踩坑:测试过程中发现mysql 9.0不停无法获取更新的数据,终极利用的5.7。
2.编码
2.1 EnvUtil实现
EnvUtil用于创建flink的运行环境。
- package com.zl.utils;
- import org.apache.flink.api.common.restartstrategy.RestartStrategies;
- import org.apache.flink.api.common.time.Time;
- import org.apache.flink.configuration.Configuration;
- import org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackend;
- import org.apache.flink.streaming.api.CheckpointingMode;
- import org.apache.flink.streaming.api.environment.CheckpointConfig;
- import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
- import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
- import java.time.Duration;
- import java.time.ZoneOffset;
- import java.util.concurrent.TimeUnit;
- /**
- * EnvUtil
- * @description:
- */
- public class EnvUtil {
- /**
- * 设置flink执行环境
- * @param parallelism 并行度
- */
- public static StreamExecutionEnvironment setFlinkEnv(int parallelism) {
- // System.setProperty("HADOOP_USER_NAME", "用户名") 对应的是 hdfs文件系统目录下的路径:/user/用户名的文件夹名,本文为root
- System.setProperty("HADOOP_USER_NAME", "root");
- Configuration conf = new Configuration();
- conf.setInteger("rest.port", 1000);
- StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
- if (parallelism >0 ){
- //设置并行度
- env.setParallelism(parallelism);
- } else {
- env.setParallelism(1);// 默认1
- }
- // 添加重启机制
- env.setRestartStrategy(RestartStrategies.fixedDelayRestart(50, Time.minutes(6)));
- // 启动checkpoint,设置模式为精确一次 (这是默认值),10*60*1000=60000
- env.enableCheckpointing(600000, CheckpointingMode.EXACTLY_ONCE);
- //rocksdb状态后端,启用增量checkpoint
- env.setStateBackend(new EmbeddedRocksDBStateBackend(true));
- //设置checkpoint路径
- CheckpointConfig checkpointConfig = env.getCheckpointConfig();
- // 同一时间只允许一个 checkpoint 进行(默认)
- checkpointConfig.setMaxConcurrentCheckpoints(1);
- //最小间隔,10*60*1000=60000
- checkpointConfig.setMinPauseBetweenCheckpoints(60000);
- // 取消任务后,checkpoint仍然保存
- checkpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
- //checkpoint容忍失败的次数
- checkpointConfig.setTolerableCheckpointFailureNumber(5);
- //checkpoint超时时间 默认10分钟
- checkpointConfig.setCheckpointTimeout(TimeUnit.MINUTES.toMillis(10));
- //禁用operator chain(方便排查反压)
- env.disableOperatorChaining();
- return env;
- }
- public static StreamTableEnvironment getFlinkTenv(StreamExecutionEnvironment env) {
- StreamTableEnvironment tenv = StreamTableEnvironment.create(env);
- //设置时区 东八
- tenv.getConfig().setLocalTimeZone(ZoneOffset.ofHours(8));
- Configuration configuration = tenv.getConfig().getConfiguration();
- // 开启miniBatch
- configuration.setString("table.exec.mini-batch.enabled", "true");
- // 批量输出的间隔时间
- configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
- // 防止OOM设置每个批次最多缓存数据的条数,可以设为2万条
- configuration.setString("table.exec.mini-batch.size", "20000");
- // 开启LocalGlobal
- configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE");
- //设置TTL API指定
- tenv.getConfig().setIdleStateRetention(Duration.ofHours(25));
- return tenv;
- }
- }
复制代码 2.2 核心代码
- package com.zl;
- import com.ververica.cdc.connectors.mysql.source.MySqlSource;
- import com.ververica.cdc.connectors.mysql.table.StartupOptions;
- import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
- import com.zl.utils.EnvUtil;
- import org.apache.flink.api.common.eventtime.WatermarkStrategy;
- import org.apache.flink.api.common.restartstrategy.RestartStrategies;
- import org.apache.flink.api.common.time.Time;
- import org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackend;
- import org.apache.flink.streaming.api.CheckpointingMode;
- import org.apache.flink.streaming.api.environment.CheckpointConfig;
- import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
- import java.util.Arrays;
- import java.util.List;
- import java.util.concurrent.TimeUnit;
- public class MysqlExampleDatastream {
- public static void main(String[] args) throws Exception {
- List<String> SYNC_TABLES = Arrays.asList("flinktest1.products");
- MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
- .hostname("10.86.37.169")
- .port(3306)
- .databaseList("flinktest1")
- .tableList(String.join(",", SYNC_TABLES))
- .username("root")
- .password("pwd")// 记得修改为实际密码
- .startupOptions(StartupOptions.initial())
- .deserializer(new JsonDebeziumDeserializationSchema())
- .build();
- // 配置运行环境,并行度1
- StreamExecutionEnvironment env = EnvUtil.setFlinkEnv(1);
- // 程序间隔离,每个程序单独设置
- env.getCheckpointConfig().setCheckpointStorage("hdfs://10.86.97.191:9000/flinktest/MysqlExampleDatastream");
- // 如果不能正常读取mysql的binlog:①可能是mysql没有打开binlog或者mysql版本不支持(当前在mysql5.7.20环境下,功能正常);
- // ②可能是数据库ip、port、账号、密码错误。
- env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
- .setParallelism(1).print();
- env.execute("Print MySQL Snapshot + Binlog");
- }
- }
复制代码 2.3 依靠
完备代码见:https://gitee.com/core815/flink-cdc-mysql
3.打包
mvn版本:3.5.4。
到pom.xml所在路径,实行“mvn package”
打包效果:
4.jar直接运行
- 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”路径下。
实行下面下令:
- 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
办理:
- 临时解决
- 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/
|