Reduce 端程序编写

简介: Reduce 端程序编写

首先编写 Reduce 端编程框架,自定义的 FlowSumReducer 需要继承父类 Reducer,输入数据和输出数据都是**KV 对**的形式。具体框架代码如下:


publicclassFlowSumReducerextendsReducer<Text, FlowBean, Text, FlowBean> {
}


- **KEYIN**:对应 Mapper 端输出的 KEYOUT,即每个手机号,所以是 String,对应 Hadoop 中的 Text

- **VALUEIN**:对应 Mapper 端输出的 VALUEOUT,即封装的流量信息类,所以是 FlowBean

- **KEYOUT**:用户自定义逻辑方法返回数据中key的类型,由用户业务逻辑决定,在此程序中,我们输出的key是手机号,所以是String,对应 Hadoop 中的 Text

- **VALUEOUT**:用户自定义逻辑方法返回数据中value的类型,由用户业务逻辑决定,在此程序中,我们输出的value是累加求和后封装的流量信息类,所以是 FlowBean


 已知 Reducer 中的业务逻辑写在 **reduce() 方法**中,在此 reduce()方法中我们需要接收 MapTask 的输出结果,然后按照 key(手机号) 对 value(上行流量、下行流量) 做**汇总操作**。具体代码如下所示:


@Overrideprotectedvoidreduce(Textkey, Iterable<FlowBean>values,
Reducer<Text, FlowBean, Text, FlowBean>.Contextcontext) throwsIOException, InterruptedException {
longsumUpFlow=0L; // 总上行流量longsumDownFlow=0L; // 总下行流量for (FlowBeanfb : values) {
sumUpFlow+=fb.getUpFlow();
sumDownFlow+=fb.getDownFlow();
    }
// 获取总上行流量和总下行流量,对其进行封装FlowBeanresultsum=newFlowBean(sumUpFlow, sumDownFlow);
// 将手机号作为key,将封装的流量信息类作为value,写出最终结果context.write(key, resultsum);
}


FlowSumReducer.java 的完整代码如下所示:


publicclassFlowSumReducerextendsReducer<Text, FlowBean, Text, FlowBean> {
/** * 框架每传递一组数据<13502468823,{FlowBean,FlowBean,FlowBean...}>调用一次reduce方法* reduce中的业务逻辑是遍历values,然后进行累加求和后输出*/@Overrideprotectedvoidreduce(Textkey, Iterable<FlowBean>values,
Reducer<Text, FlowBean, Text, FlowBean>.Contextcontext) throwsIOException, InterruptedException {
longsumUpFlow=0L; // 总上行流量longsumDownFlow=0L; // 总下行流量for (FlowBeanfb : values) {
sumUpFlow+=fb.getUpFlow();
sumDownFlow+=fb.getDownFlow();
        }
// 获取总上行流量和总下行流量,对其进行封装FlowBeanresultsum=newFlowBean(sumUpFlow, sumDownFlow);
// 将手机号作为key,将封装的流量信息类作为value,写出最终结果context.write(key, resultsum);
    }
}
相关文章
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
316 10
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
307 8
|
存储 NoSQL MongoDB
(四)成为分布式高手必经之路:理解那些工作在分布式系统底层的一致性模型
在分布式领域里,一致性成为了炙手可热的名词,缓存、数据库、消息中间件、文件系统、业务系统……,各类分布式场景中都有它的身影,因此,想要更好的理解分布式系统,必须要理解“一致性”这个概念。本文就展开聊聊 分布式系统里的一致性模型。
337 7
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
336 6
|
编解码 NoSQL Redis
(十一)Netty实战篇:基于Netty框架打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。
397 3
|
Java 应用服务中间件 Linux
(九)Java网络编程无冕之王-这回把大名鼎鼎的Netty框架一网打尽!
现如今的开发环境中,分布式/微服务架构大行其道,而分布式/微服务的根基在于网络编程,而Netty恰恰是Java网络编程领域的无冕之王。Netty这个框架相信大家定然听说过,其在Java网络编程中的地位,好比JavaEE中的Spring。
494 3
|
Arthas 监控 算法
JVM成神路终章:深入死磕Java虚拟机序列总纲
JVM成神路终章:深入死磕Java虚拟机序列总纲
495 1
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
443 1
|
运维 监控 Java
(十)JVM成神路之线上故障排查、性能监控工具分析及各线上问题排错实战
经过前述九章的JVM知识学习后,咱们对于JVM的整体知识体系已经有了全面的认知。但前面的章节中,更多的是停留在理论上进行阐述,而本章节中则更多的会分析JVM的实战操作。
393 1