0521-Hadoop命令無法訪問HDFS路徑詭異問題解決

  • 2019 年 11 月 27 日
  • 筆記

1

詭異現象

Fayson今天在集群中瀏覽HDFS數據目錄時發現,通過Cloudera Manager的「文件瀏覽」功能可以正常的瀏覽某一個HDFS數據目錄,如下顯示:

但Fayson在腳本或命令行操作該數據目錄時又提示「/tmp/guiyi/123: No such file or directory」,異常如下:

2

問題分析

在Cloudera Manager上可以正常的瀏覽該數據目錄,但在命令行無法正常訪問提示文件不存在,經過一系列操作(如:重啟Cloudera Manager、重啟HDFS服務均無法解決該問題),繼續分析….

猜測可能是由於HDFS數據目錄包含特殊字元導致,Fayson使用如下命令查看HDFS路徑是否攜帶特殊字元:

[root@cdh05 ~]# hadoop fs -ls /tmp/guiyi | cat -A

通過如上命令可以看到在/tmp/guyiyi/123路徑後看到存在特殊字元「^[」,由此可以推斷是HDFS路徑包含了特殊字元導致的問題。

3

問題解決

在上面我們定位到HDFS路徑中包含特殊字元導致命令行無法正常訪問HDFS路徑(這裡只是hadoop命令的影響,也有可能會影響Hive無法正常的獲取表的數據),那接下來可以通過如下步驟解決該問題:

1.使用hadoop命令將/tmp/guiyi目錄下的所有數據目錄列出到一個shell腳本

[root@cdh05 ~]# hadoop fs -ls /tmp/guiyi > test.sh  [root@cdh05 ~]# cat -A test.sh 

2.在上一步test.sh腳本的基礎上較該腳本修改為如下:

[root@cdh05 ~]# vim test.sh  hadoop fs -mv /tmp/guiyi/123^[ /tmp/guiyi/123

注意:這裡為什麼是在test.sh的基礎上修改,是因為「^[」字元在Linux通過拷貝的方式則認為普通字元,不是不可見的特殊字元。

3.執行上述修改後的腳本將/tmp/guiyi/123^[ 目錄修改為/tmp/guiyi/123

[root@cdh05 ~]# sh test.sh  [root@cdh05 ~]# hadoop fs -ls /tmp/guiyi  [root@cdh05 ~]# hadoop fs -ls /tmp/guiyi | cat -A  [root@cdh05 ~]# hadoop fs -ls /tmp/guiyi/123

可以看到此時/tmp/guiyi/123的HDFS路徑已可以正常訪問。

4

總結

1.在使用腳本創建HDFS目錄或文件時一定要注意特殊字元問題(特別是在window上編寫好的腳本拷貝至Linux伺服器時,需要檢查文件中是否包含特殊字元)

2.在Linux中使用vim進入編輯狀態後使用ctrl+c、ctrl+v會產生上述問題中的特殊字元,因此在編輯時需要注意。

3.可以通過cat -A命令查看文件中是否包含特殊字元