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

MapReduce自定义排序案例

数据来源基于Hadoop序列化小例子[统计手机的上行流量,下行流量,总流量]MapReduce排序在Shuffle阶段,在分区之后&

数据来源

基于Hadoop序列化小例子[统计手机的上行流量,下行流量,总流量]

MapReduce排序

在Shuffle阶段,在分区之后,排序时根据key值默认按字典顺序进行排序,排序方法为快速排序。

在这里插入图片描述

基于上述案例的自定义排序原理

FlowBean对象做为key传输,需要实现WritableComparable接口重写compareTo方法,就可以实现排序。

相关代码

FlowBean.java

package MapReduceFlow;import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;public class FlowBean implements WritableComparable {private long upFlow;private long downFlow;private long sumFlow;public FlowBean() {}public FlowBean(long upFlow, long downFlow){this.upFlow &#61; upFlow;this.downFlow &#61; downFlow;this.sumFlow &#61; this.upFlow &#43; this.downFlow;}&#64;Overridepublic void write(DataOutput dataOutput) throws IOException {dataOutput.writeLong(this.upFlow);dataOutput.writeLong(this.downFlow);dataOutput.writeLong(this.sumFlow);}&#64;Overridepublic void readFields(DataInput dataInput) throws IOException {this.upFlow &#61; dataInput.readLong();this.downFlow &#61; dataInput.readLong();this.sumFlow &#61; dataInput.readLong();}&#64;Overridepublic int compareTo(Object o) {FlowBean fb &#61; (FlowBean)o;if(this.sumFlow < fb.sumFlow){return -1;}else if(this.sumFlow &#61;&#61; fb.sumFlow){return 0;}else{return 1;}}&#64;Overridepublic String toString() {return upFlow &#43; "\t" &#43; downFlow &#43; "\t" &#43; sumFlow;}public long getUpFlow() {return upFlow;}public void setUpFlow(long upFlow) {this.upFlow &#61; upFlow;this.sumFlow &#61; this.upFlow &#43; this.downFlow;}public long getDownFlow() {return downFlow;}public void setDownFlow(long downFlow) {this.downFlow &#61; downFlow;this.sumFlow &#61; this.upFlow &#43; this.downFlow;}public long getSumFlow() {return sumFlow;}public void setSumFlow(long sumFlow) {this.sumFlow &#61; sumFlow;}
}

MyMapper.java

package MapReduceFlow;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;import java.io.IOException;public class MyMapper extends org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, FlowBean, Text> {protected Text t &#61; new Text();FlowBean fb &#61; new FlowBean();&#64;Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException,NumberFormatException {String str &#61; value.toString();String[] words &#61; str.split("\t");String telNum &#61; words[0];fb.setUpFlow(Long.parseLong(words[2]));fb.setDownFlow(Long.parseLong(words[3]));t.set(telNum);//Key是FlowBean&#xff0c;value是Textcontext.write(fb,t);}
}

MyReducer.java

package MapReduceFlow;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class MyReducer extends Reducer<FlowBean,Text,Text, FlowBean> {&#64;Overrideprotected void reduce(FlowBean key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//FlowBean对象可能会相同&#xff0c;可能同值的FlowBean对象对应多个不同手机号&#xff0c;所以在循环中每次都直接writefor(Text t : values){context.write(t,key);}}
}

MyDriver.java

package MapReduceFlow;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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 java.io.IOException;public class MyDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Configuration conf &#61; new Configuration();Job job &#61; Job.getInstance(conf);job.setJarByClass(MyDriver.class);job.setMapperClass(MyMapper.class);job.setReducerClass(MyReducer.class);job.setMapOutputKeyClass(FlowBean.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//job.setPartitionerClass(MyPartitioner.class);//job.setNumReduceTasks(4);//FileInputFormat.setInputPaths(job,new Path(args[1]));//FileOutputFormat.setOutputPath(job,new Path(args[2]));FileInputFormat.setInputPaths(job,new Path("F:\\Codes\\JavaCodes\\MapReduceLearning\\testdata\\flowbean.txt"));FileOutputFormat.setOutputPath(job,new Path("F:\\Codes\\JavaCodes\\MapReduceLearning\\testdata\\output"));boolean ret &#61; job.waitForCompletion(true);System.exit(ret ? 0 : 1);}
}

结果

在这里插入图片描述


推荐阅读
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 在Java编程中,`AbstractClassTest.java` 文件详细解析了抽象类的使用方法。该文件通过导入 `java.util.*` 包中的 `Date` 和 `GregorianCalendar` 类,展示了如何在主方法 `main` 中实例化和操作抽象类。此外,还介绍了抽象类的基本概念及其在实际开发中的应用场景,帮助开发者更好地理解和运用抽象类的特性。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 在Java编程中,`String`对象既可以用作对象,也可以用作基本类型。本文深入解析了`String`对象中`equals`方法与`==`运算符的区别及其应用场景。`equals`方法用于比较两个字符串的内容是否相同,而`==`运算符则用于比较两个字符串对象的引用是否相同。通过具体示例和代码片段,文章详细阐述了这两种比较方式的内在机制和适用场景,帮助开发者更好地理解和使用`String`对象的比较操作。 ... [详细]
author-avatar
l87653644
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有