Apache Doris 整合 FLINK 、 Hudi 构建湖仓一体的联邦查询入门

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

2. 环境

本教程的演示环境如下:

  1. Centos7
  2. Apache doris 2.0.2
  3. Hadoop 3.3.3
  4. hive 3.1.3
  5. Fink 1.17.1
  6. Apache hudi 0.14
  7. 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 和 Hudi 相关的依赖
wget https://repo1.maven.org/maven2/org/apache/flink/flink-table-planner_2.12/1.17.1/flink-table-planner_2.12-1.17.1.jar
wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-hive-sync-bundle/0.14.0/hudi-hive-sync-bundle-0.14.0.jar
wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-flink1.17-bundle/0.14.0/hudi-flink1.17-bundle-0.14.0.jar
wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-hadoop-mr-bundle/0.14.0/hudi-hadoop-mr-bundle-0.14.0.jar

将上面这些依赖下载到 flink-1.17.1/lib 目录,然后将之前的 flink-table-planner-loader-1.17.1.jar 删除或者移除。

3. 创建 Hudi 表并写入数据

3.1 启动 Flink

bin/start-cluster.sh

启动 Flink client

./bin/sql-client.sh embedded shell

#设置返回结果模式为tableau,让结果直接显示

set sql-client.execution.result-mode=tableau;

3.2 启动 Hive MetaStore 和 HiveServer

nohup ./bin/hive --service hiveserver2 >/dev/null 2>&1  &
nohup ./bin/hive --service metastore >/dev/null 2>&1  &

3.3 创建 Hudi 表

我们来创建 Hudi 表,我们这里使用 Hive MetaStore Service 来保存 Hudi 的元数据。

CREATE TABLE table1(uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED,name VARCHAR(10),age INT,ts TIMESTAMP(3),`partition` VARCHAR(20)
)
PARTITIONED BY (`partition`)
with('connector'='hudi','path' = 'hdfs://localhost:9000/user/hive/warehouse/demo.db','table.type'='COPY_ON_WRITE',       'hive_sync.enable'='true',           'hive_sync.table'='hudi_hive',        'hive_sync.db'='demo',            'hive_sync.mode' = 'hms',         'hive_sync.metastore.uris' = 'thrift://192.168.31.54:9083' 
);
  1. 'table.type'='COPY_ON_WRITE', -- MERGE_ON_READ方式在没生成 parquet 文件前,hive不会有输出
  2. 'hive_sync.enable'='true', -- required,开启hive同步功能
  3. 'hive_sync.table'='${hive_table}', -- required, hive 新建的表名
  4. 'hive_sync.db'='${hive_db}', -- required, hive 新建的数据库名
  5. 'hive_sync.mode' = 'hms', -- required, 将hive sync mode设置为hms, 默认jdbc
  6. 'hive_sync.metastore.uris' = 'thrift://ip:9083' -- required, metastore的端口

写入数据:

INSERT INTO table1 VALUES('id1','Danny',23,TIMESTAMP '1970-01-01 00:00:01','par1'),('id2','Stephen',33,TIMESTAMP '1970-01-01 00:00:02','par1'),('id3','Julian',53,TIMESTAMP '1970-01-01 00:00:03','par2'),('id4','Fabian',31,TIMESTAMP '1970-01-01 00:00:04','par2'),('id5','Sophia',18,TIMESTAMP '1970-01-01 00:00:05','par3'),('id6','Emma',20,TIMESTAMP '1970-01-01 00:00:06','par3'),('id7','Bob',44,TIMESTAMP '1970-01-01 00:00:07','par4'),('id8','Han',56,TIMESTAMP '1970-01-01 00:00:08','par4');

通过 Flink 查询 Hudi 表的数据

SELECT * FROM TABLE1

我们可以查看 HDFS 上这个数据文件已经存在,在 hive client 下也可以看到这表

hive> use demo;
OK
Time taken: 0.027 seconds
hive> show tables;
OK
hudi_hive

4. Doris On Hudi

Doris 操作访问 Hudi 的数据很简单,我们只需要创建一个 catalog 就可以,不需要再想之前一样写一个完整的建表语句,同时当 Hudi 数据源中增删表或者增删字段,Doris 这边可以通过配置自动刷新或者手动刷新Catalog 自动感知。

下面我们在Doris 下创建一个 Catalog 来访问 Hudi 外部表的数据

CREATE CATALOG hudi PROPERTIES ('type'='hms','hive.metastore.uris' = 'thrift://192.168.31.54:9083'
);

这里我们上面Hudi的元数据是使用HMS存储的,我们创建的时候只需要指定上面两个信息即可,如果你的HDFS是高可用的,你需要添加NameNode HA的信息:

'hadoop.username' = 'hive',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.2:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'

具体参照Doris 官网文档

创建成功之后我们可以通过下面的红框标识出来的步骤去看到 Hudi 的表。

执行查询 Hudi 表:

将 Hudi 表里的数据迁移到 Doris

这里我们先创建好 Doris的表,建表语句如下:

CREATE TABLE doris_hudi(uuid VARCHAR(20) ,name VARCHAR(10),age INT,ts datetime(3),`partition` VARCHAR(20)
)
UNIQUE KEY(`uuid`)
DISTRIBUTED BY HASH(`uuid`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"enable_unique_key_merge_on_write" = "true"
);

通过 Insert Select 语句将 Hudi 数据迁移到 Doris :

insert into doris_hudi select uuid,name,age,ts,partition from hudi.demo.hudi_hive;

查询 Doris 表

mysql> select * from doris_hudi;
+------+---------+------+-------------------------+-----------+
| uuid | name    | age  | ts                      | partition |
+------+---------+------+-------------------------+-----------+
| id1  | Danny   |   23 | 1970-01-01 08:00:01.000 | par1      |
| id2  | Stephen |   33 | 1970-01-01 08:00:02.000 | par1      |
| id3  | Julian  |   53 | 1970-01-01 08:00:03.000 | par2      |
| id4  | Fabian  |   31 | 1970-01-01 08:00:04.000 | par2      |
| id5  | Sophia  |   18 | 1970-01-01 08:00:05.000 | par3      |
| id6  | Emma    |   20 | 1970-01-01 08:00:06.000 | par3      |
| id7  | Bob     |   44 | 1970-01-01 08:00:07.000 | par4      |
| id8  | Han     |   56 | 1970-01-01 08:00:08.000 | par4      |
+------+---------+------+-------------------------+-----------+
8 rows in set (0.02 sec)

我们那还可以通过 CATS方式将 hudi数据迁移到Doris,Doris 自动完成建表

create table doris_hudi_01
PROPERTIES("replication_num" = "1")  as  
select uuid,name,age,ts,`partition` from hudi.demo.hudi_hive;

5. 总结

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

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

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

相关文章

新能源钠离子电池污废水如何处理

钠离子电池作为一种新能源电池,已经展示出了广阔的应用前景。然而,随着其生产和使用规模的不断扩大,对其产生的污废水问题也变得越来越重要。如何处理新能源钠离子电池的污废水,已经成为一个必须解决的问题。 首先,我…

latex中文书签乱码

下载gbk2uni小工具 http://www.hooklee.com/tex/gbk2uni.zip 将路径添加到path中,在latex工作目录下使用gbk2uni filename

240. 搜索二维矩阵 II -- 力扣 --JAVA

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 解题思路一 逐个遍历 代码展示 class Solution {public boolean searchMatrix(int[][] matrix, int …

数字图像处理(实践篇)八 Harris角点检测

目录 1 涉及的OpenCV函数 2 实践 在图像中每个方向变化都很大的区域就是角点,一个早期的尝试是由 Chris Harris & Mike Stephens 在1998年的论文 A Combined Corner and Edge Detector 完成的。所以现在称之为 Harris角点检测。 1 涉及的OpenCV函数 cornerHa…

【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是一个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录(比如 /tmp)下进行操作’而完全不会受宿主机以及其他容器的影响。 容器…

c语言编程题经典100例——(31~35例)

1&#xff0c;实现深度优先搜索算法。 以下是使用 C 语言实现深度优先搜索算法的示例代码&#xff1a; #include <stdio.h> #include <stdbool.h> #define MAX_VERTICES 100 // 图的最大顶点数 // 图的邻接表表示 typedef struct { int edges[MAX_VERTIC…

充电桩绝缘检测原理与示例

1、背景 充电桩绝缘检测是保证电动车充电安全的重要环节&#xff0c;通过对充电桩绝缘检测单租的测量和评估&#xff0c;来判断充电桩是否存在漏电等安全隐患&#xff0c;从而保证用户及周围环境的电器安全。 绝缘电阻&#xff1a;是指在特定的条件下&#xff0c;电气设备与接…

python之高级语法

文章目录 版权声明property属性property属性装饰器方式property属性类属性方式 with语句和上下文管理器with语句使用\上下文管理器定义 生成器生成器推导式创建生成器的方式生成器推导式yield 关键字 浅拷贝和深拷贝可变类型和不可变类型浅拷贝深拷贝总结 正则表达式正则表达式…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言&#xff1a; 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用&#xff0c;以其沉浸式、交互式的特点&#xff0c;正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

10 OAuth2.0实战:认证授权中心搭建

木谷博客系统的认证授权中心使用Spring Cloud Security+OAuth2搭建,完全遵循OAuth2.0规范。 实战部分只介绍木谷博客系统中的重点,关于细节请看笔者之前的文章:实战干货!Spring Cloud Gateway集成OAuth2.0 实现分布式统一认证授权! 客户端信息存储 OAuth2.0中的四种模式…

以太坊2.0-升级节点详细搭建文档

文章目录 一、配置 JWT 认证二、部署执行节点geth2.1 下载geth二进制文件2.2 geth节点启动三、部署共识节点Prysm3.1 下载Prysm脚本3.2 Prysm容器生成四、检查节点是否同步完成4.1 检查geth执行节点4.2 检查prysm共识节点4.3 geth常用命令一、配置 JWT 认证 使用执行客户端生成…

网易云音频数据如何爬取?

在当今数字化时代&#xff0c;音频数据的获取和处理变得越来越重要。本文将详细介绍如何使用Objective-C语言构建音频爬虫程序&#xff0c;以爬取网易云音乐为案例。我们将从Objective-C的基础知识开始&#xff0c;逐步深入到爬取思路分析、构建爬虫框架、完整爬取代码等方面&a…

P18 C++ 继承

目录 前言 01 不使用继承会让你多打很多无用的代码 02 继承 最后的话 前言 本期我们学习 C 面向对象编程中的继承。 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#…

Flask 实现Token认证机制

在Flask框架中&#xff0c;实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt&#xff0c;我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌&#xff08;Token&#xff09;&…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

【深度学习笔记】02 线性代数基础

线性代数基础 线性代数基础标量向量长度、维度和形状矩阵张量算法的基本性质降维非降维求和点积&#xff08;Dot Product&#xff09;矩阵-向量积矩阵-矩阵乘法范数 线性代数基础 标量 标量由只有一个元素的张量表示 import torchx torch.tensor(3.0) y torch.tensor(2.0)…

一文读懂 | AI技术如何驱动企业供应链智能化,赋能企业降本增效?

近年以来&#xff0c;随着互联网技术的发展&#xff0c;AI的创新研究加速。随着大数据、云计算、物联网等信息技术的发展&#xff0c;以深度神经网络为代表的AI技术迅速发展&#xff0c;图像分类、语音识别、知识问答、无人驾驶等AI技术实现了从“不能用、不好用”到“可以用”…

Mybatis入门(一)

安装 要使用 MyBatis&#xff0c; 只需将 mybatis-x.x.x.jar 文件置于类路径&#xff08;classpath&#xff09;中即可。 如果使用 Maven 来构建项目&#xff0c;则需将下面的依赖代码置于 pom.xml 文件中&#xff1a; <dependency><groupId>org.mybatis</gr…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…