使用JindoTable将Hive表和分区数据迁移到OSS-HDFS

HDFS受限于集群规模和成本因素,无法无限扩展,容量存在瓶颈。阿里云提供了OSS以及兼容HDFS接口的OSS-HDFS,来无缝拓展云上Hadoop生态系统的存储能力。JindoTable工具可以将Hive数据根据分区键规则筛选,在HDFS和OSS-HDFS之间转移分区。本文介绍如何使用JindoTable将Hive表和分区数据迁移到OSS-HDFS。

前提条件

  • 已创建EMR-3.42.0及以上版本或EMR-5.8.0及以上版本的集群,详情请参见创建集群

  • 已通过Hive命令创建分区表,且表中已写入数据。

    本文以创建名为test_table的表,分区名称为dt,分区值为value为例。

  • 已开通并授权访问OSS-HDFS服务,详情请参见开通并授权访问OSS-HDFS服务

注意事项

在Hadoop配置文件core-site.xml 或hdfs-site.xml(任选一个即可,在$HADOOP_CONF_DIR目录下)新增配置项jindotable.moveto.tablelock.base.dir。

该配置的值应指向一个HDFS目录,目的是存放MoveTo工具在运行时自动创建的锁文件。需确保该目录只会被MoveTo工具访问,并且有访问权限。如果不配置,则使用缺省值hdfs:///tmp/jindotable-lock/,无权限则报错。

JindoTable使用说明

获取帮助信息

执行以下命令,获取帮助信息。

jindotable -help moveTo

参数说明

jindotable -moveTo -t <dbName.tableName> -d <destination path> [-c "<condition>" | -fullTable] [-b/-before <before days>] [-p/-parallel <parallelism>] [-s/-storagePolicy <OSS storage policy>] [-o/-overWrite] [-r/-removeSource] [-skipTrash] [-e/-explain] [-q/-queue <yarn queue>] [-w/-workingDir <working directory>][-l/-logDir <log directory>]

参数

描述

是否必选

-t <dbName.tableName>

待移动的表。

-d <destination path>

目标路径。为表级别的路径,分区路径会在这个路径下自动创建。

-c "<condition>" | -fullTable

分区过滤条件表达式。支持基本运算符,不支持UDF。

-b/-before <before days>

根据分区创建时间,创建时间超过给定天数的分区才进行移动。

-p/-parallel <parallelism>

整个MoveTo任务的最大task并发度,默认为1。

-s/-storagePolicy <OSS storage policy>

拷贝至OSS时数据文件的存储策略。支持Standard(默认)、IA、Archive、ColdArchive。

-o/-overWrite

是否覆盖最终目录。分区级别覆盖,不会覆盖本次移动不涉及的分区。

-r/-removeSource

是否在移动完成后删除源路径。

-skipTrash

如果删除源路径,是否跳过Trash。

-e/-explain

如果指定explain模式,不会触发实际操作,仅打印会同步的分区。

-q/-queue <yarn queue>

指定分布式拷贝的YARN列。

-w/-workingDir

指定分布式拷贝的工作临时目录。

-l/-logDir <log directory>

Log文件目录,默认为/tmp/<current user>/。

操作步骤

  1. 通过SSH方式连接到集群主节点,详情请参见登录集群

  2. 查看待迁移的分区是否符合预期。

    使用-e选项仅列举待迁移的分区,但不会真正执行迁移任务。

    jindotable -moveTo -t tdb.test_table -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c " dt > 'v' " -e
  3. 迁移分区至OSS-HDFS服务。

    jindotable -moveTo -t tdb.test_table -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c " dt > 'v' "
  4. 在Hive命令行中检查数据是否已经在OSS-HDFS。

    desc formatted test_table partition (dt='value');
  5. (可选)将分区从OSS-HDFS迁移至HDFS。

    jindotable -moveTo -t tdb.test_table -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table  -c " dt > 'v' "

    返回结果提示No successfully moved partition,原因是HDFS目标目录非空。如果确认目标目录可以丢弃,您可以使用-overWrite选项强制覆盖目标目录,确保将分区从OSS-HDFS迁移至HDFS。

    jindotable -moveTo -t tdb.test_table -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table  -c " dt > 'v' " -overWrite

异常处理

为最大程度地保障数据安全和防止污染,JindoTable命令在执行前会自动检查目标目录,确保无其他并发命令向同一目录进行数据拷贝。 若检测到冲突,则该表或分区的拷贝任务将被阻止并报错。 此时,需要主动干预,首先确认并停止所有可能正在进行的冲突拷贝任务,然后清理目标目录,以便重新发起拷贝命令。对于非分区表的拷贝或迁移,目标目录即为表级别目录;对于分区表,目标目录为待拷贝或移动分区的分区级目录,只需对待拷贝的分区进行清理。

如果迁移表或分区时遭遇异常中止,则可能需要主动干预的情况。此时拷贝还未完成,源数据与表的元信息均未改变, 数据仍处于安全状态。常见的异常中止有两种情况:

  • 用户在命令尚未结束时,主动终止了命令进程。

  • 由于内存溢出等异常,进程异常中止。

相关文档

如果是非EMR环境,需先安装部署JindoSDK,详情请参见在非EMR集群中部署JindoSDK