1. 程式人生 > >Hadoop MapReduce案例word count本地環境執行時遇到的一些問題

Hadoop MapReduce案例word count本地環境執行時遇到的一些問題

問題一

載入不到主類

原因:我一開始建立的是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拷到該包中


END