Java編寫Mapreduce程序過程淺析
一個(gè)Maprduce程序主要包括三部分:Mapper類、Reducer類、執(zhí)行類。
Maven項(xiàng)目下所需依賴
<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: 一種可變長(zhǎng)度的字節(jié)數(shù)組,用于表示文本數(shù)據(jù)。相當(dāng)于Java中的String。
- LongWritable、IntWritable、FloatWritable、DoubleWritable: 分別用于表示長(zhǎng)整型、整型、浮點(diǎn)型和雙精度浮點(diǎn)型數(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方法對(duì)大數(shù)據(jù)來說比Java自帶的擁有更好的性能
//輸出鍵值對(duì)
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;
//遍歷單詞計(jì)數(shù)數(shù)組,將值累加到sum中
for (LongWritable value : values) {
sum += value.get();
}
//輸出每次最終的計(jì)數(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)計(jì)文件輸入的路徑,將命令行的第一個(gè)參數(shù)作為輸入文件的路徑
//讀取maven項(xiàng)目下resources目錄的文檔
String path = getClass().getResource("/words.txt").getPath();
FileInputFormat.setInputPaths(job,path);
//設(shè)置結(jié)果數(shù)據(jù)存放路徑,將命令行的第二個(gè)參數(shù)作為數(shù)據(jù)的輸出路徑
//輸出目錄必須不存在!!!
FileOutputFormat.setOutputPath(job,new Path("./output"));
return job.waitForCompletion(true) ? 0 : 1;
}
}程序執(zhí)行結(jié)果
- .part-r-00000.crc: 是Reduce任務(wù)輸出結(jié)果文件的校驗(yàn)文件,用于校驗(yàn)Reduce任務(wù)輸出結(jié)果文件的完整性和正確性。該文件由Hadoop框架自動(dòng)生成,不需要手動(dòng)創(chuàng)建,其內(nèi)容是Reduce任務(wù)輸出結(jié)果文件的校驗(yàn)和信息。
- ._SUCCESS.crc: 是表示任務(wù)執(zhí)行成功的標(biāo)志文件的校驗(yàn)文件,用于校驗(yàn)標(biāo)志文件的完整性和正確性。該文件由Hadoop框架自動(dòng)生成,其內(nèi)容是標(biāo)志文件的校驗(yàn)和信息。
- _SUCCESS: 表示任務(wù)執(zhí)行成功的標(biāo)志文件,文件內(nèi)容為空。
- part-r-00000: 表示Reduce任務(wù)的輸出結(jié)果文件,其中“00000”表示該文件是第一個(gè)Reduce任務(wù)的輸出結(jié)果文件,如果有多個(gè)Reduce任務(wù),則會(huì)生成多個(gè)該類型的文件,文件內(nèi)容為每個(gè)單詞出現(xiàn)的次數(shù)。

到此這篇關(guān)于Java編寫Mapreduce程序過程淺析的文章就介紹到這了,更多相關(guān)Java編寫Mapreduce內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入探究如何使用Java編寫MapReduce程序
- Java大數(shù)據(jù)處理的核心技術(shù)MapReduce框架
- Java大數(shù)據(jù)開發(fā)Hadoop?MapReduce
- java實(shí)現(xiàn)MapReduce對(duì)文件進(jìn)行切分的示例代碼
- Java基礎(chǔ)之MapReduce框架總結(jié)與擴(kuò)展知識(shí)點(diǎn)
- Java/Web調(diào)用Hadoop進(jìn)行MapReduce示例代碼
- java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)
- java連接hdfs ha和調(diào)用mapreduce jar示例
相關(guān)文章
MyBatis CodeHelperPro激活方法詳細(xì)教程
MyBatisCodeHelper-Pro是IDEA下的一個(gè)插件,功能類似mybatis plugin,今天小編給大家分享MyBatis CodeHelperPro激活方法,需要的朋友跟隨小編一起看看吧2021-07-07
Java自動(dòng)化測(cè)試中多數(shù)據(jù)源的切換(實(shí)例講解)
下面小編就為大家?guī)硪黄狫ava自動(dòng)化測(cè)試中多數(shù)據(jù)源的切換(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
使用Java實(shí)現(xiàn)查看線程的運(yùn)行狀態(tài)(附源碼)
在現(xiàn)代 Java 應(yīng)用中,線程的運(yùn)行狀態(tài)對(duì)于排查問題和優(yōu)化性能具有至關(guān)重要的作用,本文將使用Java編寫一個(gè)查看線程運(yùn)行狀態(tài)的工具,有需要的可以了解下2025-03-03
Spring Boot 項(xiàng)目設(shè)置網(wǎng)站圖標(biāo)的方法
這篇文章主要介紹了Spring Boot 項(xiàng)目設(shè)置網(wǎng)站圖標(biāo)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
使用Java和SNMP4J實(shí)現(xiàn)SNMP操作完整代碼
這篇文章主要介紹了如何使用Java和SNMP4J庫(kù)進(jìn)行SNMP操作,包括初始化SNMP、創(chuàng)建目標(biāo)、創(chuàng)建PDU、發(fā)送SNMP請(qǐng)求和處理響應(yīng)等內(nèi)容,通過編寫SnmpUtil類,展示了完整的SNMP操作流程,需要的朋友可以參考下2024-12-12
Spring?Cloud?Gateway集成Sentinel流控詳情
這篇文章主要介紹了Spring?Cloud?Gateway集成Sentinel流控詳情,Sentinel支持對(duì)Spring?Cloud?Gateway、Zuul等主流的API?Gateway進(jìn)行限流,需要的朋友可以參考一下2022-09-09

