iceberg学习笔记(2)—— 与Hive集成

前置知识:

1.了解hadoop基础知识,并能够搭建hadoop集群 

2.了解hive基础知识

3.Iceberg学习笔记(1)—— 基础知识-CSDN博客

可以参考:

Hadoop基础入门(1):框架概述及集群环境搭建_THE WHY的博客-CSDN博客

Hive基础知识总结-CSDN博客

环境准备

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的集成,支持以下特性:

  1. 创建表
  2. 删除表
  3. 读取表
  4. 插入表(INSERT into)

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

hive与iceberg的环境搭建:
1.上传jar包到hive的路径下:

mkdir auxlib

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

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

auxlib文件夹通常用于存放一些用户自定义的jar包,比如UDF、UDAF函数等

在hive-site.xml中可以通过hive.aux.jars.path参数绑定auxlib文件夹的路径

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

<property>
  <name>iceberg.engine.hive.enabled</name>
  <value>true</value>
</property>

<property>
  <name>hive.aux.jars.path</name>
  <value>/opt/module/apache-hive-3.1.2-bin/auxlib</value>
</property>

开启iceberg支持以及绑定jar包依赖


如果hive需要使用Tez引擎,注意事项如下:

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

2.在hive-site.xml中指定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>

有关Tez引擎:

Tez是一个由Apache开源的支持DAG作业的计算框架,它直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分。在Hive中,Tez被用作其运行引擎,性能优于Hive默认的MR引擎。这主要是因为Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能

有关向量化执行:

Hive的向量化执行是一种优化技术,它将查询操作应用于数据向量。传统的Hive执行方式是逐行处理数据,而向量化模式则允许一次处理多行数据,从而减少了数据处理的开销。这种模式通过将一组数据作为一个向量进行处理,利用SIMD(单指令多数据)指令集来并行执行操作,进而提高了查询的效率。然而,值得注意的是,开启向量化并不是万能的,它需要同时满足一些条件才能发挥出效果。此外,向量化查询执行在Hive 0.13.0及以后版本可用,并且默认情况下是关闭的,用户可以通过设置"set hive.vectorized.execution"来启用。


相关配置完成后开启hadoop以及HMS服务即可

nohup /opt/module/apache-hive-3.1.2-bin/bin/hive --service metastore &

nohup /opt/module/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &

/opt/module/apache-hive-3.1.2-bin/bin/beeline -u jdbc:hive2://hadoop102:10000 -n why

Hive Catalog

catalog是database的上一层抽象,翻译过来叫做“目录”

catalog的作用在于提供了远端连接的入口,对元数据进行统一的管理

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

  • 没有设置iceberg.catalog,默认使用HiveCatalog
CREATE TABLE iceberg_test1 (i int) 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

通过STORED BY指定创建的是iceberg表

在hive4中,可以简写为'iceberg'

  • 设置了 iceberg.catalog的类型,使用指定的Catalog类型:

配置项

说明

iceberg.catalog.<catalog_name>.type

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

iceberg.catalog.<catalog_name>.catalog-impl

Catalog的实现类, 如果上面的type没有设置,则此参数必须设置(适用于自定义的catalog)

iceberg.catalog.<catalog_name>.<key>

Catalog的其他配置项

  • 设置 iceberg.catalog=location_based_table,直接通过指定的根路径来加载Iceberg表

使用默认的catalog

CREATE TABLE iceberg_test1 (i int) 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

INSERT INTO iceberg_test1 values(1);

指定catalog类型

使用 HiveCatalog

首先进行相关参数的设置:

set iceberg.catalog.iceberg_hive.type=hive;
set iceberg.catalog.iceberg_hive.uri=thrift://hadoop102:9083;
set iceberg.catalog.iceberg_hive.clients=10;
set iceberg.catalog.iceberg_hive.warehouse=hdfs://hadoop102:8020/user/hive/warehouse/iceberg-hive;

然后创建表并插入数据,通过TBLPROPERTIES指定catalog的类型;

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);

问题说明:

iceberg.catalog.iceberg_hive.type中,iceberg_hive是自定义的名称,只要和TBLPROPERTIES('iceberg.catalog'='iceberg_hive');中的对应起来就可以;

iceberg.catalog.iceberg_hive.warehouse设置失效,但官网的示例是这样给出的,无论如何设置该参数,路径仍会按照hive-site.xml中配置的来存储

但使用HadoopCatalog时有效;

使用 HadoopCatalog

设置相关参数:

set iceberg.catalog.iceberg_hadoop.type=hadoop;
set iceberg.catalog.iceberg_hadoop.warehouse=hdfs://hadoop102:8020/user/hive/warehouse/iceberg-hadoop;

创建表并插入数据:

CREATE TABLE iceberg_test3 (i int) 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' 
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/iceberg-hadoop/default/iceberg_test3'
TBLPROPERTIES('iceberg.catalog'='iceberg_hadoop');

INSERT INTO iceberg_test3 values(1);

注意:

必须设置LOCATION,且其中的路径和iceberg.catalog.iceberg_hadoop.warehouse配置的要一致,否则会报错;

指定路径加载

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

DROP TABLE IF EXISTS iceberg_test4;
CREATE EXTERNAL TABLE iceberg_test4 (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/iceberg-hadoop/default/iceberg_test3'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');

如上例,基于hdfs://hadoop102:8020/user/hive/warehouse/iceberg-hadoop/default/iceberg_test3路径创建了表iceberg_test4,这样iceberg_test3中的数据就能同步到iceberg_test4中去;

需要注意:

①两张表的表格式需要相同;

②iceberg_test4需要是外部表(EXTERNAL),否则修改iceberg_test4中的数据可能对iceberg_test3中的数据造成影响

③指定LOCATION时一定要注意指定正确的位置,因为即使路径不存在也不会报错,但数据无法同步

基本操作

创建表

创建外部表
CREATE EXTERNAL TABLE iceberg_create1 (i int) 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

describe formatted iceberg_create1;

创建内部表
CREATE TABLE iceberg_create2 (i int) 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

describe formatted iceberg_create2;

创建分区表
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引擎创建表

修改表

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

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

插入表

支持标准单表INSERT INTO操作

INSERT INTO iceberg_create2 VALUES (1);
INSERT INTO iceberg_create1 select * from iceberg_create2;

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

INSERT OVERWRITE TABLE iceberg_create2 VALUES (2);

查询后发现数据并没有覆盖掉:

删除表

drop table <tablename>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome添加扩展程序

Crx4Chrome 下载crx 打开扩展程序 如果拖动crx文件到扩展程序提示只能通过Chrome应用商店添加此项内容 修改crx文件后缀为zip并解压&#xff0c;再拖动到扩展程序

CXL崛起:2024启航,2025年开启新时代

在2019年&#xff0c;Intel主导联合多家阿里巴巴、Facebook(也就是改名后Meta)、谷歌、Dell、华为、思科、微软、HPE最初的八巨头&#xff0c;发布了新的互联协议CXL&#xff0c;全称Comupte Express Link。由于在服务器领域享有绝对领导地位&#xff0c;Intel一经号令&#xf…

消息中间的应用场景

1、异步处理 比如用户在电商网站下单&#xff0c;下单完成后会给用户推送短信或邮件&#xff0c;发短信和邮件的过程就可以异步完成。因为下单付款是核心业务&#xff0c;发邮件和短信并不属于核心功能&#xff0c;并且可能耗时较长&#xff0c;所以针对这种业务场景可以选择先…

【Qt开发流程】之程序主窗口

描述 就目前的应用程序而言&#xff0c;一般包含菜单栏、工具栏、状态栏、中央区域等。 qt窗口部件类图如下&#xff1a; 一个主窗口提供了一个构建应用程序用户界面的框架。 Qt有QMainWindow及其相关类来管理主窗口。 QMainWindow有自己的布局&#xff0c;可以向其中添加QTo…

测试之路,女孩子软件测试-职业规划建议,路就在脚下...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试岗是不是加…

Upwork 新手使用指南——如何快速在Upwork上接单

Upwork 这个自由职业平台不知道大家听说过没&#xff0c;在 Upwork&#xff0c;如果你是自由职业者&#xff0c;你可以接单&#xff1b;如果你是客户&#xff0c;你可以找人干活。但对于新手来说&#xff0c;怎么使用 Upwork 并且用好 Upwork 是一大难题。因此今天给大家分享 U…

Mistral 7B 比Llama 2更好的开源大模型 (四)

Mistral 7B在平衡高性能和保持大型语言模型高效的目标方面迈出了重要的一步。通过我们的工作,我们的目标是帮助社区创建更实惠、更高效、更高性能的语言模型,这些模型可以在广泛的现实世界应用程序中使用。 Mistral 7B在实践中,对于16K和W=4096的序列长度,对FlashAttentio…

Modbus转Profinet网关在污水处理系统中连接PLC和变频器Modbus通信案例

污水处理系统中使用Modbus转Profinet网关可以连接PLC和变频器&#xff0c;实现二者之间的通信。该网关的作用是将PLC与变频器之间的Modbus协议转换为Profinet协议&#xff0c;使两者可以相互沟通。在污水处理系统中&#xff0c;PLC控制污水处理的各个过程&#xff0c;而变频器则…

机器学习二元分类 二元交叉熵 二元分类例子

二元交叉熵损失函数 深度学习中的二元分类损失函数通常采用二元交叉熵&#xff08;Binary Cross-Entropy&#xff09;作为损失函数。 二元交叉熵损失函数的基本公式是&#xff1a; L(y, y_pred) -y * log(y_pred) - (1 - y) * log(1 - y_pred)其中&#xff0c;y是真实标签&…

【性能测试】稳定性测试要点-监控关键指标总结(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、稳定性测试的要…

接口与抽象类的区别

Java中的接口&#xff08;Interface&#xff09;和抽象类&#xff08;Abstract Class&#xff09;都是实现抽象化的关键机制&#xff0c;但它们在用途和功能上有着明显的区别。以下是接口和抽象类之间的主要区别&#xff1a; 抽象类&#xff08;Abstract Class&#xff09; 含…

Docker之虚悬镜像(查看、删除)

虚悬镜像: 仓库名、标签都是的镜像&#xff0c;俗称dangling image 查看 docker image ls -f danglingtrue删除 虚悬镜像已经失去存在价值&#xff0c;可以删除 docker image prune

LeetCode977.有序数组的平方(双指针法、暴力法、列表推导式)

LeetCode977.有序数组的平方 1.问题描述2.解题思路3.代码4.知识点 1.问题描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] …

要事第一:如何通过6个步骤确定项目的优先级

当收到很多项目请求并且每个请求都是重中之重时&#xff0c;该怎么办&#xff1f;从最易完成的开始&#xff1f;还是先解决最大的问题&#xff1f; 实际上两种做法都不对。确定项目优先级的更好方法是评估以下内容&#xff0c;而不是关注项目规模或完成时长&#xff1a; ● 每…

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…

pycharm2023 实现鼠标点击某行,调试时代码运行至相应行

按下图取消 Breakpoints Over Line Numbers即可&#xff0c;然后调试时点击某行&#xff0c;代码就会运行至某行

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始&#xff0c;每一项都等于前两项之和。 输入一个整数 N &#xff0c;请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c;用于执行对关系型…

HTTP四种请求方式,状态码,请求和响应报文

1.get请求 一般用于获取数据请求参数在URL后面请求参数的大小有限制 2.post请求 一般用于修改数据提交的数据在请求体中提交数据的大小没有限制 3.put请求 一般用于添加数据 4.delete请求 一般用于删除数据 5.一次完整的http请求过程 域名解析&#xff1a;使用DNS协议…