理解Iceberg核心概念可以阅读博主下面这篇技术博客:
拷贝Iceberg的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
<property>
<name>iceberg.engine.hive.enable</name>
<value>true</value>
<property>
<property>
<name>hive.aux.jars.path</name>
<value>/opt/module/hive/auxlib</value>
</property>
Hive的元数据服务是一种存储和管理Hive表格和数据定义的中央服务,它允许用户定义表格、分区和桶等元数据信息,并将其存储在Hive元数据存储库中。Hive元数据服务还提供了一个API,允许用户检索、查询和修改这些元数据信息。Hive元数据服务是Hive的重要组成部分,使用户能够轻松地管理和使用大规模数据集。它还提供了丰富的元数据信息,可以帮助用户优化查询性能,如使用分区和桶来对数据进行分组和排序等。
hive --service metastore
更详细的步骤如下所示:
在启动Hive之前,需要先启动Hadoop的NameNode和DataNode服务。然后,可以通过以下步骤启动Hive元数据服务:
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=truevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.cj.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hivevalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hive123value>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
property>
hive --service hiveserver2
hive --service metastore
启动完成后,可以使用Beeline或其他Hive客户端工具连接到HiveServer2服务,并使用Hive元数据服务来管理和查询Hive表格和数据。
方式一:直接进入Hive数据库
hive
方式二:
使用Beeline连接到HiveServer2服务,可以使用以下命令:
beeline -u jdbc:hive2://:/dbname -n -p
其中,是HiveServer2服务所在的主机名,是HiveServer2服务监听的端口号,是连接的Hive数据库名,是连接的用户名,是连接的密码。
例如,连接到HiveServer2服务所在的主机名为localhost,端口号为10000,数据库名为default,用户名为hive,密码为hive123的Hive数据库,可以使用以下命令:
beeline -u jdbc:hive2://localhost:10000/default -n hive -p hive123
根据不同配置,分为三种情况:
配置项 | 说明 |
---|---|
iceberg.catalog. |
Catalog的类型:hive,hadoop,如果使用自定义Catalog,则不设置 |
iceberg.catalog. |
Catalog的实现类,如果上面的type没有设置,则此参数必须设置 |
iceberg.catalog. |
Catalog的其他配置项 |
创建表
CREATE TABLE iceberg_test (i int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
插入数据
INSERT INTO iceberg_test values(1);
查看HDFS可以发现,表目录在默认的hive仓库路径下
查看表
describe iceberg_test1;
查看表的详细信息:
describe formatted iceberg_test1;
创建的表会在hive默认的路径下
<!-- Hive默认在HDFS的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
插入数据
insert into iceberg_test1 values(1);
set iceberg.catalog.iceberg_hive.type=hive;
set iceberg.catalog.iceberg_hive.url=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_test1;
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);
如果HDFS中已经存在iceberg格式表,可以通过在Hive中创建iceberg格式表指定对应的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');
查询数据
select * from iceberg_test4;
补充Hive内部表和外部表的区别:
在Hive中,内部表和外部表是两种不同的表格类型。
因此,内部表和外部表的主要区别在于数据和元数据的存储位置和管理方式。内部表由Hive管理数据和元数据,而外部表只由Hive管理元数据,实际的存储数据由外部数据源维护。