特性快闪:使用 Databend 玩转 Iceberg

2024-01-08 11:40

本文主要是介绍特性快闪:使用 Databend 玩转 Iceberg,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 作者:尚卓燃(PsiACE)澳门科技大学在读硕士,Databend 研发工程师实习生
Apache OpenDAL(Incubating) Committer
https://github.com/PsiACE

几周前,Databricks 和 Snowflake 召开了各自的年度大会,除了今年一路持续走红的 AI ,数据湖/数据仓库技术的发展仍然值得关注,毕竟数据才是基本盘。Apache Iceberg 无疑是数据湖方案的大赢家,Databricks 新推出的 UniForm 为以 Apache Iceberg 和 Hudi 表格式读取 Delta 中的数据提供了进一步的支持。而 Snowflake 也适时推出了 Iceberg Tables 更新,宣称要进一步打破数据孤岛。

Databend 最近几个月正在推动的重要新特性之一就是支持读取 Apache Iceberg 表格式的数据,尽管还没有完全落地,但已经取得了不错的进展。

今天这篇文章旨在为大家提前演示这一新特性 —— 使用 Databend 挂载并查询 Iceberg Catalog ,我们将介绍 Iceberg、表格式的一些核心概念,并且试图介绍 Databend 的解决方案(包括 Databend 的多源数据目录能力和以 Rust 从头实现的 IceLake)。当然,作为演示,我们将会提供完整的 workshop ,供大家尝鲜体验。

Apache Iceberg

时至今日,越来越多的数据进入云端,并且存储在对象存储之中,但这并不能完全适应现代分析的需求。这里有两个问题需要解决:第一个是数据以何种形式组织,也就是说,如何得到更结构化的数据存储。第二个问题还要更进一步,如何为用户提供更广泛的一致性保证以及业务中需要的模式信息,以及更多适应现代分析负载的高级特性。

数据湖往往会关注并解决第一个问题,而表格式则会致力于为第二个问题提供解决方案。

Apache Iceberg 是一种高性能的开放表格式,专为大规模分析工作负载而设计,简单而又可靠。同时支持 Spark、Trino、Flink、Presto、Hive 和 Impala 等查询引擎,并且具备模式演变(Full Schema Evolution)、时间旅行和回滚等杀手级特性。另外,Apache Iceberg 的数据分片和明确定义的数据结构还使得对数据源进行并发访问更加安全、可靠和方便。

如果你对 Iceberg 感兴趣,我们也推荐阅读像 Docker, Spark, and Iceberg: The Fastest Way to Try Iceberg! 这样的文章进行探索。

表格式初探

表格式(Table Format)是一种利用文件集合存储数据的规范。它主要包含以下三个部分的定义:

  • 如何将数据存储在文件中
  • 如何存储相关文件的元数据
  • 如何存储有关表本身的元数据

表格式的文件通常存储在 HDFS、S3 或 GCS 这样的底层存储服务中,上层则会对接 Databend、Snowflake 等数据仓库。相比 CSV 或 Parquet ,表格式提供了表形式的标准的结构化数据定义,无需加载到数据仓库中就可以使用。

尽管表格式领域还有像 Delta Lake 和 Apache Hudi 这样的强劲对手,但这篇文章是关于 Apache Iceberg 的,所以,还是让我们把目光转向 Apache Iceberg ,一起了解一下它的底层文件组织结构。

上图中的 s0 、s1 代表的是表的快照信息(snapshot),也就是表在某个时刻的状态。每次 commit 都会生成一个快照,每个快照都会对应一个清单列表(manifest list),而每个清单列表可以维护多个清单文件(manifest file)的地址与统计信息,包括路径和分区范围等。清单文件中会记录当前操作生成数据文件(data file)的地址和统计信息,比如列中的最大值最小值和数据行数等。

Databend 多源数据目录

要想在 Databend 中实现 Iceberg 集成,头一件是 Databend 的多源数据目录能力。多源数据目录将会允许将原本由其他数据分析系统所管理的数据挂载到 Databend 。

从设计之初,Databend 的目标就是成为云原生的 OLAP 数据仓库,并考虑到多源数据处理的问题。Databend 中的数据按三层进行组织:catalog -> database -> table ,catalog 作为数据最大一层,会包含所有的数据库和表。

团队在此基础上设计并实现对 Hive 和 Iceberg 数据目录的支持,提供配置文件和 CREATE CATALOG 语句多种挂载形式,从而支持对相关数据进行查询。

要想挂载数据位于 S3 中的 Iceberg Catalog,只需要执行下面的 SQL 语句:

CREATE CATALOG iceberg_ctl
TYPE=ICEBERG
CONNECTION=(URL='s3://warehouse/path/to/db'AWS_KEY_ID='admin'AWS_SECRET_KEY='password'ENDPOINT_URL='your-endpoint-url'
);

IceLake - Apache Iceberg 的纯 Rust 实现

尽管 Rust 生态中近年来涌现出不少数据库、大数据分析相关的新项目,但 Rust 生态中仍然缺乏成熟的 Apache Iceberg 绑定,这为 Databend 集成 Iceberg 制造了不少困难。

Databend Labs 支持并发起的 IceLake 旨在填补这一空白,并致力于建立一个开放生态系统:

  • 用户可以从 任何 存储服务(如 s3、gcs、azblob、hdfs 等)读写 Iceberg 表。
  • 任何 数据库都可以集成 icelake,以支持读写 Iceberg 表。
  • 提供原生的 arrow 格式互转换的能力。
  • 提供多种语言绑定,使其他语言可以享有 Rust 核心带来的 Iceberg 生态支持。

当前 IceLake 已经支持读取 Apache Iceberg 存储服务中的数据(Parquet 格式)。而 Databend 的 Iceberg 数据目录能力正是由 IceLake 支撑的,其设计与实现在和 Databend 集成中得到了验证。

此外,我们还与 Iceberg 社区成员携手发起并参与 iceberg-rust 项目,旨在将 icelake 中 iceberg 相关的实现贡献给上游,目前第一个版本正紧锣密鼓的开发中,欢迎关注GitHub - apache/iceberg-rust: Apache Iceberg 。

Workshop:体验 Databend 的 Iceberg 能力

在这个 Workshop 中,我们将会展示如何准备 Iceberg 表格式的数据,并以 Catalog 的形式将其挂载到 Databend 上,并执行一些基本的查询。相关的文件和配置可以在 PsiACE/databend-workshop 中找到。

如果你本身有一些符合 Iceberg 表格式的数据存放在 OpenDAL 支持的存储服务中,我们更推荐使用 Databend Cloud ,这样你就可以跳过繁琐的服务部署和数据准备流程,轻松上手 Iceberg Catalog 。

启动服务

为了简化 Iceberg 的服务部署和数据准备问题,我们将会使用 Docker 和 Docker Compose ,你需要先安装这些组件,然后编写 docker-compose.yml 文件。

version: "3"services:spark-iceberg:image: tabulario/spark-icebergcontainer_name: spark-icebergbuild: spark/networks:iceberg_net:depends_on:- rest- miniovolumes:- ./warehouse:/home/iceberg/warehouse- ./notebooks:/home/iceberg/notebooks/notebooksenvironment:- AWS_ACCESS_KEY_ID=admin- AWS_SECRET_ACCESS_KEY=password- AWS_REGION=us-east-1ports:- 8888:8888- 8080:8080- 10000:10000- 10001:10001rest:image: tabulario/iceberg-restcontainer_name: iceberg-restnetworks:iceberg_net:ports:- 8181:8181environment:- AWS_ACCESS_KEY_ID=admin- AWS_SECRET_ACCESS_KEY=password- AWS_REGION=us-east-1- CATALOG_WAREHOUSE=s3://warehouse/- CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO- CATALOG_S3_ENDPOINT=http://minio:9000minio:image: minio/miniocontainer_name: minioenvironment:- MINIO_ROOT_USER=admin- MINIO_ROOT_PASSWORD=password- MINIO_DOMAIN=minionetworks:iceberg_net:aliases:- warehouse.minioports:- 9001:9001- 9000:9000command: ["server", "/data", "--console-address", ":9001"]mc:depends_on:- minioimage: minio/mccontainer_name: mcnetworks:iceberg_net:environment:- AWS_ACCESS_KEY_ID=admin- AWS_SECRET_ACCESS_KEY=password- AWS_REGION=us-east-1entrypoint: >/bin/sh -c "until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;/usr/bin/mc rm -r --force minio/warehouse;/usr/bin/mc mb minio/warehouse;/usr/bin/mc policy set public minio/warehouse;tail -f /dev/null"      
networks:iceberg_net:

在上述的配置文件中,我们使用 MinIO 作为底层存储,Iceberg 提供表格式能力,至于 spark-iceberg ,可以帮助我们准备一些预置数据并执行转换操作。

接下来,我们在 docker-compose.yml 文件对应的目录下启动所有服务:

docker-compose up -d

数据准备

在这个 Workshop 中,我们计划使用 NYC Taxis 数据集(纽约出租车搭乘数据),在 spark-iceberg 中已经内置了 Parquet 数据,我们只需要将其转化为 Iceberg 格式。

首先启用 pyspark-notebook :

docker exec -it spark-iceberg pyspark-notebook

接下来我们就可以在 http://localhost:8888 使用 Jupyter Notebook :

这里我们需要运行一小段程序,实施数据转换的操作:

df = spark.read.parquet("/home/iceberg/data/yellow_tripdata_2021-04.parquet")
df.write.saveAsTable("nyc.taxis", format="iceberg")

第一行将会读取 Parquet 数据,而第二行将会将其转储为 Iceberg 格式。

为了验证数据是否成功转换,我们可以访问位于 http://localhost:9001 的 MinIO 实例,可以看到数据是按之前描述的 Iceberg 底层文件组织形式进行管理的。

部署 Databend

这里我们使用手动部署单节点 Databend 服务的形式,总体上部署过程可以参考 Databend 官方文档 ,需要注意的一些细节如下:

  • 首先是需要为日志和 Meta 数据准备相关的目录

    • sudo mkdir /var/log/databend
      sudo mkdir /var/lib/databend
      sudo chown -R $USER /var/log/databend
      sudo chown -R $USER /var/lib/databend
  • 其次,因为默认的 admin_api_address 已经被前面的服务占用掉,所以需要编辑 databend-query.toml 进行一些修改避免冲突:

    • admin_api_address = "0.0.0.0:8088"
  • 另外,我们还需要根据 Docs | Configuring Admin Users 配置管理员用户,由于只是一个 workshop ,这里选择最简单的方式,只是取消 [[query.users]] 字段以及 root 用户的注释:

    • [[query.users]]
      name = "root"
      auth_type = "no_password"
  • 由于我们本地部署 MinIO ,没有设置证书加密,需要使用不安全的 HTTP 协议加载数据,所以还需要更改 databend-query.toml 配置文件以允许这一行为。在生产服务中请尽可能避免开启它:

    • ...
      [storage]
      ...
      allow_insecure = true
      ...

接下来就可以正常启动 Databend :

./scripts/start.sh

我们强烈推荐你使用 BendSQL 作为客户端,当然,我们也支持像 MySQL Client 和 HTTP API 等多种访问形式。

挂载 Iceberg Catalog

根据之前的配置文件,只需要执行下述 SQL 就可以一键挂载 Iceberg Catalog 。

CREATE CATALOG iceberg_ctl
TYPE=ICEBERG
CONNECTION=(URL='s3://warehouse/'AWS_KEY_ID='admin'AWS_SECRET_KEY='password'ENDPOINT_URL='http://localhost:9000'
);

为了验证是否成功,我们可以执行 SHOW CATALOGS 查看:

当然,我们也支持了 SHOW DATABASES 和 SHOW TABLES 语句,之前转换数据时的 nyc.taxis 对应在 MinIO 中是二级目录,而在 Databend 则会映射到数据库和表。

执行查询

数据已经挂载,那么就让我们执行一些简单的查询:

首先是对数据进行行数统计,可以看到一共挂载了 200 万行数据到 Databend:

SELECT count(*) FROM iceberg_ctl.nyc.taxis;

让我们从其中几列试着取一些数据出来:

SELECT tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count FROM iceberg_ctl.nyc.taxis LIMIT 5;

下面的查询可以帮助我们探索乘客数量和旅程距离之间的相关性,这里只取其中 10 条结果:

SELECTpassenger_count,to_year(tpep_pickup_datetime) AS year,round(trip_distance) AS distance,count(*)
FROMiceberg_ctl.nyc.taxis
GROUP BYpassenger_count,year,distance
ORDER BYyear,count(*) DESC
LIMIT10;

总结

在这篇文章中,我们介绍到 Apache Iceberg 表格式和 Databend 的相关解决方案,并且提供了一个相对完整的 workshop 供大家探索。

不难看出,尽管目前我们只为 Iceberg Catalog 提供了单机模式的目录挂载能力,但 Databend 可以胜任一些基本的查询处理任务。也欢迎大家在自己感兴趣的数据上进行尝试,并给我们提供一些反馈。

这篇关于特性快闪:使用 Databend 玩转 Iceberg的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583345

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念