是很常見的Hadoop的服務,以尋找在HDFS罐子,因爲集羣中的所有節點都可以在HDFS訪問文件。如果MapReduce作業被Hadoop服務啓動,在這種情況下,Sqoop依賴於這些jar,這一點非常重要。請記住,即使您正在(可能)從NameNode運行Sqoop命令,Mapper仍在DataNode上運行,而不是NameNode。將這些罐放在HDFS上並不是解決這個問題的唯一可能的解決方案,但它是一個明智的解決方案。
現在我們可以處理實際的錯誤。至少有一個,但可能所有的Mapper都無法找到他們需要的jar。這意味着該jar不存在或試圖訪問它們的用戶沒有所需的權限。首先通過在羣集上以超級用戶權限運行的用戶運行hadoop fs -ls home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
來檢查文件是否存在。如果不存在,請將其與hadoop fs -put {jarLocationOn/NameNode/fileSystem/sqoop-1.4.3-cdh4.4.0.jar} /home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
一起放在那裏。我沒有專門與Cloudera合作過,因此您必須自己追蹤NameNode上的jar位置。如果Cloudera與Hortonworks類似,那麼偶爾會出現這樣的問題:羣集部署腳本/文檔錯過了一些必要的步驟來啓動和運行所有內容。
現在我們知道文件存在了,我們可以檢查用戶SqoopUser是否有權限訪問該文件。再次運行hadoop fs -ls home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
並查看文件權限。同時檢查包含jar的目錄的權限。解釋POSIX文件權限不在本答案的範圍內,所以如果您不熟悉,您可能需要閱讀這些文件。一個重要的注意事項是,HDFS沒有自己的組的概念,它基於底層操作系統的組。只要確保該jar可以被SqoopUser讀取,並且所有父目錄都可以由SqoopUser執行。不加區別的用戶chmod 777
將採取這種方式,即hadoop fs -chmod 777 /home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
。但是,如果您的環境需要授予您的權限,當然要更明確一些。
如果您發現文件權限比您想要的更頻繁地觸發您,核選項將在hdfs-site.xml
中設置dfs.permissions
至false
。這將讓所有用戶訪問HDFS上的所有文件。這對快速開發可能非常有用,但離開dfs.permisssions
更安全。
u能請分享其中U使用的命令? –
見[此答案](http://stackoverflow.com/a/26850804)由[turkgen turkgen](http://stackoverflow.com/users/4186330/turkgen-turkgen)在一個類似的問題。 – VcamX