Hive支持通过内表或外表的方式访问Iceberg数据。本文通过示例为您介绍如何使用EMR上的Hive处理EMR Iceberg数据。

前提条件

已创建Hadoop集群,详情请参见创建集群
说明 此文档仅适用于EMR-3.38.0及后续版本与EMR-5.4.0及后续版本的Hadoop集群。

使用限制

EMR-3.38.0及后续版本与EMR-5.4.0及后续版本的Hadoop集群,支持Hive读写Iceberg的数据。

操作步骤

  1. 可选:如果您创建的是EMR-3.38.0与EMR-5.4.0版本的集群,则需要修改以下配置项。
    因为EMR-3.38.0与EMR-5.4.0版本的Hive与Iceberg集成存在一定兼容性问题,所以需要修改以下配置。
    1. 进入Hive页面。
      1. 登录阿里云E-MapReduce控制台
      2. 在顶部菜单栏处,根据实际情况选择地域和资源组
      3. 单击上方的集群管理页签。
      4. 集群管理页面,单击相应集群所在行的详情
      5. 在左侧导航栏,单击集群服务 > Hive
    2. 根据您创建集群的版本,修改配置信息。
      • EMR-3.38.0版本:在Hive服务的配置页面,搜索参数hive.metastore.event.listeners,删除参数值。hive_listeners
      • EMR-5.4.0版本:在Hive服务的配置页面,搜索参数metastore.event.listeners,删除参数值。
    3. 保存配置。
      1. 单击右上角的保存
      2. 确认修改对话框中,输入执行原因,单击确定
    4. 重启Hive服务,详情请参见重启服务
  2. 进入Hive命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
  3. 创建表。
    • 如果创建集群时,元数据选择设置为数据湖元数据,则可以按照以下步骤操作。

      使用数据湖元数据作为Hive元数据。该场景下,Hive只支持以外部表的方式访问Iceberg表。

      1. 根据您实际信息替换以下配置,设置Hive接入Iceberg使用数据湖元数据的必要配置。
        SET iceberg.catalog=dlf_catalog;
        SET iceberg.catalog.dlf_catalog.type=custom;
        SET iceberg.catalog.dlf_catalog.io-impl=org.apache.iceberg.hadoop.HadoopFileIO;
        SET iceberg.catalog.dlf_catalog.catalog-impl=org.apache.iceberg.aliyun.dlf.DlfCatalog;
        SET iceberg.catalog.dlf_catalog.access.key.id=<yourAccessKeyId>;
        SET iceberg.catalog.dlf_catalog.access.key.secret=<yourAccessKeySecret>;
        SET iceberg.catalog.dlf_catalog.warehouse=<yourOSSWarehousePath>
        SET iceberg.catalog.dlf_catalog.dlf.catalog-id=<yourCatalogId>;
        SET iceberg.catalog.dlf_catalog.dlf.endpoint=<yourDLFEndpoint>;
        SET iceberg.catalog.dlf_catalog.dlf.region-id=<yourDLFRegionId>;
        说明 示例中dlf_catalog为您创建的Catalog名称,warehouse配置使用阿里云对象存储OSS路径,其余参数含义请参见数据湖元数据配置
      2. 创建Hive外部表,映射已经存在的iceberg_db.sample表。
        CREATE EXTERNAL TABLE iceberg_db.sample_tbl
        STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
        LOCATION 'oss://some_bucket/some_path/sample'
        TBLPROPERTIES (
          'iceberg.catalog'='dlf_catalog',
          'name'='iceberg_db.sample'
        );
        说明 示例中iceberg_db.sample是一张已存在的表,您可以提前创建好,详情请参见基础使用
    • 如果创建集群时,元数据选择设置为集群内置MySQL独立RDS MySQL,则可以按照以下步骤操作。
      • 使用默认Catalog时,执行以下命令,创建表。
        CREATE TABLE iceberg_db.sample_tbl (
          id BIGINT,
          name STRING
        )
        STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
      • 自定义Catalog时,执行以下命令。
        说明 Iceberg支持Hive类型、Hadoop类型或其他限定的自定义Catalog,本文档以Hive类型为例。
        1. 设置Hive接入Iceberg的配置。
          SET iceberg.catalog.hive_catalog.type=hive;
        2. 创建Hive表。
          CREATE TABLE iceberg_db.sample_tbl (
            id bigint,
            name string
          )
          STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
          TBLPROPERTIES ('iceberg.catalog'='hive_catalog');
  4. 执行以下命令,向表中写入数据。
    INSERT INTO iceberg_db.sample_tbl VALUES (4, 'd'), (5, 'e'), (6, 'f');
    说明 如果写数据时,遇到异常提示return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask,应该找不到fb303相关类路径,可以在Hive命令行中手动执行命令add jar /usr/lib/hive-current/lib/libfb303-0.9.3.jar
  5. 执行以下命令,查看表数据。
    SELECT * FROM iceberg_db.sample_tbl;

示例1

本示例使用数据湖元数据,通过Hive外部表的方式对一张已有的Iceberg表进行读写操作。

  1. 创建一个EMR-5.4.0的Hadoop集群,元数据选择数据湖元数据,详情请参见创建集群
  2. 修改配置项,详情请参见操作步骤中的步骤1
  3. 进入Hive命令行,详情请参见操作步骤中的步骤2
  4. 根据您实际信息替换以下配置,设置Hive接入Iceberg使用数据湖元数据的必要配置。
    SET iceberg.catalog=dlf_catalog;
    SET iceberg.catalog.dlf_catalog.type=custom;
    SET iceberg.catalog.dlf_catalog.io-impl=org.apache.iceberg.hadoop.HadoopFileIO;
    SET iceberg.catalog.dlf_catalog.catalog-impl=org.apache.iceberg.aliyun.dlf.DlfCatalog;
    SET iceberg.catalog.dlf_catalog.access.key.id=<yourAccessKeyId>;
    SET iceberg.catalog.dlf_catalog.access.key.secret=<yourAccessKeySecret>;
    SET iceberg.catalog.dlf_catalog.warehouse=<yourOSSWarehousePath>
    SET iceberg.catalog.dlf_catalog.dlf.catalog-id=<yourCatalogId>;
    SET iceberg.catalog.dlf_catalog.dlf.endpoint=<yourDLFEndpoint>;
    SET iceberg.catalog.dlf_catalog.dlf.region-id=<yourDLFRegionId>;
    说明 示例中dlf_catalog为您创建的Catalog名称,warehouse配置使用阿里云对象存储OSS路径,其余参数含义请参见数据湖元数据配置
  5. 执行以下命令,创建数据表iceberg_db.sample_ext,映射已有的iceberg_db.sample表。
    CREATE EXTERNAL TABLE iceberg_db.sample_ext
    STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    LOCATION 'oss://mybucket/iceberg-test/warehouse/iceberg_db.db/sample'
    TBLPROPERTIES (
        'iceberg.catalog'='dlf_catalog',
         'name'='iceberg_db.sample'
       );
  6. 执行以下命令,通过外部表查询Iceberg表数据。
    SELECT * FROM iceberg_db.sample_ext;
    返回信息如下。
    OK
    1 a
    2 b
    3 c
    Time taken: 19.075 seconds, Fetched: 3 row(s)
  7. 执行以下命令,向表中写入数据。
    INSERT INTO iceberg_db.sample_ext VALUES (4, 'd'), (5, 'e'), (6, 'f');
  8. 执行以下命令,查询Iceberg表数据。
    SELECT * FROM iceberg_db.sample_ext;
    返回信息如下。
    OK
    1    a
    2    b
    3    c
    4    d
    5    e
    6    f
    Time taken: 18.908 seconds, Fetched: 6 row(s)

示例2

本示例使用Hive默认元数据,创建一张格式为Iceberg的Hive内表并对其进行读写操作。

  1. 创建一个EMR-5.4.0的Hadoop集群,元数据选择集群内置MySQL,详情请参见创建集群
  2. 修改配置项,详情请参见操作步骤中的步骤1
  3. 进入Hive命令行,详情请参见操作步骤中的步骤2
  4. 执行以下命令,创建数据库iceberg_db。
    CREATE DATABASE IF NOT EXISTS iceberg_db;
  5. 执行以下命令,创建数据表sample_tbl。
    CREATE TABLE iceberg_db.sample_tbl (
      id BIGINT,
      name STRING
    )
    STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
  6. 执行以下命令,向表中写入数据。
    INSERT INTO iceberg_db.sample_tbl VALUES (1, 'a'), (2, 'b'), (3, 'c');
  7. 执行以下命令,查询Iceberg表数据。
    SELECT * FROM iceberg_db.sample_tbl;
    返回信息如下。
    OK
    1    a
    2    b
    3    c
    Time taken: 0.233 seconds, Fetched: 3 row(s)

相关文档