背景:
存在某種情況,HIVE數據可能要從一個HDFS中,傳到另一個hdfs中。可以說是遷移,也可能是數據同步。
步驟:
假設有一張user表如下:
CREATE TABLE `jc_db.t_user` (
`id` bigint COMMENT '主鍵',
`username` string COMMENT '賬號',
`password` string COMMENT '密碼',
`create_time` string COMMENT '創建時間'
)
PARTITIONED BY (
`c_date` string)
STORED AS ORC;
c_date字段是年月日yyyyMMdd,也就是按天分區。
1.在舊的HDFS的集羣中的hive裏執行命令,將hive數據導出到一個HDFS目錄下
export table jc_db.t_user to '/tmp/hive-export/jc_db_t_user';
以上默認是將jc_db.t_user所有數據都會導出到HDFS目錄/tmp/hive-export/jc_db_t_user。
2.用DistCp將剛剛的HDFS目錄/tmp/hive-export/jc_db_t_user 複製進新的HDFS,在新的HDFS集羣執行以下命令:
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -D dfs.checksum.type=CRC32 hdfs://舊的namenode ip:9000/tmp/hive-export/jc_db_t_user /tmp/hive-export/jc_db_t_user
3.在新的HDFS恢復數據到hive中
import table jc_db.t_user from '/tmp/hive-export/jc_db.t_user';
如使用分區表:
1.在舊的HDFS的集羣中的hive裏執行命令,將hive數據導出到一個HDFS目錄下,但是要c_date分區:
export table jc_db.t_user partition(l_date=20180826) to '/tmp/hive-export/jc_db_t_user_20180826';
2.用DistCp將剛剛的HDFS目錄/tmp/hive-export/jc_db_t_user_20180826 複製進新的HDFS,在新的HDFS集羣執行以下命令:
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -D dfs.checksum.type=CRC32 hdfs://舊的namenode ip:9000/tmp/hive-export/jc_db_t_user_20180826 /tmp/hive-export/jc_db_t_user_20180826
3.在新的HDFS恢復分區數據到hive中,並不會影響歷史數據。
import table jc_db.t_user from '/tmp/hive-export/jc_db_t_user_20180826';
報錯:
Failed with exception Cannot get DistCp constructor: org.apache.hadoop.tools.DistCp.<init>()
下載DistCp依賴放入hive的lib目錄:
wget http://central.maven.org/maven2/org/apache/hadoop/hadoop-distcp/2.6.5/hadoop-distcp-2.6.5.jar