公司是在windows servers 2008上用eclipse進行開發,hadoop集群也是由多台linux服務器組成的真實集群。由於我要開發的程序涉及到hadoop、hbase、solr,理所當然的引入了相關的核心jar包到工程里面,代碼也沒顯示任何異常。但是在運行代碼的時候卻報了各種錯誤,之前在自己電腦虛擬機上開發mapreduce程序是沒有問題的,現將解決方法記錄一下。
異常1:
Exception in thread "main" java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses. at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:119) at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:81) at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:74) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1188) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1184) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1478) at org.apache.hadoop.mapreduce.Job.connect(Job.java:1183) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1212) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1236)
解決辦法:
MR程序初始化的時候需要加載“ClientProtocolProvider.class”,查了下有兩個jar包包含這個的子類“hadoop-mapreduce-client-common-2.0.0-cdh4.2.1.jar”、“hadoop-mapreduce-client-jobclient-2.0.0-cdh4.2.1.jar”,將這兩個jar包引入項目中,問題得以解決。
異常2:
Exception in thread "main" java.io.IOException: Cannot run program "cygpath": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶ at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) at org.apache.hadoop.util.Shell.runCommand(Shell.java:201) at org.apache.hadoop.util.Shell.run(Shell.java:183) at org.apache.hadoop.fs.FileUtil$CygPathCommand.<init>(FileUtil.java:413) at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:439) at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:466) at org.apache.hadoop.fs.RawLocalFileSystem.execCommand(RawLocalFileSystem.java:559) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:551) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:355) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:212)
解決辦法:
盡管連接的hadoop平台是在linux上面,但是我們的eclipse調試環境是在windows server 2008,我們需要安裝一個linux模擬器“cygwin”來支持程序的運行。
在windows server 2008開發服務器上安裝好cygwin,然后在環境變量中添加cygwin的bin目錄,比如“D:\Program\cygwin\bin”,問題得以解決。