使用Hive查詢JindoFS上的資料

更新時間:
Copy as MD

Apache HiveHadoop生態中廣泛使用的SQL引擎之一,讓使用者可以使用SQL實現分布式的查詢,Hive中資料主要以undefinedDatabase、TablePartition的形式進行管理,通過指定位置(Location)對應到後端的資料。

JindoFS配置

以EMR-3.35版本為例,建立名為emr-jfs的命名空間,相關配置參數樣本如下:
  • jfs.namespaces=emr-jfs
  • jfs.namespaces.emr-jfs.oss.uri=oss://oss-bucket/oss-dir
  • jfs.namespaces.emr-jfs.mode=block

Warehouse、Database、TablePartitionLocation

  • WarehouseLocation

    Hivehive-site中有hive.metastore.warehouse.dir,表示Hive數倉存放資料的預設路徑,例如配置成:jfs://emr-jfs/user/hive/warehouse

  • DatabaseLocation

    HiveDatabase會有一個Location屬性,databaseLocation作為下屬Table的預設路徑。預設情況下,建立Database不是必須指定Location,預設會使用hive-sitehive.metastore.warehouse.dir的值加上database的名字作為路徑。通過下面的命令可以指定DatabaseLocationJindoFS:

    • 建立Database時指定LocationJindoFS。
      CREATE DATABASE database_name
      LOCATION
      'jfs://namespace/database_dir';

      例如,建立名為database_on_jindofs,locationjfs://emr-jfs/warehouse/database_on_jindofsHive資料庫。

      CREATE DATABASE database_on_jindofs
      LOCATION
      'jfs://emr-jfs/hive/warehouse/database_on_jindofs';
    • 修改DatabaseLocationJindoFS。
      1. 通過SHOW CREATE語句查看DatabaseLocation。
        SHOW CREATE DATABASE database_name;
        通常情況下,預設為warehouse目錄。
        LOCATION
        'hdfs://emr-jfs/user/hive/warehouse/database_name.db'
      2. 通過修改Location,可以把預設路徑指定到JindoFS上。此操作不會影響存量表,當建立表沒有指定預設Location時,才會使用此目錄。
        ALTER DATABASE database_name SET LOCATION jfs_path;
  • Table/PartitionLocation

    Table/PartitionLocationDatabase類似,對於非Partition表,資料直接存放在Table Location下,Partition表的資料存放在Partition目錄下,相關操作如下:

    • 建立Table時指定LocationJindoFS。
      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-sitehive.exec.scratchdir把地址指向到JindoFS,也可以通過命令列傳參。

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

或者

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