Apache Hive是Hadoop生态中广泛使用的SQL引擎之一,让用户可以使用SQL实现分布式的查询,Hive中数据主要以undefinedDatabase、Table和Partition的形式进行管理,通过指定位置(Location)对应到后端的数据。

JindoFS配置

已创建名为emr-jfs的命名空间,示例如下:

  • jfs.namespaces=emr-jfs
  • jfs.namespaces.emr-jfs.uri=oss://oss-bucket/oss-dir
  • jfs.namespaces.emr-jfs.mode=block

Warehouse/Database/Table/Partition的Location

  • Warehouse的Location

    Hive的hive-site中有hive.metastore.warehouse.dir,表示Hive数仓存放数据的默认路径,例如配置成:jfs://emr-jfs/user/hive/warehouse

  • Database的Location

    Hive的Database会有一个Location属性,database的Location作为下属Table的默认路径。默认情况下,创建Database不是必须指定Location,默认会使用hive-site中hive.metastore.warehouse.dir的值加上database的名字作为路径。通过下面的命令可以指定Database的Location到JindoFS:

    • 创建Database时指定Location到JindoFS:
      CREATE DATABASE database_name
      LOCATION
      'jfs://namespace/database_dir';

      例如,创建名为database_on_jindofs,location为jfs://emr-jfs/warehouse/database_on_jindofs的Hive数据库:

      CREATE DATABASE database_on_jindofs
      LOCATION
      'jfs://emr-jfs/hive/warehouse/database_on_jindofs';
    • 修改Database的Location到JindoFS:
      1. 通过SHOW CREATE语句查看Database的Location:
        SHOW CREATE DATABASE database_name;
      2. 一般情况下,默认为warehouse目录,查询结果如下
        CREATE DATABASE `database_name`
        LOCATION
        'hdfs://emr-jfs/user/hive/warehouse/database_name.db'
      3. 通过修改Location,可以把默认路径指定到JindoFS上。此操作不会影响存量表,当新建表没有指定默认Location时,才会使用此目录。
        ALTER DATABASE database_name SET LOCATION jfs_path;

        例如,查看表 jfs_table_name下的某个Partition:

  • Table/Partition的Location

    Table/Partition的Location与Database类似,对于非Partition表,数据直接存放在Table Location下,Partition表的数据存放在Partition目录下,相关操作如下:

    • 创建Table时指定Location到JindoFS:
      CREATE [EXTERNAL] TABLE table_name
        [(col_name data_type,...)]
      LOCATION 'jfs://emr-jfs/database_dir/table_dir';
    • 修改Table/Partition指定Location到 JindoFS:
      1. 通过DESCRIBE语句查看Table/Partition的 location:
        DESCRIBE FORMATTED [PARTITION partition_spec] table_name;
      2. 通过修改Location,可以把默认路径指定到JindoFS上。
        ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "jfs_path";

        例如,查看表 jfs_table_name下的某个Partition:

        DESCRIBE FORMATTED jfs_table_name PARTITION (partition_key1=123,partition_key2='xxxx');

Hive scratch目录

Hive会把一些临时输出文件和作业计划存储在scratch目录,可以通过设置hive-site的hive.exec.scratchdir把地址指向到JindoFS,也可以通过命令行传参:

bin/hive --hiveconf hive.exec.scratchdir=jfs://emr-jfs/scratch_dir

或者

set hive.exec.scratchdir=jfs://emr-jfs/scratch_dir;