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命令查看文件中是否包含特殊字元


