準備工作
- 搭建完成的Hadoop分佈式集羣或者僞分佈式。
- eclipse.zip包
- hadop-2.5.0.tzr.gz包
- hadoop-eclipse-plugin-2.5.0.jar插件
- 備用文件:
hadoop.dll
winutils.exe
文件目錄
如圖所示:
1. eclipse-java-neon-x86_64.zip解壓及安裝eclipse。
2. hadoop-2.5.0.tar.gz解壓及安裝hadoop在windows上。
注:此處的hadoop包需要和linux服務器上的hadoop包版本相同,否則可能會出現一些莫名奇妙的錯誤。
3. 另外三個文件是搭建過程中需要的插件和其他文件。
開始搭建
- 首先完成Windows下hadoop環境變量的配置。
如圖:首先添加HADOOP_HOME,路徑爲Windowx下hadoop的解壓路徑;然後修改path變量,添加記錄。 - 將hadoop-eclipse-plugin-2.5.0.jar插件複製到eclipse/plugins目錄。如圖:
- 開啓eclipse:Windows->Preferences->Hadoop Map/Reduce添加Windows下hadoop的解壓路徑。如圖:
- Windows->Show View->Other->Map/Reduce Locations。如圖:
- 設置完成之後將看到如下頁面。
注:looc爲我的一個項目,存在DFS Locations則說明以上步驟無誤(存在Error是因爲還未配置DFS Locarions)。 - 點擊黑色矩形圈出的指定按鈕進行DFS Locations的配置。如圖:
- 右鍵點擊DFS Locations刷新查看是否鏈接成功(此時hadoop分佈式集羣或者僞分佈式需要處於開啓狀態)。如圖:
注:此處爲連接成功之後所做的WordCount實例測試。創建input文件夾並上傳三個.txt文檔,運行WordCount.java得output文件夾中的內容,其中part-r-00000中爲WordCount的結果。
另:第一次運行MapReduce程序需要先配置HDFS路徑,右鍵代碼編輯區空白處,選擇Run As->Run Configurations。如圖:
點擊Run即可開始運行,之後便可以選擇Run As->Run on Hadoop運行MapReduce程序。
附:
package com.looc.wordcount;
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;
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();
Job job = Job.getInstance(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(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
問題解決
如何存在一些問題可進行如下操作:
1. 將準備工作第五點中的兩個文件複製到hadoop/bin目錄下。如圖:
2. 修改hadoop分佈式集羣或者僞分佈式中core-site.xml文件。如圖:
3. 修改hadoop分佈式集羣或者僞分佈式中hdfs-site.xml文件,添加如下記錄。如圖:
4. 防火牆也可能成爲連接不成功的原因之一。