Java編寫Mapreduce程序過程淺析
更新時間:2023年05月11日 11:15:40 作者:讓線程再跑一會
MapReduce是一種用于處理大規(guī)模數(shù)據(jù)集的并行編程模型,其特點高效性和可擴展性,在本文中,我們將深入了解MapReduce,并使用Java編寫一個簡單的MapReduce程序,需要的朋友可以參考下
一個Maprduce程序主要包括三部分:Mapper類、Reducer類、執(zhí)行類。
Maven項目下所需依賴
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies>
數(shù)據(jù)類型
- Text: 一種可變長度的字節(jié)數(shù)組,用于表示文本數(shù)據(jù)。相當于Java中的String。
- LongWritable、IntWritable、FloatWritable、DoubleWritable: 分別用于表示長整型、整型、浮點型和雙精度浮點型數(shù)據(jù)。相當于Java中的long、int、float和double。
- BooleanWritable: 用于表示布爾類型數(shù)據(jù)。相當于Java中的boolean。
- NullWritable: 用于表示空值,通常用于表示Map任務(wù)的輸出中間結(jié)果數(shù)據(jù)中的值為空。相當于Java中的null。
- ArrayWritable: 用于表示數(shù)組類型數(shù)據(jù)。相當于Java中的數(shù)組。
- MapWritable: 一種可序列化的Map數(shù)據(jù)結(jié)構(gòu),可以作為Map任務(wù)的輸出(中間結(jié)果數(shù)據(jù))或Reduce任務(wù)的輸入。相當于Java中的Map<>。
- WritableComparable: 一種可序列化的、可比較的數(shù)據(jù)類型接口,可以作為Map任務(wù)或Reduce任務(wù)的輸入輸出數(shù)據(jù)類型。
一、Mapper類
import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.util.StringUtils; import java.io.IOException; public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //如果當前數(shù)據(jù)不為空 if (value!=null){ //獲取每一行的數(shù)據(jù) String line = value.toString(); //將一行數(shù)據(jù)根據(jù)空格分開 // String[] words = line.split(" "); String[] words = StringUtils.split(line,' ');//hadoop的StringUtils.split方法對大數(shù)據(jù)來說比Java自帶的擁有更好的性能 //輸出鍵值對 for (String word : words) { context.write(new Text(word),new LongWritable(1)); } } } }
二、Reducer類
import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> { @Override protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { //累加單詞的數(shù)量 long sum = 0; //遍歷單詞計數(shù)數(shù)組,將值累加到sum中 for (LongWritable value : values) { sum += value.get(); } //輸出每次最終的計數(shù)結(jié)果 context.write(key,new LongWritable(sum)); } }
三、執(zhí)行類
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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.Tool; import org.apache.hadoop.util.ToolRunner; public class WordCountRunner extends Configured implements Tool { public static void main(String[] args) throws Exception { ToolRunner.run(new Configuration(),new WordCountRunner(),args); } @Override public int run(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCountRunner.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); //設(shè)置統(tǒng)計文件輸入的路徑,將命令行的第一個參數(shù)作為輸入文件的路徑 //讀取maven項目下resources目錄的文檔 String path = getClass().getResource("/words.txt").getPath(); FileInputFormat.setInputPaths(job,path); //設(shè)置結(jié)果數(shù)據(jù)存放路徑,將命令行的第二個參數(shù)作為數(shù)據(jù)的輸出路徑 //輸出目錄必須不存在!!! FileOutputFormat.setOutputPath(job,new Path("./output")); return job.waitForCompletion(true) ? 0 : 1; } }
程序執(zhí)行結(jié)果
- .part-r-00000.crc: 是Reduce任務(wù)輸出結(jié)果文件的校驗文件,用于校驗Reduce任務(wù)輸出結(jié)果文件的完整性和正確性。該文件由Hadoop框架自動生成,不需要手動創(chuàng)建,其內(nèi)容是Reduce任務(wù)輸出結(jié)果文件的校驗和信息。
- ._SUCCESS.crc: 是表示任務(wù)執(zhí)行成功的標志文件的校驗文件,用于校驗標志文件的完整性和正確性。該文件由Hadoop框架自動生成,其內(nèi)容是標志文件的校驗和信息。
- _SUCCESS: 表示任務(wù)執(zhí)行成功的標志文件,文件內(nèi)容為空。
- part-r-00000: 表示Reduce任務(wù)的輸出結(jié)果文件,其中“00000”表示該文件是第一個Reduce任務(wù)的輸出結(jié)果文件,如果有多個Reduce任務(wù),則會生成多個該類型的文件,文件內(nèi)容為每個單詞出現(xiàn)的次數(shù)。
到此這篇關(guān)于Java編寫Mapreduce程序過程淺析的文章就介紹到這了,更多相關(guān)Java編寫Mapreduce內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java.lang.Long.parseLong()方法詳解及示例
這個java.lang.Long.parseLong(String s) 方法解析字符串參數(shù)s作為有符號十進制長,下面這篇文章主要給大家介紹了關(guān)于Java.lang.Long.parseLong()方法詳解及示例的相關(guān)資料,需要的朋友可以參考下2023-01-01Spring Boot 2.x 實現(xiàn)文件上傳功能
這篇文章主要介紹了Spring Boot 2.x 實現(xiàn)文件上傳功能,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01基于spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯
這篇文章主要介紹了spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01JVM調(diào)優(yōu)OutOfMemoryError異常分析
這篇文章主要為大家介紹了JVM調(diào)優(yōu)OutOfMemoryError異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11