On this page
Hive Kudu 整合
Overview
Apache Kudu是一个开源数据存储引擎,可以轻松快速地分析快速变化的数据。
Implementation
最初的实现已添加到HIVE-12971的 Hive 4.0 中,旨在与 Kudu 1.2 一起使用。
该实现由两个主要组件组成:KuduStorageHandler
和KuduPredicateHandler
。 KuduStorageHandler
是 Hive StorageHandler的实现。此类的主要作用是 ManagementHive 表到 Kudu 表的 Map 并配置 Hive 查询。 KuduPredicateHandler 用于将过滤器操作下推到 Kudu,以提高 IO 效率。
注意 :最初的实现被认为是experimental
,因为还有sub-jiras处于开放状态,以使实现更具可配置性和性能。当前仅支持指向现有 Kudu 表的外部表。支持创建和更改通过HIVE-22021跟踪的基础 Kudu 表。 HIVE-22027跟踪对 UPDATE,UPPERT 和 DELETE 语句的完全支持。
Hive Configuration
要使用 Hive 对 Kudu 发出查询,Hive 配置可以提供一个可选参数:
Hive Configuration | |
---|---|
hive.kudu.master.addresses.default |
所有 Kudu 主地址的逗号分隔列表。 |
如果未设置* kudu.master_addresses *表属性,则该值仅用于给定的表。
对于熟悉 Kudu 的人来说,主地址配置是连接到 Kudu 所需的常规配置值。提供此值的最简单方法是使用hive
命令的-hiveconf
选项。
hive -hiveconf hive.kudu.master.addresses.default=localhost:7051
Table Creation
要访问 Kudu 表,必须使用带有STORED BY
子句的CREATE
命令来创建 Hive 表。在HIVE-22021完成之前,必须使用EXTERNAL
关键字,它将创建引用现有 Kudu 表的 Hive 表。删除外部 Hive 表不会删除基础的 Kudu 表。
CREATE EXTERNAL TABLE kudu_table (foo INT, bar STRING, baz DOUBLE)
STORED BY 'org.apache.hadoop.hive.kudu.KuduStorageHandler'
TBLPROPERTIES (
"kudu.table_name"="default.kudu_table",
"kudu.master_addresses"="localhost:7051"
);
在上面的语句中,提供了常规的 Hive 列名和类型对,与常规的 create table 语句一样。提供了完整的KuduStorageHandler
类名来通知 Hive Kudu 将支持此 Hive 表。可以提供许多 TBLPROPERTIES 来配置 KuduStorageHandler。最重要的属性是kudu.table_name
,它告诉 hive 应该引用哪个 Kudu 表。另一个公共属性是kudu.master_addresses
,它为此表配置 Kudu 主地址。如果未提供kudu.master_addresses
属性,则将使用hive.kudu.master.addresses.default
配置。
Impala Tables
由于 Impala 在 HiveMetastore 中创建具有相同存储处理程序元数据的表,因此可以从 Hive 访问通过 Impala DDL 创建或更改的表。在HIVE-22021完成并且 Hive 提供完整的 DDL 支持之前,此功能特别有用。有关更多详细信息,请参见Kudu documentation和Impala documentation。
Data Ingest
尽管通常通过Apache NiFi或Apache Spark之类的工具将数据提取到 Kudu 表中,然后通过 Hive 查询数据,但也可以通过配置单元 INSERT 语句将数据插入 Kudu 表中。重要的是要注意,在插入数据时,实际上会使用 Kudu UPSERT 操作来避免主键约束问题。通过HIVE-22024跟踪此方法的灵 Active。此外,不支持 UPDATE 和 DELETE 操作。通过HIVE-22027跟踪该功能的启用。
Examples
INSERT INTO kudu_table SELECT * FROM other_table;
INSERT INTO TABLE kudu_table
VALUES (1, 'test 1', 1.1), (2, 'test 2', 2.2);