热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2021年大数据Hadoop(二十四):MapReduce高阶训练

全网最详细的Hadoop文章系列,强烈建议收藏加关注!后面更新文章都会列出历史文章目录,帮助大家回顾知识重点。目录本系列历史文章前言

全网最详细的Hadoop文章系列,强烈建议收藏加关注!

后面更新文章都会列出历史文章目录,帮助大家回顾知识重点。


目录

本系列历史文章

前言

MapReduce高阶训练

一、上网流量统计

二、需求:统计求和

1、思路分析

2、代码实现




本系列历史文章

2021年大数据Hadoop(三十):Hadoop3.x的介绍

2021年大数据Hadoop(二十九):关于YARN常用参数设置

2021年大数据Hadoop(二十八):YARN的调度器Scheduler

2021年大数据Hadoop(二十七):YARN运行流程

2021年大数据Hadoop(二十六):YARN三大组件介绍

2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

2021年大数据Hadoop(二十四):MapReduce高阶训练

2021年大数据Hadoop(二十三):MapReduce的运行机制详解

2021年大数据Hadoop(二十二):MapReduce的自定义分组

2021年大数据Hadoop(二十一):MapReuce的Combineer

2021年大数据Hadoop(二十):MapReduce的排序和序列化

2021年大数据Hadoop(十九):MapReduce分区

2021年大数据Hadoop(十八):MapReduce程序运行模式和深入解析

2021年大数据Hadoop(十七):MapReduce编程规范及示例编写

2021年大数据Hadoop(十六):MapReduce计算模型介绍

2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation

2021年大数据Hadoop(十四):HDFS的高可用机制

2021年大数据Hadoop(十三):HDFS意想不到的其他功能

2021年大数据Hadoop(十二):HDFS的API操作

2021年大数据Hadoop(十一):HDFS的元数据辅助管理

2021年大数据Hadoop(十):HDFS的数据读写流程

2021年大数据Hadoop(九):HDFS的高级使用命令

2021年大数据Hadoop(八):HDFS的Shell命令行使用

2021年大数据Hadoop(七):HDFS分布式文件系统简介

2021年大数据Hadoop(六):全网最详细的Hadoop集群搭建

2021年大数据Hadoop(五):Hadoop架构

2021年大数据Hadoop(四):Hadoop发行版公司

2021年大数据Hadoop(三):Hadoop国内外应用

2021年大数据Hadoop(二):Hadoop发展简史和特性优点

2021年大数据Hadoop(一):Hadoop介绍


前言

2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习。

有对大数据感兴趣的可以关注微信公众号:三帮大数据


MapReduce高阶训练


一、上网流量统计

数据格式如下:


二、需求:统计求和

统计每个手机号的上行数据包数总和,下行数据包数总和,上行总流量之和,下行总流量之和

分析:以手机号码作为key值,上行数据包,下行数据包,上行总流量,下行总流量四个字段作为value值,然后以这个key和value作为map阶段的输出,reduce阶段的输入。


1、思路分析


2、代码实现

第一步:自定义map的输出value对象FlowBean

import org.apache.hadoop.io.Writable;import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;//如果MR中的JavaBean不是作为K2,则只需要实现Writable接口即可public class FlowBean implements Writable{private Integer upFlow;    //上行包数private Integer  downFlow; //下行包数private Integer upCountFlow; //上行流量和private Integer downCountFlow; //下行流量和public FlowBean() {}public FlowBean(Integer upFlow, Integer downFlow, Integer upCountFlow, Integer downCountFlow) {this.upFlow = upFlow;this.downFlow = downFlow;this.upCountFlow = upCountFlow;this.downCountFlow = downCountFlow;}public Integer getUpFlow() {return upFlow;}@Overridepublic String toString() {return upFlow +"\t" + downFlow +"\t" + upCountFlow +"\t" + downCountFlow;}public void setUpFlow(Integer upFlow) {this.upFlow = upFlow;}public Integer getDownFlow() {return downFlow;}public void setDownFlow(Integer downFlow) {this.downFlow = downFlow;}public Integer getUpCountFlow() {return upCountFlow;}public void setUpCountFlow(Integer upCountFlow) {this.upCountFlow = upCountFlow;}public Integer getDownCountFlow() {return downCountFlow;}public void setDownCountFlow(Integer downCountFlow) {this.downCountFlow = downCountFlow;}//序列化@Overridepublic void write(DataOutput out) throws IOException {out.writeInt(upFlow);out.writeInt(downFlow);out.writeInt(upCountFlow);out.writeInt(downCountFlow);}//反序列化@Overridepublic void readFields(DataInput in) throws IOException {this.upFlow = in.readInt();this.downFlow = in.readInt();this.upCountFlow = in.readInt();this.downCountFlow = in.readInt();}}

第二步:定义FlowMapper类

import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class FlowCountMapper extends Mapper {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//1:拆分行文本数据(拆分v1)String[] split = value.toString().split("\t");//2:从拆分数组中得到手机号,得到K2String phoneNum = split[1];//3:从拆分数组中得到4个流量字段,并封装到FlowBean,得到V2FlowBean flowBean = new FlowBean();flowBean.setUpFlow(Integer.parseInt(split[6]));flowBean.setDownFlow(Integer.parseInt(split[7]));flowBean.setUpCountFlow(Integer.parseInt(split[8]));flowBean.setDownCountFlow(Integer.parseInt(split[9]));//4:将K2和V2写入上下文中context.write(new Text(phoneNum), flowBean);}}

第三步:定义FlowCountReducer类

import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class FlowCountReducer extends Reducer {@Overrideprotected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {//1:定义四个变量,分别来存储上行包数,下行包数,上行流量总和,下行流量总和int upFlow = 0;int downFlow = 0;int upCountFlow = 0;int downCountFlow = 0;//2:遍历集合,将集合中每一个FlowBean的四个流量字段相加for (FlowBean flowBean : values) {upFlow += flowBean.getUpFlow();downFlow += flowBean.getDownFlow();upCountFlow += flowBean.getUpCountFlow();downCountFlow += flowBean.getDownCountFlow();}//3:K3就是原来的K2,V3就是新的FlowBeanFlowBean flowBean = new FlowBean(upFlow, downFlow, upCountFlow, downCountFlow);//4:将K3和V3写入上下文中context.write(key, flowBean);}}

第四步:程序main函数入口FlowCountRunner

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;import java.io.IOException;public class FlowCountRunner {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//1、创建建一个job任务对象Configuration configuration = new Configuration();Job job = Job.getInstance(configuration, "flowcount_demo");//2、指定job所在的jar包job.setJarByClass(FlowCountRunner.class);//3、指定源文件的读取方式类和源文件的读取路径job.setInputFormatClass(TextInputFormat.class); //按照行读取//TextInputFormat.addInputPath(job, new Path("hdfs://node1:8020/input/wordcount")); //只需要指定源文件所在的目录即可TextInputFormat.addInputPath(job, new Path("file:///E:\\input\\flowcount")); //只需要指定源文件所在的目录即可//4、指定自定义的Mapper类和K2、V2类型job.setMapperClass(FlowCountMapper.class); //指定Mapper类job.setMapOutputKeyClass(Text.class); //K2类型job.setMapOutputValueClass(FlowBean.class);//V2类型//5、指定自定义分区类(如果有的话)//6、指定自定义分组类(如果有的话)//7、指定自定义Combiner类(如果有的话)//设置ReduceTask个数//8、指定自定义的Reducer类和K3、V3的数据类型job.setReducerClass(FlowCountReducer.class); //指定Reducer类job.setOutputKeyClass(Text.class); //K3类型job.setOutputValueClass(FlowBean.class);  //V3类型//9、指定输出方式类和结果输出路径job.setOutputFormatClass(TextOutputFormat.class);//TextOutputFormat.setOutputPath(job, new  Path("hdfs://node1:8020/output/wordcount")); //目标目录不能存在,否则报错TextOutputFormat.setOutputPath(job, new  Path("file:///E:\\output\\flowcount")); //目标目录不能存在,否则报错//10、将job提交到yarn集群boolean bl = job.waitForCompletion(true); //true表示可以看到任务的执行进度//11.退出执行进程System.exit(bl?0:1);}}



  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢大数据系列文章会每天更新,停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

推荐阅读
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 2017-09-07前端日报精选JavaScriptEventLoop机制详解与Vue.js中实践应用Redux基础与实践如何用js获取虚拟键盘高度?( ... [详细]
  • hadoop3.1.2 first programdefault wordcount (Mac)
    hadoop3.1.2安装完成后的第一个实操示例程 ... [详细]
  • 工作原理_一文理解 Spark 基础概念及工作原理
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了一文理解Spark基础概念及工作原理相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
author-avatar
三少乾坤_943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有