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>/。 | 否 |
操作步驟
通過SSH方式連接到集群主節點,詳情請參見登錄集群。
查看待遷移的分區是否符合預期。
使用-e選項僅列舉待遷移的分區,但不會真正執行遷移任務。
jindotable -moveTo -t tdb.test_table -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c " dt > 'v' " -e
遷移分區至OSS-HDFS服務。
jindotable -moveTo -t tdb.test_table -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c " dt > 'v' "
在Hive命令行中檢查數據是否已經在OSS-HDFS。
desc formatted test_table partition (dt='value');
(可選)將分區從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。