1. 程式人生 > 實用技巧 >hive的load報錯Error: EXECUTION FAILED: Task MOVE error HiveException: [Error 20531] Unable to move source hdfs:

hive的load報錯Error: EXECUTION FAILED: Task MOVE error HiveException: [Error 20531] Unable to move source hdfs:

hive在進行資料load的時候報錯。

Error: EXECUTION FAILED: Task MOVE error HiveException: [Error 20531] Unable to move source hdfs://nameservice1/tmp/logs to destination hdfs://nameservice1/inceptor1/user/hive/warehouse/test_0715.db/hive/test_partiton_date/ds=2020-07-18/logs (state=08S01,code=20531)

--插入語句

load data inpath '/tmp/logs'
into table test_0715.test_partiton_date partition(ds='2020-07-19');

Unable to move source hdfs,不能移動,自然就想到了沒有許可權的問題,果然,一檢視發現/tmp/logs這個檔案是hdfs的owner,所以hive使用者是沒有許可權移動的。

現在我們需要做的就是,讓logs是hive使用者擁有。如下所示,切換訪問hdfs的使用者,把logs上傳到了hive許可權的目錄下。

#linux切換訪問hdfs使用者為hive
export HADOOP_USER_NAME=hive

注意:1、其實不一定要logs的owner是hive,logs的父目錄的owner是hive也可以。 2、load完了之後,hdfs的logs檔案就會被移動到分割槽目錄下。如上圖所示,上傳上去的檔案被load後就沒有了。 可以看出,load命令其實就是mv檔案而已,但是為什麼還會選擇load呢,原因很簡單,其實在load的時候,不需要你手動建立分割槽,load命令直接幫你建立了。
--如果使用load,這一步是不需要的,使用hdfs的mv或者local的put到分割槽目錄,需要新建分割槽。
alter
table test_partiton_date ADD PARTITION (ds='2020-07-19');