跑mapreduce任務只知道在在本地打成jar,提交到hadoop集羣上去跑任務,如果出現錯誤往往很難定位錯誤,所以遠程debug是開發中不可或缺的技能
一 Permission denied(權限問題)
權限問題,idea運行job時,報如下錯誤
Caused by:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException):
Permission denied:
user=guguoyu, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwx------
因爲hadoop集羣上面的用戶用的是hadoop,而這裏提交的時候用的是我本地用戶guguoyu
在main函數最前面增加如下代碼:
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "hadoop");
二 Retrying connect(重試連接)
啓動之後,一直嘗試重新連接,問題代碼如下:
INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032
從上面的保存信息可以看出,連接的ResourceManager的IP地址是0.0.0.0,所以,我們要指定成雲主機外網的IP,我們添加如下配置:
conf.set("yarn.resourcemanager.hostname","hadoop001");
三 RemotException
錯誤信息如下:
java.nio.channels.SocketChannel[connection-pending remote=/192.168.0.3:50010]
org.apache.hadoop.ipc.RemoteException(java.io.IOException):
File /tmp/hadoop-yarn/staging/hadoop/.staging/job_1567499579690_0010/job.jar
There are 1 datanode(s) running and 1 node(s) are excluded in this operation
關鍵要理解,NameNode僅僅提供DataNodes存儲blocks的清單,NameNode不會寫數據到DataNodes,寫數據是客戶端通過DFSOutputStrem把數據寫入到Datanodes
所以上面錯誤信息是,nn提供的dn地址是雲主機的內網地址,添加下面的代碼,就可以讓客戶端與dn連接時,使用外網地址了
conf.set("dfs.client.use.datanode.hostname", "true")