Hadoop--使用JavaAPI編寫wordcount的jar包
阿新 • • 發佈:2018-11-16
GitHub:https://github.com/GYT0313/Hadoop-JavaAPI-Code/tree/master/chapter4/wordcount
1.建立專案
建立三個類:
Mapper、Reducer、Main驅動類(需要匯入 jar包)
2.程式碼
- WordMapper.java:
package wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; /** * @author: Gu Yongtao * @Description: * @date: 2018年11月6日 下午4:17:05 * @Filename: WordMapper.java */ public class WordMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); // Mapper類的核心方法 /** * key 首字元偏移量 * value 檔案的一行內容 * context Mapper端的上下文 * @throws InterruptedException * @throws IOException */ public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); // 分割輸入行為key,預設以空格/回車...分割 while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }
分析:StringTokenizer itr = new StringTokenizer(value.toString());
- WordReducer.java:
package wordcount; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; /** * @author: Gu Yongtao * @Description: * @date: 2018年11月6日 下午4:40:16 * @Filename: WordReducer.java */ public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); // 記錄詞的頻數 // Reducer抽象類的核心方法 public void reduce (Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; // 遍歷values 將 list<value> 疊加 for (IntWritable value : values) { sum += value.get(); } result.set(sum); context.write(key, result); } }
- WordMain.java:(IP地址根據自身叢集配置)
package wordcount; 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; import org.apache.hadoop.util.GenericOptionsParser; /** * @author: Gu Yongtao * @Description: * @date: 2018年11月6日 下午4:53:59 * @Filename: WordMain.java */ public class WordMain { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { // Configuration類:讀取配置檔案內容-core-site.xml Configuration conf = new Configuration(); // 讀取命令列引數,並設定到conf 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 job.setJarByClass(WordMain.class); // 設定主類 job.setMapperClass(WordMapper.class); // 設定Mapper類 job.setCombinerClass(WordReducer.class); // 設定作業合成類 job.setReducerClass(WordReducer.class); // 設定Reducer類 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.匯出jar包:
右鍵專案,點選Export:
選擇 JAR file:
點選Next,勾選wordcount工程中的 src,並選擇儲存的路徑名(包含最終的檔名),點選Finish:
匯出的jar包:
4.執行jar包
執行格式:
hadoop jar [jar 檔案位置] [jar 主類] [HDFS 輸入路徑] [HDFS 輸出路徑]
準備輸入檔案:使用hdfs shell命令寫入檔案內容(-appendToFile使用ctrl + c結束 | 也可以使用-put 上傳本地檔案)
執行任務:
hadoop jar /home/hadoop/jar/wordcount.jar wordcount.WordMain /data/wordcount.txt /output/wordcount3
檢視輸出:
總結:
使用JavaAPI編寫wordcount例項,可以根據自己需要設定分隔符,而不再單純的以空格/回車… 為分割。
只需要設定StringTokenizer的例項即可,如: