当前位置:   article > 正文

Apache Doris 整合 FLINK CDC 、Paimon 构建实时湖仓一体的联邦查询入门_paimon cdc

paimon cdc

1.概览

多源数据目录(Multi-Catalog)功能,旨在能够更方便对接外部数据目录,以增强Doris的数据湖分析和联邦数据查询能力。

在之前的 Doris 版本中,用户数据只有两个层级:Database 和 Table。当我们需要连接一个外部数据目录时,我们只能在Database 或 Table 层级进行对接。比如通过 create external table 的方式创建一个外部数据目录中的表的映射,或通过 create external database 的方式映射一个外部数据目录中的 Database。如果外部数据目录中的 Database 或 Table 非常多,则需要用户手动进行一一映射,使用体验不佳。

而新的 Multi-Catalog 功能在原有的元数据层级上,新增一层Catalog,构成 Catalog -> Database -> Table 的三层元数据层级。其中,Catalog 可以直接对应到外部数据目录。目前支持的外部数据目录包括:

  1. Apache Hive
  2. Apache Iceberg
  3. Apache Hudi
  4. Elasticsearch
  5. JDBC: 对接数据库访问的标准接口(JDBC)来访问各式数据库的数据。
  6. Apache Paimon(Incubating)

该功能将作为之前外表连接方式(External Table)的补充和增强,帮助用户进行快速的多数据目录联邦查询。

这篇教程将展示如何使用 Flink + paimon + Doris 构建实时湖仓一体的联邦查询分析,Doris 2.0.3 版本提供了 的支持,本文主要展示 Doris 和 paimon 怎么使用,同时本教程整个环境是都基于伪分布式环境搭建,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。

2. 环境

本教程的演示环境如下:

  1. Apache doris 2.0.2
  2. Hadoop 3.3.3
  3. hive 3.1.3
  4. Fink 1.17.1
  5. Apache paimon 0.5.0
  6. JDK 1.8.0_311

3. 安装

  1. 下载 Flink 1.17.1
    wget https://dlcdn.apache.org/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz
    ## 解压安装
    tar zxf flink-1.17.1-bin-scala_2.12.tgz
  2. 下载相关的依赖到 Flink/lib 目录
  1. cp /Users/zhangfeng/hadoop/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar ./lib/
  2. wget https://repo1.maven.org/maven2/org/apache/paimon/paimon-flink-1.17/0.5.0-incubating/paimon-flink-1.17-0.5.0-incubating.jar
  3. wget https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.4.2/flink-sql-connector-mysql-cdc-2.4.2.jar
  4. wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-3.1.3_2.12/1.17.1/flink-sql-connector-hive-3.1.3_2.12-1.17.1.jar
  1. 配置并启动 Flink

配置环境变量,修改flink-conf.yaml配置文件

  1. env.java.opts.all: "-Dfile.encoding=UTF-8"
  2. classloader.check-leaked-classloader: false
  3. taskmanager.numberOfTaskSlots: 3
  4. execution.checkpointing.interval: 10s
  5. state.backend: rocksdb
  6. state.checkpoints.dir: hdfs://zhangfeng:9000/flink/myckp
  7. state.savepoints.dir: hdfs://zhangfeng:9000/flink/savepoints
  8. state.backend.incremental: true

启动 Flink

  1. bin/start-cluster.sh
  2. bin/sql-client.sh embedded
  3. set 'sql-client.execution.result-mode' = 'tableau';

Catalog

Paimon Catalog可以持久化元数据,当前支持两种类型的metastore

  • 文件系统(默认):将元数据和表文件存储在文件系统中。
  • hive:在hive metastore存储元数据,用户可以直接从hive访问表。

文件系统

下面的 Flink SQL 注册并使用一个名为 paimon_catalog 的catalog。元数据和表文件存放在hdfs://localhost:9000/paimon/data下

  1. CREATE CATALOG paimon_catalog WITH (
  2. 'type' = 'paimon',
  3. 'warehouse' = 'hdfs://localhost:9000/paimon/data'
  4. );
  5. show catalogs;

Hive Catalog

我们也可以直接使用 hive metastore 来存储 paimon 元数据。

下面是创建语句

  1. CREATE CATALOG paimon_hive WITH (
  2. 'type' = 'paimon',
  3. 'metastore' = 'hive',
  4. 'uri' = 'thrift://localhost:9083',
  5. 'hive-conf-dir' = '/Users/zhangfeng/hadoop/apache-hive-3.1.3-bin/conf/',
  6. 'warehouse' = 'hdfs://localhost:9000/paimon/hive'
  7. );
  8. show catalogs;

创建 paimon 表

  1. USE CATALOG paimon_hive;
  2. CREATE TABLE test_paimon_01 (
  3. userid BIGINT,
  4. age INT,
  5. address STRING,
  6. regiter_dt STRING ,
  7. PRIMARY KEY(userid, regiter_dt) NOT ENFORCED
  8. ) PARTITIONED BY (regiter_dt);
  9. show tables

4. 同步MySQL 数据到 Paimon表

下面我们演示怎么基于Flink CDC 快速实时同步 MySQL 表的数据到 Paimon表里。

这里首先你的MySQL 数据库要开启 binlog,具体的方法网上很多,这里不在叙述。

MySQL 表:

  1. CREATE DATABASE emp_1;
  2. USE emp_1;
  3. CREATE TABLE employees_1 (
  4. emp_no INT NOT NULL,
  5. birth_date DATE NOT NULL,
  6. first_name VARCHAR(14) NOT NULL,
  7. last_name VARCHAR(16) NOT NULL,
  8. gender ENUM ('M','F') NOT NULL,
  9. hire_date DATE NOT NULL,
  10. PRIMARY KEY (emp_no)
  11. );
  12. INSERT INTO `employees_1` VALUES (10055,'1956-06-06','Georgy','Dredge','M','1992-04-27'),
  13. (10056,'1961-09-01','Brendon','Bernini','F','1990-02-01'),
  14. (10057,'1954-05-30','Ebbe','Callaway','F','1992-01-15'),
  15. (10058,'1954-10-01','Berhard','McFarlin','M','1987-04-13'),
  16. (10059,'1953-09-19','Alejandro','McAlpine','F','1991-06-26'),
  17. (10060,'1961-10-15','Breannda','Billingsley','M','1987-11-02'),
  18. (10061,'1962-10-19','Tse','Herber','M','1985-09-17'),
  19. (10062,'1961-11-02','Anoosh','Peyn','M','1991-08-30'),
  20. (10063,'1952-08-06','Gino','Leonhardt','F','1989-04-08'),
  21. (10064,'1959-04-07','Udi','Jansch','M','1985-11-20'),
  22. (10065,'1963-04-14','Satosi','Awdeh','M','1988-05-18'),
  23. (10066,'1952-11-13','Kwee','Schusler','M','1986-02-26'),
  24. (10067,'1953-01-07','Claudi','Stavenow','M','1987-03-04'),
  25. (10068,'1962-11-26','Charlene','Brattka','M','1987-08-07'),
  26. (10069,'1960-09-06','Margareta','Bierman','F','1989-11-05'),
  27. (10070,'1955-08-20','Reuven','Garigliano','M','1985-10-14'),
  28. (10071,'1958-01-21','Hisao','Lipner','M','1987-10-01'),
  29. (10072,'1952-05-15','Hironoby','Sidou','F','1988-07-21'),
  30. (10073,'1954-02-23','Shir','McClurg','M','1991-12-01'),
  31. (10074,'1955-08-28','Mokhtar','Bernatsky','F','1990-08-13'),
  32. (10075,'1960-03-09','Gao','Dolinsky','F','1987-03-19'),
  33. (10076,'1952-06-13','Erez','Ritzmann','F','1985-07-09'),
  34. (10077,'1964-04-18','Mona','Azuma','M','1990-03-02'),
  35. (10078,'1959-12-25','Danel','Mondadori','F','1987-05-26'),
  36. (10079,'1961-10-05','Kshitij','Gils','F','1986-03-27'),
  37. (10080,'1957-12-03','Premal','Baek','M','1985-11-19'),
  38. (10081,'1960-12-17','Zhongwei','Rosen','M','1986-10-30'),
  39. (10082,'1963-09-09','Parviz','Lortz','M','1990-01-03'),
  40. (10083,'1959-07-23','Vishv','Zockler','M','1987-03-31'),
  41. (10084,'1960-05-25','Tuval','Kalloufi','M','1995-12-15');

在Flink sql-client 下创建 MySQL CDC 表:

  1. CREATE TABLE employees_source (
  2. database_name STRING METADATA VIRTUAL,
  3. table_name STRING METADATA VIRTUAL,
  4. emp_no int NOT NULL,
  5. birth_date date,
  6. first_name STRING,
  7. last_name STRING,
  8. gender STRING,
  9. hire_date date,
  10. PRIMARY KEY (`emp_no`) NOT ENFORCED
  11. ) WITH (
  12. 'connector' = 'mysql-cdc',
  13. 'hostname' = 'localhost',
  14. 'port' = '3306',
  15. 'username' = 'root',
  16. 'password' = 'zhangfeng',
  17. 'database-name' = 'emp_1',
  18. 'table-name' = 'employees_1'
  19. );

使用Create table as select 创建Paimon表,并将数据实时同步到Paimon表里:

create table mysql_to_paimon_01 as select * from default_catalog.default_database.employees_source;

查看Job

我们这个时候可以在Flink sql-client 下查询 paimon ,看到 Paimon 表里已经有数据了。

5. Doris On Paimon

Doris 提供了 Paimon 的 catalog 支持,我们可以通过这种方式,通过Doris 快速的去读 Paimon 表的数据,同时也可以通过 catalog 方式将 paimon 表的数据迁移到 Doris 表里

5.1 Doris 整合查询Paimon表

首先我们创建 Paimon catalog,有两种方式:

  1. 一种是基于 Hive metastore service
  2. 一种是基于 HDFS 文件系统
  1. CREATE CATALOG `paimon_hdfs` PROPERTIES (
  2. "type" = "paimon",
  3. "warehouse" = "hdfs://localhost:9000/paimon/hive",
  4. "hadoop.username" = "hadoop"
  5. );
  6. CREATE CATALOG `paimon_hms` PROPERTIES (
  7. "type" = "paimon",
  8. "paimon.catalog.type" = "hms",
  9. "warehouse" = "hdfs://localhost:9000/paimon/hive",
  10. "hive.metastore.uris" = "thrift://localhost:9083"
  11. );

创建成功之后我们通过 show catalogs方式可以看到我们创建好的 paimon catalog;

  1. mysql> show catalogs;
  2. +-----------+-------------+----------+-----------+-------------------------+---------------------+------------------------+
  3. | CatalogId | CatalogName | Type | IsCurrent | CreateTime | LastUpdateTime | Comment |
  4. +-----------+-------------+----------+-----------+-------------------------+---------------------+------------------------+
  5. | 1308010 | hive | hms | | 2023-11-17 09:42:22.872 | 2023-11-17 09:42:46 | NULL |
  6. | 1326307 | hudi | hms | | 2023-11-27 11:33:22.231 | 2023-11-27 11:33:35 | NULL |
  7. | 0 | internal | internal | | UNRECORDED | NULL | Doris internal catalog |
  8. | 35689 | jdbc | jdbc | | 2023-11-03 12:52:24.695 | 2023-11-03 12:52:59 | NULL |
  9. | 38003 | mysql | jdbc | | 2023-11-07 11:46:40.006 | 2023-11-07 11:46:54 | NULL |
  10. | 1329142 | paimon_hdfs | paimon | | 2023-11-27 14:06:13.744 | 2023-11-27 14:06:41 | |
  11. | 1328144 | paimon_hms | paimon | yes | 2023-11-27 14:00:32.925 | 2023-11-27 14:00:44 | NULL |
  12. +-----------+-------------+----------+-----------+-------------------------+---------------------+------------------------+
  13. 7 rows in set (0.00 sec)

切换 paimon catalog,通过下面这些操作我们可以看到我们在 paimon 里创建的表

  1. mysql> switch paimon_hdfs;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show databases;
  4. +----------+
  5. | Database |
  6. +----------+
  7. | default |
  8. +----------+
  9. 1 row in set (0.02 sec)
  10. mysql> use default;
  11. Reading table information for completion of table and column names
  12. You can turn off this feature to get a quicker startup with -A
  13. Database changed
  14. mysql> show tables;
  15. +--------------------------+
  16. | Tables_in_default |
  17. +--------------------------+
  18. | example_tbl_partition_01 |
  19. | example_tbl_unique_01 |
  20. | mysql_to_paimon_01 |
  21. | test_paimon_01 |
  22. +--------------------------+
  23. 4 rows in set (0.00 sec)

通过 Doris 查询 Paimon 表

select * from mysql_to_paimon_01;

5.2 将Paimon 表的数据导入到 Doris

我们也可以快速的利用catalog 方式将 paimon 数据迁移到 Doris 里,我们可以使用 CATS方式:

  1. create table doris_paimon_01
  2. PROPERTIES("replication_num" = "1") as select * from paimon_hdfs.`default`.mysql_to_paimon_01;

注意:

1. 查询paimon的时候如果报下面的错误:

org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "hdfs"

需要再 hdfs 需要再core-site.xml 文件中加上下面的配置:

  1. <property>
  2. <name>fs.hdfs.impl</name>
  3. <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
  4. <description>The FileSystem for hdfs: uris.</description>
  5. </property>

6. 总结

是不是使用非常简单,快快体验Doris 湖仓一体,联邦查询的能力,来加速你的数据分析性能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/946819
推荐阅读
相关标签
  

闽ICP备14008679号