需要提前準備的系統環境及軟件有:Eclipse,Hadoop集成包,Java。(推薦從官網下載壓縮包進行解壓,Linux系統自動安裝的功能要考慮國內網絡情況)
本文使用的版本: Linux--Ubuntu 17.04
Hadoop--2.8.0
Java--Java8_u131
Eclipse--版本代號Oxygen
步驟:一.安裝Java環境
1.1.將java壓縮包解壓到usr下
tar -xzvf jdk-8u131-linux-x64.tar.gz /usr/
1.2.修改/etc/profile文件,加入(注意目錄名稱,不同的Java版本的目錄名稱有一定差別)
export JAVA_HOME=/usr/jdk1.8.0_131
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
1.3.在/etc/rc.local中加入以下語句,以便每次開機默認配置Java路徑
source /etc/profile
注:該語句只能讓登錄的用戶獲取Java路徑,如果需要使用root用戶來進行開發,需要使用sudo語句。
二.Eclipse安裝
將Eclipse的安裝包解壓到用戶目錄下(如果是root用戶,推薦放入opt以供所有用戶使用)
tar -xzvf eclipse-oxygen.tar.gz /home/xxx/
三.Hadoop安裝及配置
3.1. 將hadoop解壓到對應文件夾(本文默認解壓到桌面,即/home/xxx/Desktop/)
3.2 下載適用於Eclipse的Hadoop MapReduce插件(原貼自wanghc處fork,感謝lartin對新版本的編譯與分享https://github.com/larntin/hadoop2x-eclipse-plugin/tree/v2.8.0/release)
3.3 將該插件放入Eclipse下的plugin目錄中
3.4 如果插件運行成功,就可以在Window-->Preferences中找到Hadoop Map/Reduce選項,配置好其路徑,指向Haddop的主目錄即可(如當前版本中只需要指向至hadoop-2.8.0目錄下)
3.5配置Hadoop集羣
在狀態欄中新增一個窗口Map/Reduce Locations,點擊該窗口下的New Hadoop Location(大象圖標),主要配置這幾項:Location name:名稱,自行定義
Master:設置主機的IP及端口號,根據自身實際情況配置。如果是單機運行,則使用localhost即可。
Dfs:設置主機HDFS的IP及端口號,勾選Use M/R Master Host則跟隨主機的IP地址。
3.6 成功創建後,在New Project中新建一個Map/Reduce Project,命名爲WordCount
3.7 編寫WordCount程序(該程序參考自《MapReduce設計模式》一書)
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();
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
String txt = value.toString().toLowerCase();
if (txt==null) {
return;
}
txt = txt.replaceAll("'","").replaceAll("[^a-zA-Z0-9]", " ");
StringTokenizer itr = new StringTokenizer(txt);
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();
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
for(IntWritable val:values) {
sum+=val.get();
}
result.set(sum);
context.write(key, result);
}
}
@SuppressWarnings("deprecation")
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);
}
}
3.8 配置運行參數
點擊Run-->Run Configuration選項,將運行方式改爲Java Application,配置Project Name和Main Class爲WordCount,在第二欄Arguments中添加兩項。
第一項爲input路徑,第二項爲output的路徑。
注:output路徑必須不存在,由MapReduce作業創建,所以往後再次運行該作業的時候需要先刪除整個output目錄。
3.9 添加測試文件並運行
將需要參與WordCount測試的文本文件放入input目錄下,點擊Run,等待執行結束,就可以在output目錄中得到結果了。
P.S. Hadoop中,InputFormat默認爲TextInputFormat,因此在WordCount的例子中可以按照默認的輸入格式來處理文本。如果是處理其它類型的數據,特別是用戶自定義類型數據的情況,就可能要修改RecordReader,從而用輸入的數據生成map所需的鍵值對。