Linux下部署Hadoop開發環境

需要提前準備的系統環境及軟件有: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所需的鍵值對。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章