flinkcdc streaming 同步数据到es记录过程

背景

边记录边操作,目前有对应的需求考虑到采用ES来对业务提供查询接口使用。采用实时方案写入ES,通过FlinkCDC3.5读取mysql直接sink到ES。

配置依赖说明

为什么选择3.5,目前我看官网发布的最新是3.6,奈何我司的集群环境是jdk8所以只能选择了3.5。

  1. flink-sql-connector-mysql-cdc 依赖读取mysql binlog
  2. flink-connector-elasticsearch7 为啥是7.x版本,flink官网提供的最后一个ES支持版本为7.x,当时我们安装了ES9.x版本,结果就是我们集群的机器jdk是1.8,而ES的依赖是jdk17编译的,所以导致不兼容。最后的方案就是降级ES到7.x。
  3. flink 选择是1.20 也是最后jdk1.8的版本了吧。2.0以后得11起步了。

代码开发

读取mysql

java 复制代码
Properties debeziumProperties = new Properties();
        debeziumProperties.put("snapshot.locking.mode", "none");      // 避免锁表
        debeziumProperties.put("decimal.handling.mode", "string");    // Decimal 转 String
        debeziumProperties.put("bigint.unsigned.handling.mode", "long"); // 无符号 bigint 转 long
        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                //.startupOptions(StartupOptions.timestamp(1667232000000L))
                .hostname(MysqlConstant.SM_TEST_HOST)
                .port(MysqlConstant.CMMON_PORT)
                .databaseList(库名) // 设置捕获的数据库, 如果需要同步整个数据库,请将 tableList 设置为 ".*".
                .tableList(库 + "." + 表) // 设置捕获的表
                .username(MysqlConstant.SM_USER_NAME)
                .password(MysqlConstant.SM_PASSWORD)
                .startupOptions(StartupOptions.initial()) // initial: 先快照后增量
                .deserializer(new JsonDebeziumDeserializationSchema()) // 将 SourceRecord 转换为 JSON 字符串
                .debeziumProperties(debeziumProperties)
                .build();

写入ES sink

sink就是按照flink官网提供的就可以 https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/connectors/datastream/elasticsearch/

java 复制代码
HttpHost[] hosts = new HttpHost[]{
                new HttpHost(ESApiConstant.SERVER_IP1, ESApiConstant.SERVER_PORT, ESApiConstant.SERVER_PROTOCOL)
                , new HttpHost(ESApiConstant.SERVER_IP2, ESApiConstant.SERVER_PORT, ESApiConstant.SERVER_PROTOCOL)
                , new HttpHost(ESApiConstant.SERVER_IP3, ESApiConstant.SERVER_PORT, ESApiConstant.SERVER_PROTOCOL)
        };

        // ES 配置
        ElasticsearchSinkConfig config = ElasticsearchSinkConfig.builder()
                .indexName("test-" + LocalDate.now().getYear())
                .idField("id")
                .hosts(hosts)
                .bulkActions(1000)
                .bulkIntervalMs(5000)
                .maxRetries(5)
                .retryDelayMs(1000)
                .build();


        DataStream<Elasticsearch7Sink.CDCRequest> esRequests = mySQLSource
                .map(new CDCToESRequestMapper(config.getIndexName(), config.getIdField()))
                .filter(request -> request != null);

        esRequests.sinkTo(
                new Elasticsearch7SinkBuilder<Elasticsearch7Sink.CDCRequest>()
                        .setHosts(config.getHosts())
                        .setConnectionUsername(ESApiConstant.USER_NAME)
                        .setConnectionPassword(ESApiConstant.USER_PASSWORD)
                        .setEmitter((request, context, indexer) -> {
                            switch (request.getType()) {
                                case INDEX:
                                    indexer.add(request.getIndexRequest());
                                    break;
                                case UPDATE:
                                    indexer.add(request.getUpdateRequest());
                                    break;
                                case DELETE:
                                    indexer.add(request.getDeleteRequest());
                                    break;
                            }
                        })
                        .setBulkFlushMaxActions(config.getBulkActions())
                        .setBulkFlushInterval(config.getBulkIntervalMs())
                        .setBulkFlushBackoffStrategy(
                                FlushBackoffType.EXPONENTIAL,
                                config.getMaxRetries(),
                                config.getRetryDelayMs()
                        )
                        .build()
        ).setParallelism(1);

提交任务

  1. 完成以上的工作就可以提交任务了 打包jar,部署我选择是Streampark提交任务。

`

总结

使用Streaming开发流程自主控制性比较大,主要就是环境中ar冲突的问题。实践为王,光想为寇。边做边记,下次直接复制粘贴就可以了,千里之行始于足下。

相关推荐
Raas10042 分钟前
MAIGateway,魔芋企业级AI网关的安全基建化设计
大数据·人工智能·网关·网络安全·api网关·mai gateway·魔芋
Anita-lee1 小时前
泛娱乐出海 APP 运营研究:用户量下滑成因与多语种客服数据化运营解决方案
大数据·产品运营·服务发现·娱乐
笨鸟先飞,勤能补拙1 小时前
AI Agent应用领域深度解析:从概念到落地的全维度审视
大数据·人工智能·python·物联网·安全·网络安全·github
Francek Chen1 小时前
【大数据处理与分析】数据仓库Hive:02 数据湖
大数据·数据仓库·hive·hadoop·分布式·数据分析
IT小白杨1 小时前
从Chromium重构到真实ARM云手机:多账号隔离方案的技术演进
大数据·经验分享·智能手机·重构·安全架构·指纹浏览器
躺柒2 小时前
读数据可视化01可视化简史
大数据·信息可视化·数据分析·数据可视化·视觉
Elastic 中国社区官方博客2 小时前
用两行 JSON 替换你的 ILM 策略:数据流生命周期新增冻结层支持
大数据·运维·elasticsearch·搜索引擎·架构·全文检索
小张同学a.2 小时前
ELK企业级日志分析平台3——ES数据备份 & 集群监控 & ELFK+Kafka 架构部署
linux·运维·elk·elasticsearch·架构·kafka·filebeat
头茬韭菜2 小时前
第 4 篇:「Fluss + Flink 集成实战」—— Catalog、Source 与 Sink
大数据·python·flink·fluss
天天爱吃肉82182 小时前
【工程师硬件学习笔记:串口‑总线体系与三电试验室异构系统集成深度实战】
大数据·笔记·python·嵌入式硬件·学习·汽车