hadoop word count 學習總結
hadoop wordcount學習總結
需求
實現對文字檔案中各個單詞數量的統計,文字檔案的內容在hdfs檔案系統的/srcdata目錄下,檔名稱為test.txt,檔案內容如下:
wo shi yi
zhi xiao yang
mao wo e e e
e heng heng heng
輸出資料夾為output資料夾。
程式
在eclipse 上新建一個java工程,匯入hadoop目錄下面的hadoop-2.7.3\share\hadoop目錄中的java包,此目錄下所有的包都加入。新建一個包,包名為app,mapreduce分為兩個部分,第一個部分為map階段,wordcount的map程式的功能為:
將輸入的行文字拆分成單詞輸出至reduce階段。
map階段的類取名為WordMap,程式碼如下所示:
package app;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
//kv:輸入資料KV對中的key的資料型別
//valueIn:輸入kv資料對中的value資料型別
//keyout 輸出kv資料的資料型別
//value 輸出kv中value的資料型別
public class WordMap extends Mapper<LongWritable,Text,Text,IntWritable>
{
protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException
{
String str = value.toString();
//將一行文字分成單詞
String[] words = str.split(" ");
//輸出單詞用<單詞,1>
for(String word:words)
{
System.out.println("map:"+word);
context.write(new Text(word),new IntWritable(1));
}
}
}
這個Mapper類是一個泛型型別,它有四個引數型別,分別指定map函式的輸入鍵、輸入值、輸出鍵和輸出值的型別。就現在這個例子來說,輸入鍵是一個長整數便宜,輸入值是一行文字,輸出鍵是單詞,輸出值是1。
當map階段執行完成之後,hadoop會將相同具有相同鍵值的k-v對輸出到recuder中,hadoop mapreduce 的執行原理如下圖所示
reducer類名為:WordReduce,程式碼如下:
package app;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
class WordReduce extends Reducer<Text,IntWritable,Text,IntWritable>
{
protected void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException
{
int count =0;
for(IntWritable value:values)
{
System.out.println("reduce:"+value);
count = count + value.get();
}
//輸出單詞的總次數
context.write(key, new IntWritable(count));
}
}
reducer類的輸入要和map類的輸出型別一致,這個reducer類的作用是將相同鍵值的次數相加,最後再進行輸出。
除了mapreduce類,還要一個job提交類,job提交類取名為WordSubmit,這個類程式碼如下:
package app;
import java.io.IOException;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordSubmit {
public static void main(String [] args) throws IOException, ClassNotFoundException, InterruptedException
{
Configuration conf = new Configuration();
Job wJob = Job.getInstance(conf);
//指定job指定的jar包位置
wJob.setJarByClass(WordSubmit.class);
wJob.setMapperClass(WordMap.class);
wJob.setReducerClass(WordReduce.class);
//
wJob.setMapOutputKeyClass(Text.class);
wJob.setMapOutputValueClass(IntWritable.class);
wJob.setOutputKeyClass(Text.class);
wJob.setOutputValueClass(IntWritable.class);
//設定要處理文字的資料在哪裡
FileInputFormat.setInputPaths(wJob, "hdfs://127.0.0.1:9000/srcdata");
//最終輸出結果所存放的路徑
FileOutputFormat.setOutputPath(wJob, new Path("hdfs://127.0.0.1:9000/output"));
wJob.waitForCompletion(true);
}
}
我的執行環境為centos,開發環境為eclipse,需要指定指定引數和hadoop native庫,啟動引數設定為Debug configurations ,啟動引數設定如下圖所示。
兩個引數配置可以檢視http://yeelor.iteye.com/blog/1991075
最後是執行結果,如下所示:
e 4
heng 3
mao 1
shi 1
wo 2
xiao 1
yang 1
yi 1
zhi 1