Hadoop WordCount

package com.yc.hadoop.hdfs;


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;


/**
 * 單詞統計
 * @company 源辰信息
 * @author navy
 * 導包:
 * hadoop-3.0.0\share\hadoop\mapreduce下的jar包
 * hadoop-3.0.0\share\hadoop\common下的jar包
 *  hadoop-3.0.0\share\hadoop\yarn下的jar包
 */
public class YcWordCount {

/**
* 第一、二個參數表示輸入map的key和value,從InputFormat傳過來的,key默認是字符偏移量,value默認是一行
* 第三、四個表示輸出的key和value
* @company 源辰信息
* @author navy
*/
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
/*
* IntWritable是 Hadoop 中實現的用於封裝 Java 數據類型的類,它的原型是public IntWritable(int value)和public IntWritable()兩種。
* 所以new IntWritable(1)是創建了這個類的一個對象,而數值1這是參數。在Hadoop中它相當於java中Integer整型變量,爲這個變量賦值爲1.
*/
private final static IntWritable one = new IntWritable(1);

/*
* 這類存儲的文本使用標準UTF8編碼。它提供了序列化、反序列化和比較文本的方法。 
* Text類使用整型來存儲字符串編碼中所需的字節數。即Text存儲的是字節數,這個字節數用整型存儲,並且使用零壓縮格式進行序列化。
* 此外,它還提供了字符串遍歷的方法,而無需將字節數組轉換爲字符串。
*/
private Text word = new Text();  // 輸出的鍵 單詞


/*
* context它是mapper的一個內部類,簡單的說頂級接口是爲了在map或是reduce任務中跟蹤task的狀態,很自然的MapContext就是記錄了map執行的上下文,
* 在mapper類中,這個context可以存儲一些job、conf的信息,比如job運行時參數等,我們可以在map函數中處理這個信息,這也是hadoop中參數傳遞中一個很經典的例子,
* 同時context作爲了map和reduce執行中各個函數的一個橋樑,這個設計和java web中的session對象、application對象很相似(non-Javadoc)
*/
// 處理經過  TextInputFormat  產生的  <k1,v1>,然後產生 <k2,v2>
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
//它是一個很方便的字符串分解器,主要用來根據分隔符把字符串分割成標記(Token),然後按照請求返回各個標記。
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());  // 讀取到的單詞作爲鍵值
context.write(word,one); // 以單詞,1的中間形式交給reduce處理
}
}
}



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(YcWordCount.class);
job.setCombinerClass(IntSumReducer.class);

// 設置MapReduce類
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);

// 設置輸出格式
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

/*
* 報錯 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
* 請查看報錯文檔
*/

FileInputFormat.addInputPath(job, new Path("hdfs://192.168.30.130:9000/user/navy/yc.txt"));

// 查看hdfs上的文件和目錄  hadoop fs ls /
// 刪除目錄 hadoop fs -rm -r /<目錄名>
// 查看統計信息  hadoop fs -cat wordcount/part-r-00000
FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.30.130:9000/user/navy/wordcount"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章