一.環境
- hadoop搭建在Vmware中,分佈如下:
192.168.16.131 master
192.168.16.132 node1
192.168.16.133 node2
- hadoop版本:hadoop-2.6.0
- Eclipse+hadoop-eclipse-plugin-2.6.0.jar(該包可以在github中下載)
二.搭建
下載Eclipse,解壓到某個文件夾(D:\heclipse),將hadoop-eclipse-plugin-2.6.0.jar放在Eclipse的plugins文件夾下(D:\heclipse\eclipse\plugins),打開Eclipse,出現DFS Locations,表示成功,否則可能是jar包的問題,需要重新下載或製作:
運行hadoop,通過win7訪問http://(master_ip):50070查看能否訪問,以及節點是否都存活。
插曲:如果沒有存活,如下圖顯示2的地方爲0,則可以採取如下措施(只是其中一種方法):
解決方法:將master節點中hadoop/tmp/dfs/name/current/VERSION 中的clusterID改成slaves節點的clusterID(即將clusterID與node1、node2統一)
添加jar包,打開Eclipse,點擊window–>preferences–>Hadoop Map/Reduce,選擇hadoop的位置(這個要與安裝的hadoop版本一樣):
點擊window–>show view將Map/Reduce Locations顯示出來,點擊右上角的出現如下的視圖:
- (1)代表的是hadoop的master節點的IP,(2)是指端口號,需要與hadoop配置文件中的core-site.xml中的配置相同,(3)是指端口號,需要與hadoop配置文件的mapred-site.xml中的配置相同。
點擊finish,點擊DFS Locations,出現如下視圖表示連接正確(不同的環境不同的結果):
至此hadoop的win7開發環境搭建完成
三.運行mapreduce程序
- 新建Map/Reduce Project (WordCount)
- 創建package與class( package:org.apache.hadoop.examples class:WordCount.java)
- 運行如下代碼:
package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
正確運行結果:
打開output裏面的part-r-00000,出現如下結果:
四.遇到的問題
導入jar包後不能顯示DFS Locations
- 可能原因是版本不同的原因,可以自己製作hadoop jar包
- 製作方法:參考http://my.oschina.net/muou/blog/408543?fromerr=ACzJzurH
運行程序出現:
Exception in thread “main”java.lang.NullPointerException atjava.lang.ProcessBuilder.start(Unknown Source)
- 原因:在Hadoop2的bin目錄下沒有winutils.exe
- 解決方法:在github上下載hadoop-common-2.6.0-bin-master.zip,解壓之後將bin目錄全部複製到上面在Eclipse中指定的hadoop目錄的bin文件夾下,並配置環境變量(重新運行即可):
HADOOP_HOME=D:\heclipse\hadoop PATH=;$HADOOP_HOME\bin
運行程序出現:
Exception in thread “main”java.lang.UnsatisfiedLinkError:
org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- 原因:C:\Windows\System32下缺少hadoop.dll
- 解決方法:將上一步中bin文件下的hadoop.dll放到系統的C:\Windows\System32下,重啓電腦即可。
4.經過第三步運行程序還是出現:
Exception in thread “main”java.lang.UnsatisfiedLinkError:
org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- 原因:Windows的唯一方法用於檢查當前進程的請求,在給定的路徑的訪問權限,所以我們先給以能進行訪問,我們自己先修改源代碼,return true 時允許訪問。
- 解決方法:下載hadoop源碼(版本要一致),將hadoop-2.6.0-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 複製到對應的Eclipse的project,然後修改557行爲return true如圖所示(包名最好與hadoop源碼一致):
5.運行程序出現如下warning:
- 解決:將hadoop/etc/hadoop/下的log4j.properties複製到WordCount下即可。
6.運行程序提示沒有找到input或者是output已經存在
- 解決方法:在WordCount下新建一個input文件夾,將運行的文件放進去即可;將原來運行產生的ouput文件夾刪除即可。