[大数据] Iceberg

news2024/11/23 17:37:26

G:\Bigdata\25.iceberg

3章 与 Hive集成

3.1 环境准备

1)Hive与Iceberg的版本对应关系如下

Hive 版本

官方推荐Hive版本

Iceberg 版本

2.x

2.3.8

0.8.0-incubating – 1.1.0

3.x

3.1.2

0.10.0 – 1.1.0

Iceberg与Hive 2和Hive 3.1.2/3的集成,支持以下特性:

  • 创建表
  • 删除表
  • 读取表
  • 插入表(INSERT into)

更多功能需要Hive 4.x(目前alpha版本)才能支持。

2) 上传jar包,拷贝到Hive的auxlib目录中

mkdir auxlib

cp iceberg-hive-runtime-1.1.0.jar /opt/module/hive/auxlib

cp libfb303-0.9.3.jar /opt/module/hive/auxlib

3) 修改hive-site.xml,添加配置项

<property>

<name>iceberg.engine.hive.enabled</name>

<value>true</value>

</property>

<property>

<name>hive.aux.jars.path</name>

<value>/opt/module/hive/auxlib</value>

</property>

使用TEZ引擎注意事项:

(1)使用Hive版本>=3.1.2,需要TEZ版本>=0.10.1

(2)指定tez更新配置:

<property>

<name>tez.mrreader.config.update.properties</name>

<value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value>

</property>

(3)从Iceberg 0.11.0开始,如果Hive使用Tez引擎,需要关闭向量化执行:

<property>

<name>hive.vectorized.execution.enabled</name>

<value>false</value>

</property>

4)启动HMS服务

5)启动 Hadoop

3.2 创建和管理 Catalog

Iceberg支持多种不同的Catalog类型,例如:Hive、Hadoop、亚马逊的AWS Glue和自定义Catalog。

根据不同配置,分为三种情况:

  • 没有设置iceberg.catalog,默认使用HiveCatalog

配置项

说明

iceberg.catalog.<catalog_name>.type

Catalog的类型: hive, hadoop, 如果使用自定义Catalog,则不设置

iceberg.catalog.<catalog_name>.catalog-impl

Catalog的实现类, 如果上面的type没有设置,则此参数必须设置

iceberg.catalog.<catalog_name>.<key>

Catalog的其他配置项

  • 设置了 iceberg.catalog的类型,使用指定的Catalog类型,如下表格:
  • 设置 iceberg.catalog=location_based_table,直接通过指定的根路径来加载Iceberg表

3.1.1 默认使用 HiveCatalog

CREATE TABLE iceberg_test1 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

INSERT INTO iceberg_test1 values(1);

查看HDFS可以发现,表目录在默认的hive仓库路径下。

3.1.2 指定 Catalog 类型

1)使用 HiveCatalog

set iceberg.catalog.iceberg_hive.type=hive;

set iceberg.catalog.iceberg_hive.uri=thrift://hadoop1:9083;

set iceberg.catalog.iceberg_hive.clients=10;

set iceberg.catalog.iceberg_hive.warehouse=hdfs://hadoop1:8020/warehouse/iceberg-hive;

CREATE TABLE iceberg_test2 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

TBLPROPERTIES('iceberg.catalog'='iceberg_hive');

INSERT INTO iceberg_test2 values(1);

 describe formatted iceberg_test2; 

2)使用 HadoopCatalog

set iceberg.catalog.iceberg_hadoop.type=hadoop;

set iceberg.catalog.iceberg_hadoop.warehouse=hdfs://hadoop1:8020/warehouse/iceberg-hadoop;

CREATE TABLE iceberg_test3 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

LOCATION 'hdfs://hadoop1:8020/warehouse/iceberg-hadoop/default/iceberg_test3'

TBLPROPERTIES('iceberg.catalog'='iceberg_hadoop');

INSERT INTO iceberg_test3 values(1);

3.1.3 指定路径加载

如果HDFS中已经存在iceberg格式表,我们可以通过在Hive中创建Icerberg格式表指定对应的location路径映射数据。

CREATE EXTERNAL TABLE iceberg_test4 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

LOCATION 'hdfs://hadoop1:8020/warehouse/iceberg-hadoop/default/iceberg_test3'

TBLPROPERTIES ('iceberg.catalog'='location_based_table');

3.3 基本操作

3.3.1 创建表

1)创建外部表

CREATE EXTERNAL TABLE iceberg_create1 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

describe formatted iceberg_create1;

2)创建内部表

CREATE TABLE iceberg_create2 (i int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

describe formatted iceberg_create2;

3)创建分区表

CREATE EXTERNAL TABLE iceberg_create3 (id int,name string)

PARTITIONED BY (age int)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

describe formatted iceberg_create3;

Hive语法创建分区表,不会在HMS中创建分区,而是将分区数据转换为Iceberg标识分区。这种情况下不能使用Iceberg的分区转换,例如:days(timestamp),如果想要使用Iceberg格式表的分区转换标识分区,需要使用Spark或者Flink引擎创建表。

3.3.2 修改表

只支持HiveCatalog表修改表属性,Iceberg表属性和Hive表属性存储在HMS中是同步的。

ALTER TABLE iceberg_create1 SET TBLPROPERTIES('external.table.purge'='FALSE');

external.table.purge 如果为true的话,在删除外部表的时候会删除数据,默认为true,为了安全起见修改为false.

3.3.3 插入表

支持标准单表INSERT INTO操作

INSERT INTO iceberg_create2 VALUES (1);

INSERT INTO iceberg_create1 select * from iceberg_create2;

在HIVE 3.x中,INSERT OVERWRITE虽然能执行,但其实是追加。

3.3.4 删除表

DROP TABLE iceberg_create1;

4章 与 Spark SQL集成

4.1 环境准备

4.1.1 安装 Spark

1)Spark与Iceberg的版本对应关系如下

Spark 版本

Iceberg 版本

2.4

0.7.0-incubating – 1.1.0

3.0

0.9.0 – 1.0.0

3.1

0.12.0 – 1.1.0

3.2

0.13.0 – 1.1.0

3.3

0.14.0 – 1.1.0

2)上传并解压Spark安装包

tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/module/

mv /opt/module/spark-3.3.1-bin-hadoop3 /opt/module/spark-3.3.1

3)配置环境变量

sudo vim /etc/profile.d/my_env.sh

export SPARK_HOME=/opt/module/spark-3.3.1

export PATH=$PATH:$SPARK_HOME/bin

source /etc/profile.d/my_env.sh

4)拷贝iceberg的jar包到Spark的jars目录

cp /opt/software/iceberg/iceberg-spark-runtime-3.3_2.12-1.1.0.jar /opt/module/spark-3.3.1/jars

4.1.2 启动 Hadoop

(略)

4.2 Spark 配置 Catalog

Spark中支持两种Catalog的设置:hive和hadoop,Hive Catalog就是Iceberg表存储使用Hive默认的数据路径,Hadoop Catalog需要指定Iceberg格式表存储路径。

vim spark-defaults.conf

4.2.1 Hive Catalog

spark.sql.catalog.hive_prod = org.apache.iceberg.spark.SparkCatalog

spark.sql.catalog.hive_prod.type = hive

spark.sql.catalog.hive_prod.uri = thrift://hadoop1:9083

use hive_prod.db;

use hive_prod.default;

4.2.2 Hadoop Catalog

spark.sql.catalog.hadoop_prod = org.apache.iceberg.spark.SparkCatalog

spark.sql.catalog.hadoop_prod.type = hadoop

spark.sql.catalog.hadoop_prod.warehouse = hdfs://hadoop1:8020/warehouse/spark-iceberg

use hadoop_prod.db;

比如: use hadoop_prod.default;

在 Spark SQL 中,如果您还没有创建任何数据库(db_name),您不能直接使用 USE hadoop_prod.db_name; 命令,因为该数据库尚不存在。

创建数据库和表的步骤

  1. 启动 Spark SQL CLI

    首先,按您之前的方式启动 Spark SQL CLI:

    spark-sql --conf spark.sql.catalog.hadoop_prod=org.apache.iceberg.spark.SparkCatalog \
               --conf spark.sql.catalog.hadoop_prod.type=hadoop \
               --conf spark.sql.catalog.hadoop_prod.warehouse=hdfs://hadoop1:8020/warehouse/spark-iceberg
    
  2. 创建数据库

    在 Spark SQL CLI 中,您可以使用 CREATE DATABASE 命令来创建一个新的数据库。例如,创建一个名为 db_name 的数据库:

    CREATE DATABASE hadoop_prod.db_name;
    
  3. 使用数据库

    一旦创建了数据库,您就可以使用 USE 命令切换到这个数据库:

    USE hadoop_prod.db_name;
    
  4. 创建表

    在选择了数据库后,您可以创建表。例如:

    CREATE TABLE table_name (
        id INT,
        name STRING
    ) USING iceberg;
    
  5. 插入和查询数据

    您现在可以插入数据并查询表:

    INSERT INTO table_name VALUES (1, 'Alice'), (2, 'Bob');
    SELECT * FROM table_name;
    

完整示例

以下是您在 Spark SQL CLI 中的完整操作流程:

-- 创建数据库
CREATE DATABASE hadoop_prod.db_name;

-- 使用数据库
USE hadoop_prod.db_name;

-- 创建表
CREATE TABLE table_name (
    id INT,
    name STRING
) USING iceberg;

-- 插入数据
INSERT INTO table_name VALUES (1, 'Alice'), (2, 'Bob');

-- 查询数据
SELECT * FROM table_name;

注意事项

  • 确保在执行 CREATE DATABASE 和其他 SQL 命令时,您已经在 Spark SQL CLI 中,并且连接到正确的 Iceberg catalog。
  • 如果您在创建数据库或表时遇到权限问题,请确保您有足够的权限在指定的 HDFS 路径下创建相应的目录和文件。

-- 创建数据库
CREATE DATABASE hadoop_prod.db_name;

-- 使用数据库
USE hadoop_prod.db_name;

-- 确认当前数据库
SELECT current_database(); -- 应返回 hadoop_prod.db_name

-- 创建表
CREATE TABLE table_name (
    id INT,
    name STRING
) USING iceberg;

-- 列出当前数据库的表
SHOW TABLES; -- 应显示 table_name

4.3 SQL 操作

4.3.1 创建表

use hadoop_prod;

create database default;

use default;

CREATE TABLE hadoop_prod.default.sample1 (

    id bigint COMMENT 'unique id',

    data string)

USING iceberg

  • PARTITIONED BY (partition-expressions) :配置分区
  • LOCATION '(fully-qualified-uri)' :指定表路径
  • COMMENT 'table documentation' :配置表备注
  • TBLPROPERTIES ('key'='value', ...) :配置表属性

表属性:Configuration - Apache Iceberg™

对Iceberg表的每次更改都会生成一个新的元数据文件(json文件)以提供原子性。默认情况下,旧元数据文件作为历史文件保存不会删除。

如果要自动清除元数据文件,在表属性中设置write.metadata.delete-after-commit.enabled=true。这将保留一些元数据文件(直到write.metadata.previous-versions-max),并在每个新创建的元数据文件之后删除旧的元数据文件。

1)创建分区表

(1)分区表

CREATE TABLE hadoop_prod.default.sample2 (

    id bigint,

    data string,

    category string)

USING iceberg

PARTITIONED BY (category)

(2)创建隐藏分区表

CREATE TABLE hadoop_prod.default.sample3 (

    id bigint,

    data string,

    category string,

    ts timestamp)

USING iceberg

PARTITIONED BY (bucket(16, id), days(ts), category)

支持的转换有:

  • years(ts):按年划分
  • months(ts):按月划分
  • days(ts)或date(ts):等效于dateint分区
  • hours(ts)或date_hour(ts):等效于dateint和hour分区
  • bucket(N, col):按哈希值划分mod N个桶
  • truncate(L, col):按截断为L的值划分

字符串被截断为给定的长度

整型和长型截断为bin: truncate(10, i)生成分区0,10,20,30,…

2)使用 CTAS 语法建表

CREATE TABLE hadoop_prod.default.sample4

USING iceberg

AS SELECT * from hadoop_prod.default.sample3

不指定分区就是无分区,需要重新指定分区、表属性:

CREATE TABLE hadoop_prod.default.sample5

USING iceberg

PARTITIONED BY (bucket(8, id), hours(ts), category)

TBLPROPERTIES ('key'='value')

AS SELECT * from hadoop_prod.default.sample3

3)使用 Replace table 

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

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

相关文章

JMeter监听器与压测监控之Grafana

Grafana 是一个开源的度量分析和可视化套件&#xff0c;通常用于监控和观察系统和应用的性能。本文将指导你如何在 Kali Linux 上使用 Docker 来部署 Grafana 性能监控平台。 前提条件 Kali Linux&#xff1a;确保你已经安装了 Kali Linux。Docker&#xff1a;确保你的系统已…

C/C++ 优化,strlen 示例

目录 C/C optimization, the strlen examplehttps://hallowed-blinker-3ca.notion.site/C-C-optimization-the-strlen-example-108719425da080338d94c79add2bb372 揭开优化的神秘面纱... 让我们来谈谈 CPU 等等&#xff0c;SIMD 是什么&#xff1f; 为什么 strlen 是一个很…

【Linux学习】【Ubuntu入门】1-8 ubuntu下压缩与解压缩

1.Linux系统下常用的压缩格式 常用的压缩扩展名&#xff1a;.tar、.tar.bz2、.tar.gz 2.Windows下7ZIP软件安装 Linux系统下很多文件是.bz2&#xff0c;.gz结尾的压缩文件。 3.Linux系统下gzip压缩工具 gzip工具负责压缩和解压缩.gz格式的压缩包。 gzip对单个文件进行…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

Java基础知识(五)

文章目录 ObjectObject 类的常见方法有哪些&#xff1f; 和 equals() 的区别hashCode() 有什么用&#xff1f;为什么要有 hashCode&#xff1f;为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 参考链接 Object Object 类的常见方法有哪些&#xff1f; Object 类…

[高阶数据结构(一)]并查集详解

1.前言 本系列会带大家走进高阶数据结构的学习, 其中包括并查集,图论, LRU cache, B树, B树, B*树, 跳表. 其中, 图论中讲解的时间最长, 包括邻接表, 邻接矩阵, 广度优先遍历, 深度优先遍历, 最小生成树中的kruskal算法以及prim算法&#xff1b;最短路径中的dijkstra算法, bell…

应聘美容师要注意什么?博弈美业收银系统/管理系统/拓客系统分享建议

随着美容行业的不断发展&#xff0c;成为一名优秀的美容师需要具备一系列重要的技能和品质。无论是在面试过程中还是在实际工作中&#xff0c;以下建议将帮助你在应聘美容师职位时脱颖而出&#xff1a; ▶ 专业技能和资格 首先&#xff0c;确保你具备所需的专业技能和资格。这…

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

vmWare虚拟环境centos7安装Hadoop 伪分布式实践

背景&#xff1a;近期在研发大数据中台&#xff0c;需要研究Hadoop hive 的各种特性&#xff0c;需要搭建一个Hadoop的虚拟环境&#xff0c;本来想着使用dock &#xff0c;但突然发现docker 公共仓库的镜像 被XX 了&#xff0c;无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…

Redis基本的全局命令

在学习redis基本的全局命令之前呢&#xff0c;我们必须先进入redis-cli客户端才行。 如图&#xff1a; get和set get和set是redis两个最核心的命令。 get&#xff1a;根据key来获取value。 set&#xff1a;把key和value存储进去。 如set命令如图&#xff1a; 对于上述图中&…

Redis五大基本类型——List列表命令详解(命令用法详解+思维导图详解)

目录 一、List列表类型介绍 二、常见命令 1、LPUSH 2、LPUSHX 3、RPUSH 4、RPUSHX 5、LRANGE 6、LPOP 7、RPOP 8、LREM 9、LSET 10、LINDEX 11、LINSERT 12、LLEN 13、阻塞版本命令 BLPOP BRPOP 三、命令小结 相关内容&#xff1a; Redis五大基本类型——Ha…

一文详解哋它亢模块的安装与使用

如何安装哋它亢模块 哋它亢模块是扩展哋它亢功能的关键工具&#xff0c;它们涵盖了从数据分析到机器学习的各种应用场景。通过安装和使用这些模块&#xff0c;你可以轻松完成复杂的任务&#xff0c;大幅提升开发效率。哋它亢是一门易于学习且功能强大的编程语言&#xff0c;以…

C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合

在C#编程中&#xff0c;二维数组&#xff08;或矩阵&#xff09;是一种重要的数据结构&#xff0c;它不仅能够高效地存储和组织数据&#xff0c;还能通过其行、列和交叉点&#xff08;备注&#xff1a;此处相交处通常称为“元素”或“单元格”&#xff0c;代表二维数组中的一个…

论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)

一.基本信息 论文名称&#xff1a;Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译&#xff1a;基于长短期记忆(LSTM)的入侵检测系统 DOI&#xff1a;10.1186/s40537-021-00448-4 作者&#xff1a;FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…

【行之有效】实证软件工程研究方法

【行之有效】实证软件工程研究方法 一、实证研究二、实证软件工程2.1 系统化文献评价2.2 调查研究2.2.1 数据收集2.2.2 抽样 2.3 案例研究2.3 实证研究效度 一、实证研究 实证研究&#xff08;Empirical Research&#xff09;方法是一种与规范研究&#xff08;Normative Resea…

大数据挖掘期末复习

大数据挖掘 数据挖掘 数据挖掘定义 技术层面&#xff1a; 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …

河道水位流量一体化自动监测系统:航运安全的护航使者

在广袤的水域世界中&#xff0c;航运安全始终是至关重要的课题。而河道水位流量一体化自动监测系统的出现&#xff0c;如同一位强大的护航使者&#xff0c;为航运事业的稳定发展提供了坚实的保障。 水位传感器&#xff1a;负责实时监测河道的水位变化。这些传感器通常采用先进的…

【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 C继承机制详解与代码示例&#x1f4cc;1. 继承的基本概念&#x1f4cc; 2.…

根据条件 控制layui的table的toolbar的按钮 显示和不显示

部分代码&#xff1a; <!-----查询条件-----> <input type"date" id"StartDate" onchange"PageList()" /> <input type"date" id"EndDate" onchange"PageList()" /><!-----表格Table-----&…