Iceberg教程

news2024/11/27 1:38:49

目录

  • 教程来源于尚硅谷
  • 1. 简介
    • 1.1 概述
    • 1.2 特性
  • 2. 存储结构
    • 2.1 数据文件(data files)
    • 2.2 表快照(Snapshot)
    • 2.3 清单列表(Manifest list)
    • 2.4 清单文件(Manifest file)
    • 2.5 查询流程分析
  • 3. 与Flink集成
    • 3.1 环境准备
      • 3.1.1 安装Flink
      • 3.1.2 启动Sql-Client
    • 3.2 语法

教程来源于尚硅谷

1. 简介

1.1 概述

Iceberg是一个面向海量数据分析场景的开放表格式(Table Format)。表格式(Table Format)可以理解为元数据以及数据文件的一种组织方式,处于计算框架(Flink,Spark…)之下,数据文件(orc, parquet)之上。这一点与Hive有点类似,hive也是基于HDFS存储、MR/SPARK计算引擎,将数据组织成一种表格式,提供Hive Sql对数据进行处理。

但iceberg与hive还是有很大的不同,iceberg具有以下很多特性。

1.2 特性

  1. 实时流批一体
    Iceberg上游组件将数据写入完成后,下游组件及时可读,可查询,可以满足实时场景。相对于kafka实现了存储层的持久化,但相对地会比kafka的实时性低。并且Iceberg结合Flink等计算引擎提供了流/批读接口、流/批写接口。可以在同一个流程里, 同时处理流数据和批数据,大大简化了ETL链路。

  2. 模式演化
    Iceberg保证模式演化(Schema Evolution)是没有副作用的独立操作流程, 一个元数据操作, 不会涉及到重写数据文件的过程。
    在表中Iceberg 使用唯一ID来定位每一列的信息。新增一个列的时候,会新分配给它一个唯一ID, 并且绝对不会使用已经被使用的ID。
    使用名称或者位置信息来定位列的, 都会存在一些问题, 比如使用名称的话,名称可能会重复, 使用位置的话, 不能修改顺序并且废弃的字段也不能删除。

  3. 分区演化
    Iceberg可以在一个已存在的表上直接修改,因为Iceberg的查询流程并不和分区信息直接关联。
    当我们改变一个表的分区策略时,对应修改分区之前的数据不会改变, 依然会采用老的分区策略,新的数据会采用新的分区策略,也就是说同一个表会有两种分区策略,旧数据采用旧分区策略,新数据采用新新分区策略, 在元数据里两个分区策略相互独立,不重合。
    在这里插入图片描述

  4. 隐藏分区
    Iceberg的分区信息并不需要人工维护, 它可以被隐藏起来. 不同其他类似Hive 的分区策略, Iceberg的分区字段/策略(通过某一个字段计算出来),可以不是表的字段和表数据存储目录也没有关系。在建表或者修改分区策略之后,新的数据会自动计算所属于的分区。在查询的时候同样不用关系表的分区是什么字段/策略,只需要关注业务逻辑,Iceberg会自动过滤不需要的分区数据。

  5. 时间旅行(Time Travel)
    Iceberg提供了查询表历史某一时间点数据镜像(snapshot)的能力。

  6. 支持事务(ACID)
    Iceberg通过提供事务(ACID)的机制,使其具备了upsert的能力并且使得边写边读成为可能,从而数据可以更快的被下游组件消费。通过事务保证了下游组件只能消费已commit的数据,而不会读到部分甚至未提交的数据。

  7. 文件级数据管理
    Iceberg的元数据里面提供了每个数据文件的一些统计信息,比如分区信息、各字段最大值,最小值,Count计数等等。因此,查询SQL的过滤条件除了常规的分区,列过滤,甚至可以下推到文件级别(hive只能定位到目录级别,因为分区是以目录的形式存在的),大大加快了查询效率。

2. 存储结构

在这里插入图片描述

2.1 数据文件(data files)

数据文件是Apache Iceberg表真实存储数据的文件,一般是在表的数据存储目录的data目录下,如果我们的文件格式选择的是parquet,那么文件是以“.parquet”结尾。

2.2 表快照(Snapshot)

快照代表一张表在某个时刻的状态。每个快照里面会列出表在某个时刻的所有 data files 列表。data files是存储在不同的manifest files里面,manifest files是存储在一个Manifest list文件里面,而一个Manifest list文件代表一个快照。

2.3 清单列表(Manifest list)

manifest list是一个元数据文件,它列出构建表快照(Snapshot)的清单(Manifest file)。这个元数据文件中存储的是Manifest file列表,每个Manifest file占据一行。每行中存储了Manifest file的路径、其存储的数据文件(data files)的分区范围,增加了几个数文件、删除了几个数据文件等信息,这些信息可以用来在查询时提供过滤,加快速度。

2.4 清单文件(Manifest file)

Manifest file也是一个元数据文件,它列出组成快照(snapshot)的数据文件(data files)的列表信息。每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小以及文件里面数据行数等信息。其中列级别的统计信息可以在扫描表数据时过滤掉不必要的文件。

2.5 查询流程分析

  1. 读取元数据文件 .metadata.json,获取当前最新的快照信息,知道对应的manifest-list路径
  2. 读取manifest-list,获取多个manifest-flie信息路径
  3. 读取manifest-flie,获取具体数据文件的位置
  4. 读取数据文件
    在这里插入图片描述

3. 与Flink集成

3.1 环境准备

3.1.1 安装Flink

Flink 版本Iceberg 版本
1.110.9.0 – 0.12.1
1.120.12.0 – 0.13.1
1.130.13.0 – 1.0.0
1.140.13.0 – 1.1.0
1.150.14.0 – 1.1.0
1.161.1.0 – 1.1.0
下载对应环境的jar包
tar -zxvf flink-1.16.0-bin-scala_2.12.tgz -C /opt/module/

配置环境变量

sudo vim /etc/profile.d/my_env.sh
---------------------------------------------------------
export HADOOP_CLASSPATH=`hadoop classpath`
---------------------------------------------------------
source /etc/profile.d/my_env.sh

拷贝iceberg的jar包到Flink的lib目录

cp /opt/software/iceberg/iceberg-flink-runtime-1.16-1.1.0.jar /opt/module/flink-1.16.0/lib

3.1.2 启动Sql-Client

1)修改flink-conf.yaml配置

vim /opt/module/flink-1.16.0/conf/flink-conf.yaml

classloader.check-leaked-classloader: false
taskmanager.numberOfTaskSlots: 4

state.backend: rocksdb
execution.checkpointing.interval: 30000
state.checkpoints.dir: hdfs://localhost:8020/ckps
state.backend.incremental: true

2)local模式

vim /opt/module/flink-1.16.0/conf/workers
#表示:会在本地启动3个TaskManager的 local集群
localhost
localhost
localhost

启动

/opt/module/flink-1.16.0/bin/start-cluster.sh

/opt/module/flink-1.16.0/bin/sql-client.sh embedded

3.2 语法

  1. 创建数据库
CREATE DATABASE iceberg_db;
USE iceberg_db;
  1. 创建表
CREATE TABLE `hive_catalog`.`default`.`sample` (
    id BIGINT COMMENT 'unique id',
    data STRING
);

1)创建分区表

CREATE TABLE `hive_catalog`.`default`.`sample` (
    id BIGINT COMMENT 'unique id',
    data STRING
) PARTITIONED BY (data);

Apache Iceberg支持隐藏分区,但Apache flink不支持在列上通过函数进行分区,现在无法在flink DDL中支持隐藏分区。
2)使用LIKE语法建表
LIKE语法用于创建一个与另一个表具有相同schema、分区和属性的表。

CREATE TABLE `hive_catalog`.`default`.`sample` (
    id BIGINT COMMENT 'unique id',
    data STRING
);

CREATE TABLE  `hive_catalog`.`default`.`sample_like` LIKE `hive_catalog`.`default`.`sample`;
  1. 修改表
    1)修改表属性
ALTER TABLE `hive_catalog`.`default`.`sample` SET ('write.format.default'='avro');

2)修改表名

ALTER TABLE `hive_catalog`.`default`.`sample` RENAME TO `hive_catalog`.`default`.`new_sample`;
  1. 删除表
DROP TABLE `hive_catalog`.`default`.`sample`;
  1. INSERT INTO
INSERT INTO `hive_catalog`.`default`.`sample` VALUES (1, 'a');
INSERT INTO `hive_catalog`.`default`.`sample` SELECT id, data from sample2;
  1. INSERT OVERWRITE
    仅支持Flink的Batch模式
SET execution.runtime-mode = batch;

INSERT OVERWRITE sample VALUES (1, 'a');

INSERT OVERWRITE `hive_catalog`.`default`.`sample` PARTITION(data='a') SELECT 6;
  1. UPSERT
    当将数据写入v2表格式时,Iceberg支持基于主键的UPSERT。有两种方法可以启用upsert。
    注意:当前虽然支持了upsert,但是做法并不优雅:例如之前是(1,’a’),插入了一条(1,’b’),是把(1,’a’)标记deleted,再新增一个数据文件,所以其实是有两个数据文件的产生,在实际生产中如果比较频繁地进行upsert是会有性能问题的。
    缓解措施:调大checkpoint间隔、定时执行合并小文件&快照过期等操作

    1)建表时指定
CREATE TABLE `hive_catalog`.`test1`.`sample5` (
  `id`  INT UNIQUE COMMENT 'unique id',
  `data` STRING NOT NULL,
 PRIMARY KEY(`id`) NOT ENFORCED
) with (
'format-version'='2', 
'write.upsert.enabled'='true'
);

2)插入时指定

INSERT INTO tableName /*+ OPTIONS('upsert-enabled'='true') */

插入的表,format-version需要为2。
OVERWRITE和UPSERT不能同时设置。在UPSERT模式下,如果对表进行分区,则分区字段必须也是主键。

  1. Batch模式查询
SET execution.runtime-mode = batch;
select * from sample;
  1. Streaming模式查询
SET execution.runtime-mode = streaming;
SET table.dynamic-table-options.enabled=true;
SET sql-client.execution.result-mode=tableau;

#从当前快照读取所有记录,然后从该快照读取增量数据
SELECT * FROM sample5 /*+ OPTIONS('streaming'='true', 'monitor-interval'='1s')*/ ;

#读取指定快照id(不包含)后的增量数据
SELECT * FROM sample /*+ OPTIONS('streaming'='true', 'monitor-interval'='1s', 'start-snapshot-id'='3821550127947089987')*/ ;

注意:如果是无界数据流式upsert进iceberg表(读kafka,upsert进iceberg表),那么再去流读iceberg表会存在读不出数据的问题。如果无界数据流式append进iceberg表(读kafka,append进iceberg表),那么流读该iceberg表可以正常看到结果。

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

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

相关文章

产品经理入门学习(一):认识产品经理

参考引用 黑马-产品经理入门基础课程 1. 合格的产品经理 1.1 什么是产品 上述产品的共性:解决某个问题的东西上述产品的区别 有形(上图左):颜色、形状、质地和尺寸无形(上图右):脑力劳动成果、…

Leetcode—101.对称二叉树【简单】

2023每日刷题(十九) Leetcode—101.对称二叉树 利用Leetcode101.对称二叉树的思想的实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSa…

华为升腾C92安装win7

华为升腾C92安装win7 不知道什么原因,当初那批C92配置到学校班班通时,安装的是Linux系统。这也造成了我错误地认为C92这个小鸡子太弱了,只能运行Linux还行,无法运行Windows的。 其实错了,我们可以在C92开机时&#xff…

轻量封装WebGPU渲染系统示例<15>- DrawInstance批量绘制(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/DrawInstanceTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见:引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。…

IEEE CAI2024

投递链接: ​https://ieeecai.org/2024/

Spring 中 BeanFactory 和 FactoryBean 有何区别?

这也是 Spring 面试时一道经典的面试问题,今天我们来聊一聊这个话题。 其实从名字上就能看出来个一二,BeanFactory 是 Factory 而 FactoryBean 是一个 Bean,我们先来看下总结: BeanFactory 是 Spring 框架的核心接口之一&#xf…

Leetcode—110.平衡二叉树【简单】

2023每日刷题(十九) Leetcode—110.平衡二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int preFunc(struct TreeNode* root) {if(root…

LeetCode算法心得——路径总和||(dfs+双端队列+链表)

大家好,我是晴天学长,简单树的经典题目,是dfs的开端啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .路径总和|| 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子…

蓝牙耳机有什么功能怎么用,蓝牙耳机的用法和功能分享

蓝牙耳机最基本的功能就是接听电话,听音乐,兼容其他软件进行无线操作,同时还可以调节音量,播放暂停等功能。不过现如今蓝牙耳机中出现了一个新型的派别——骨传导蓝牙耳机,可以让你在享受音乐的同时,也能保…

6、QtCharts 悬浮曲线效果

文章目录 效果dialog.hdialog.cpp悬浮槽函数 效果 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QtCharts> #include <QLineSeries> #include <QGraphicsScene> #include <QTimer> #include <QSplineSeries>…

为什么在DTO中请要使用包装类型

Java是一种强类型的面向对象编程语言&#xff0c;它为我们提供了一种特殊的类别&#xff0c;叫做数据传输对象&#xff08;Data Transfer Object&#xff0c;DTO&#xff09;。在本篇文章中&#xff0c;我们将详细讨论为什么在DTO中使用包装类型而非基础类型。 1. 什么是DTO&a…

电池原理与分类

1 电池基础知识 电池目前大量应用于我们的生活中&#xff0c;主要包括3C消费类、动力类、储能类。 图1 电池应用方向 备注&#xff1a;3C指的是计算机(Computer )、通讯&#xff08;Communication&#xff09;消费类电子产品&#xff08;Consumer Electronic&#xff09;三类…

GPT4做网页,完成度竟然这么高!!!

CHATGPT简介 chatgpt的自我介绍是这样的&#xff1a; 最近一段时间内&#xff0c;chatgpt可谓是数次引发热议&#xff0c;现在&#xff0c;让我们一起来看看&#xff0c;他所制作的网页究竟能到什么地步呢&#xff1f; 提示词 我给了CHATGPT如下的提示词&#xff0c;那么它…

【一周安全资讯1104】证监会发布《上市公司公告电子化规范》等9项金融行业标准;北京网信办对三家违反数据安全法规企业作出行政处罚

要闻速览 1、证监会发布《上市公司公告电子化规范》等9项金融行业标准 2、《网络安全标准实践指南—粤港澳大湾区跨境个人信息保护要求》公开征求意见 3、北京市网信办对三家企业未履行数据安全保护义务作出行政处罚 4、加拿大禁止政府雇员使用微信和卡巴斯基 5、次覆盖“人的…

CSS解决div行变块 ➕ CSS解决“table中的td文字溢出控制显示字数,显示省略号”的问题

CSS解决div行变块 ➕ CSS解决“table中的td文字溢出控制显示字数&#xff0c;显示省略号”的问题 1. div变块级设置1.1 先看不设置的效果1.2 再看设置之后的效果 2. 解决 table 中 td 内容过长问题2.1 CSS实现&#xff08;文字溢出控制td显示字数&#xff0c;显示省略号&#x…

ssm在线互助答疑系统-计算机毕设 附源码 20862

ssm在线互助答疑系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#…

(免费领源码)java#ssm#mysql 宠物领养系统08465-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1课题背景及意义 1.2研究现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 …

LeetCode 421. 数组中两个数的最大异或值

原题链接&#xff1a;https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/?envTypedaily-question&envId2023-11-04 题目分析 异或且时间复杂度在nlogn内第一反应想到字典树&#xff0c;扫一遍存进字典树&#xff0c;然后遍历每个数&…

CAM模型可视化(可解释)

模型的可解释性问题一直是个关注的热点。注意&#xff0c;本文所说的“解释”&#xff0c;与我们日常说的“解释”内涵不一样&#xff1a;例如我们给孩子一张猫的图片&#xff0c;让他解释为什么这是一只猫&#xff0c;孩子会说因为它有尖耳朵、胡须等。而我们让CNN模型解释为什…

yolov5简易使用

1.环境配置 从github上下载好yolov5源码后&#xff0c;根据requirement文件配置环境&#xff0c;使用conda新建一个仿真环境&#xff0c;接着使用 pip install -r requirements.txt 来安装环境&#xff0c;安装后首先运行detect.py 发现安装后的环境不能使用&#xff0c;报…