1. 程式人生 > >hadoop word count 學習總結

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