您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關MapReduce如何實現WordCount及其優化,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
WordCount: 單詞計數, 統計文本文件中每一個單詞出現的次數
定義Mapper類, 該類繼承org.apache.hadoop.mapreduce.Mapper
并重寫map()方法
public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> { // 定義一個靜態成員變量, 并且是不可變的, 避免每一次調用map()方法時, 創建重復對象 private final static IntWritable one = new IntWritable(1); // 定義一個成員變量, 可變, 每一次調用map()方法時, 只需要調用Text.set()方法賦新值 private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] words = value.toString().split(" "); for (String item : words) { word.set(item); context.write(word, one); } } }
定義Reducer類, 該類繼承org.apache.hadoop.mapreduce.Reducer
并重寫reduce()方法
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { // 定義一個成員變量, 可變, 每一次調用reduce()方法時, 只需要調用IntWritable.set()方法賦新值 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); } }
測試WordCount
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(WordCount.class); // 設置job的主類 job.setMapperClass(TokenizerMapper.class); // 設置Mapper類 // 利用combiner來減少通過shuffle傳輸的數據量 job.setCombinerClass(IntSumReducer.class); // 設置Combiner類 job.setReducerClass(IntSumReducer.class); // 設置Reducer類 job.setMapOutputKeyClass(Text.class); // 設置map階段輸出Key的類型 job.setMapOutputValueClass(IntWritable.class); // 設置map階段輸出Value的類型 job.setOutputKeyClass(Text.class); // 設置reduce階段輸出Key的類型 job.setOutputValueClass(IntWritable.class); // 設置reduce階段輸出Value的類型 // 設置job輸入路徑(從main方法參數args中獲取) FileInputFormat.addInputPath(job, new Path(args[0])); // 設置job輸出路徑(從main方法參數args中獲取) FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); // 提交job }
輸入:
words:
hello tom hello jerry hello kitty hello world hello tom
輸出:
hello 5 jerry 1 kitty 1 tom 2 world 1
減少對象的創建, 更少的GC, 肯定會帶來更快的速度
利用combiner來減少通過shuffle傳輸的數據量, 這是MapReduce作業調優的關鍵點之一
上述就是小編為大家分享的MapReduce如何實現WordCount及其優化了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。