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ù)。相當(dāng)于Java中的String。
- LongWritable、IntWritable、FloatWritable、DoubleWritable: 分別用于表示長整型、整型、浮點型和雙精度浮點型數(shù)據(jù)。相當(dāng)于Java中的long、int、float和double。
- BooleanWritable: 用于表示布爾類型數(shù)據(jù)。相當(dāng)于Java中的boolean。
- NullWritable: 用于表示空值,通常用于表示Map任務(wù)的輸出中間結(jié)果數(shù)據(jù)中的值為空。相當(dāng)于Java中的null。
- ArrayWritable: 用于表示數(shù)組類型數(shù)據(jù)。相當(dāng)于Java中的數(shù)組。
- MapWritable: 一種可序列化的Map數(shù)據(jù)結(jié)構(gòu),可以作為Map任務(wù)的輸出(中間結(jié)果數(shù)據(jù))或Reduce任務(wù)的輸入。相當(dāng)于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 {
//如果當(dāng)前數(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í)行成功的標(biāo)志文件的校驗文件,用于校驗標(biāo)志文件的完整性和正確性。該文件由Hadoop框架自動生成,其內(nèi)容是標(biāo)志文件的校驗和信息。
- _SUCCESS: 表示任務(wù)執(zhí)行成功的標(biāo)志文件,文件內(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自動化測試中多數(shù)據(jù)源的切換(實例講解)
下面小編就為大家?guī)硪黄狫ava自動化測試中多數(shù)據(jù)源的切換(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
使用Java實現(xiàn)查看線程的運行狀態(tài)(附源碼)
在現(xiàn)代 Java 應(yīng)用中,線程的運行狀態(tài)對于排查問題和優(yōu)化性能具有至關(guān)重要的作用,本文將使用Java編寫一個查看線程運行狀態(tài)的工具,有需要的可以了解下2025-03-03
Spring Boot 項目設(shè)置網(wǎng)站圖標(biāo)的方法
這篇文章主要介紹了Spring Boot 項目設(shè)置網(wǎng)站圖標(biāo)的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
使用Java和SNMP4J實現(xiàn)SNMP操作完整代碼
這篇文章主要介紹了如何使用Java和SNMP4J庫進行SNMP操作,包括初始化SNMP、創(chuàng)建目標(biāo)、創(chuàng)建PDU、發(fā)送SNMP請求和處理響應(yīng)等內(nèi)容,通過編寫SnmpUtil類,展示了完整的SNMP操作流程,需要的朋友可以參考下2024-12-12
Spring?Cloud?Gateway集成Sentinel流控詳情
這篇文章主要介紹了Spring?Cloud?Gateway集成Sentinel流控詳情,Sentinel支持對Spring?Cloud?Gateway、Zuul等主流的API?Gateway進行限流,需要的朋友可以參考一下2022-09-09

