Hive使用JindoSDK处理OSS-HDFS服务中的数据

使用Hive搭建离线数仓时,随着数据量的不断增长,传统的基于HDFS存储的数仓可能无法以较低成本满足用户的需求。在这种情况下,您可以使用OSS-HDFS服务作为Hive数仓的底层存储,并通过JindoSDK获得更好的读写性能。

前提条件

操作步骤

  1. 连接ECS实例。具体操作,请参见连接ECS实例

  2. 配置JindoSDK。

    1. 下载最新版本的JindoSDK JAR包。下载地址,请参见GitHub

    2. 解压JindoSDK JAR包。

      以下以解压jindosdk-x.x.x-linux.tar.gz为例,如使用其他版本的JindoSDK,请替换为对应的JAR包名称。

      tar zxvf jindosdk-x.x.x-linux.tar.gz
      说明

      x.x.x表示JindoSDK JAR包版本号。

    3. 可选:如果您的环境中未包含Kerberos和SASL相关依赖,则需要在部署JindoSDK的所有节点安装以下依赖。

      • Ubuntu或Debian

        sudo apt-get install libkrb5-dev krb5-admin-server krb5-kdc krb5-user libsasl2-dev libsasl2-modules libsasl2-modules-gssapi-mit
      • Red Hat Enterprise Linux或CentOS

        sudo yum install krb5-server krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-plain
      • macOS

        brew install krb5
    4. 将已下载的JindoSDK JAR包拷贝至Hive的classpath路径下。

      cp jindosdk-x.x.x-linux/lib/*.jar  $HIVE_HOME/lib/
  3. 配置OSS-HDFS服务实现类及AccessKey。

    1. 将OSS-HDFS服务实现类配置到Hive的core-site.xml文件中。

      <configuration>
          <property>
              <name>fs.AbstractFileSystem.oss.impl</name>
              <value>com.aliyun.jindodata.oss.JindoOSS</value>
          </property>
      
          <property>
              <name>fs.oss.impl</name>
              <value>com.aliyun.jindodata.oss.JindoOssFileSystem</value>
          </property>
      </configuration>
    2. 将已开启OSS-HDFS服务的Bucket对应的AccessKey ID、AccessKey Secret预先配置在Hive的core-site.xml文件中。

      <configuration>
          <property>
              <name>fs.oss.accessKeyId</name>
              <value>LTAI******** </value>
          </property>
      
          <property>
              <name>fs.oss.accessKeySecret</name>
              <value>KZo1********</value>
          </property>
      </configuration>
  4. 配置OSS-HDFS服务Endpoint。

    使用OSS-HDFS服务访问OSS Bucket时需要配置Endpoint。推荐访问路径格式为oss://<Bucket>.<Endpoint>/<Object>,例如oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/exampleobject.txt。配置完成后,JindoSDK会根据访问路径中的Endpoint访问对应的OSS-HDFS服务接口。

    您还可以通过其他方式配置OSS-HDFS服务Endpoint,且不同方式配置的Endpoint存在生效优先级。更多信息,请参见附录一:配置Endpoint的其他方式

    重要

    完成以上配置后,您需要重启Hive服务,使配置生效。

  5. 在终端使用以下命令连接Hive。

    更多连接方式,请参见Hive连接方式

    hive
  6. 通过OSS-HDFS服务存储数据。

    创建数据库和表时,您可以通过以下两种方式指定OSS-HDFS服务路径,将数据库或表的数据保存到OSS-HDFS服务中。

    • 方式一:在命令示例中指定OSS-HDFS服务路径

      • 创建数据库时指定OSS-HDFS服务路径

        CREATE DATABASE db_on_oss1 LOCATION 'oss://bucket_name.endpoint_name/path/to/db1';
      • 创建表时指定OSS-HDFS服务路径

        CREATE TABLE db2.table_on_oss (
            id INT,
            name STRING,
            age INT
        ) LOCATION 'oss://bucket_name.endpoint_name/path/to/db2/tablepath';
    • 方式二:在配置文件中指定OSS-HDFS服务路径

      您可以在Hive Metastore的hive-site.xml配置文件中设置hive.metastore.warehouse.dir到OSS-HDFS服务路径,然后重启Hive Metastore,后续创建的数据库和数据库下的表均默认存储于OSS-HDFS服务路径中。

      配置示例如下:

      <configuration>
      
          <property>
              <name>hive.metastore.warehouse.dir</name>
              <value>oss://bucket_name.endpoint_name/path/to/warehouse</value>
          </property>
      
      </configuration>
  7. 为已有表添加分区。

    您可以为已创建的表添加分区,从而将其分成较小的存储单元。根据查询条件,只扫描满足条件的分区而避免全表扫描,从而显著提升查询性能。

    • 命令格式

      ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...] LOCATION 'location';

      参数说明如下:

      参数

      是否可选

      说明

      table_name

      必选

      待添加分区的表名称。

      IF NOT EXISTS

      可选

      未指定IF NOT EXISTS时,如果同名的分区已存在,会执行失败并返回报错。

      pt_spec

      必选

      新增的分区,格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中,partition_col表示分区字段,partition_col_value表示分区值。分区字段不区分大小写,分区值区分大小写。

      location

      必选

      指定存储分区的OSS路径。

    • 使用示例

      以下示例用于为表sale_detail添加一个分区,用于存储2021年12月华东1(杭州)地域的销售记录,并将分区存储于指定的OSS路径。

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202112', region='hangzhou') LOCATION 'oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/path/2021/';