Hadoop MapReduce案例word count本地環境執行時遇到的一些問題
阿新 • • 發佈:2019-02-02
問題一
載入不到主類
原因:我一開始建立的是Map/Reduce Project, 它會直接去我本地安裝的hadoop裡面尋找相應的jar包。但是由於我一開始將hadoop放在D:\Program Files資料夾下,應為該路徑中間有個空格,所以沒有找到相應的jar包。
解決方案:將hadoop移出D:\Program Files資料夾,直接放到D盤下,然後重新配置環境變數
問題二
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解決方案:
在main函式中插入程式碼
BasicConfigurator.configure();
這樣可以使列印日誌,不報warn的錯誤,實際並沒有解決log4j的錯誤
問題三
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at com.hdaoop.py.mpWordCount2.WordCount.main(WordCount.java:58)
原因:我的程式碼中有寫,在程式執行的過程中需要獲取初始化引數
沒有給定這個引數的時候,自然會報錯
解決方案:Project右鍵Run As-Run configuration-Arguments
問題四
Description Resource Path Location Type
Archive for required library: 'C:/Users/pangying/.m2/repository/com/google/guava/guava/11.0.2/guava-11.0.2.jar' in project 'mavenWordCount' cannot be read or is not a valid ZIP file mavenWordCount Build path Build Path Problem
原因:這個專案是我用meaven建立的,由於我中間換了IED的版本,所以出現了一些錯誤
解決方案:
首先, 刪除對應資料夾下的jar包(最好直接刪除上一級資料夾)
然後, 右鍵專案-meaven-update project 勾選force update…,然後點選OK即可
問題五
Exception in thread "Thread-18" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:589)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
解決方案:
如果是meaven專案,在pom.xml中新增
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.4</version>
</dependency>
如果是普通的Java project,可以手動新增httpclient-4.3.4.jar
問題六
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs://192.168.217.128:9000/user/root/output/count.txt, expected: file:///
解決方案:
1. 將叢集中hadoop的配置檔案core-site.xml和hdfs-site.xml拷到eclipse專案的src資料夾下,注意要把其中的hostname換成對應的IP地址。
2. 在main方法中加入下面兩行程式碼
conf.addResource(new Path("core-site.xml"));
conf.addResource(new Path("dfs-site.xml"));
問題七
java.io.IOException: No FileSystem for scheme: hdfs
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367)
at FileCopyToHdfs.readFromHdfs(FileCopyToHdfs.java:65)
at FileCopyToHdfs.main(FileCopyToHdfs.java:26)</pre>
解決方案:匯入hadoop-hdfs.jar
問題八
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
這個問題需要修改原始碼。
1. 下載對應版本的hadoop原始碼,加壓。
2. 找到hadoop-XX-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java, 我的是2.8.2版本,要修改的程式碼位置在606行
public static boolean access(String path, AccessRight desiredAccess)
throws IOException {
return true;
// return access0(path, desiredAccess.accessRight());
}
即註釋掉原來的程式碼,改為return true
3. 在eclipse的專案中建立相應路徑的package,將NativeIO.java拷到該包中