HDFS受限于集群规模和成本因素,无法无限扩展,容量存在瓶颈。阿里云提供OSS/OSS-HDFS作为HDFS的替代或补充,扩展云上Hadoop平台的存储能力。JindoTable工具可以将Hive数据根据分区键规则筛选,在HDFS和OSS/OSS-HDFS之间转移分区。本文介绍如何使用JindoTable将Hive表和分区数据迁移到OSS/OSS-HDFS。
前提条件
- 已部署JindoSDK。
- EMR环境,默认已安装JindoSDK,可以直接使用。
说明 访问OSS-HDFS,需创建EMR-3.42.0及以上版本或EMR-5.8.0及以上版本的集群。
- 非EMR环境,需先安装部署JindoSDK,部署详情请参见在非EMR集群中部署JindoSDK。
说明 访问OSS-HDFS,需部署JindoSDK 4.x及以上版本。
- EMR环境,默认已安装JindoSDK,可以直接使用。
- 已部署Hadoop与Hive环境。
- 确保hadoop classpath能够返回合理结果。
- 确保客户端环境变量$HIVE_HOME 与 $HIVE_CONF_DIR正确配置。
配置MoveTo工具在HDFS下的锁目录
在Hadoop配置文件core-site.xml 或hdfs-site.xml(任选一个即可,在$HADOOP_CONF_DIR目录下)新增配置项jindotable.moveto.tablelock.base.dir。
该配置的值应指向一个HDFS目录,目的是存放MoveTo工具在运行时自动创建的锁文件。需确保该目录只会被MoveTo工具访问,并且有访问权限。如果不配置,则使用缺省值hdfs:///tmp/jindotable-lock/,无权限则报错。
使用说明
获取帮助信息
执行以下命令,获取帮助信息。
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> | 本地日志目录,默认为/tmp/<current user>/。 | 否 |
使用示例
- 已有一个HDFS上的Hive分区表,示例如下。
- 想要把bbb和ccc分区移动到OSS。
- 先用explain模式查看移动的分区是否符合预期,参数为
-e
或-explain
。 - 去掉参数
-e
,正式移动分区。
- 先用explain模式查看移动的分区是否符合预期,参数为
- 执行完成后,检查数据是否已经在OSS。
- 再移回HDFS,结果失败,会显示失败原因。
失败原因是目标目录非空,提示可以使用
-overWrite
清空目标目录。 - 使用
-overWrite
强制覆盖。
异常状态处理
为了尽可能保证数据安全,防止污染,该命令会自动检查目标目录,确保不存在另一命令向相同目录拷贝。 如果无法排除,则该表或分区的拷贝命令将执行失败。 此时,需要主动干预,确保没有另一命令正在执行拷贝之后,清理目标目录,则可以重新执行该命令。
对于非分区表的拷贝或迁移,目标目录即为表级别目录;对于分区表,目标目录为待拷贝或移动分区的分区级目录,只需对待拷贝的分区进行清理。
出现原因
如果该命令被异常中止,则可能出现需要主动干预的情况。此时拷贝还未完成,源数据与表的元信息均未改变, 数据仍处于安全状态。常见的异常中止有两种情况:
- 用户在命令尚未结束时,主动杀掉命令进程。
- 由于内存溢出等异常,进程异常中止。