辅助排序和Mapreduce整体流程

一、辅助排序

  需求:先有一个订单数据文件,包含了订单id、商品id、商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据。

  思路:1.封装订单类OrderBean,实现WritableComparable接口;

     2.自定义Mapper类,确定输入输出数据类型,写业务逻辑;

     3.自定义分区,根据不同的订单id返回不同的分区值;

     4.自定义Reducer类;

     5.辅助排序类OrderGroupingComparator继承WritableComparator类,并定义无参构成方法、重写compare方法;

     6.书写Driver类;

  代码如下:

/*** @author: PrincessHug* @date: 2019/3/25, 21:42* @Blog: https://www.cnblogs.com/HelloBigTable/*/
public class OrderBean implements WritableComparable<OrderBean> {private int orderId;private double orderPrice;public OrderBean() {}public OrderBean(int orderId, double orderPrice) {this.orderId = orderId;this.orderPrice = orderPrice;}public int getOrderId() {return orderId;}public void setOrderId(int orderId) {this.orderId = orderId;}public double getOrderPrice() {return orderPrice;}public void setOrderPrice(double orderPrice) {this.orderPrice = orderPrice;}@Overridepublic String toString() {return orderId + "\t" + orderPrice;}@Overridepublic int compareTo(OrderBean o) {int rs ;if (this.orderId > o.getOrderId()){rs = 1;}else if (this.orderId < o.getOrderId()){rs = -1;}else {rs = (this.orderPrice > o.getOrderPrice()) ? -1:1;}return rs;}@Overridepublic void write(DataOutput out) throws IOException {out.writeInt(orderId);out.writeDouble(orderPrice);}@Overridepublic void readFields(DataInput in) throws IOException {orderId = in.readInt();orderPrice = in.readDouble();}
}public class OrderMapper extends Mapper<LongWritable, Text,OrderBean, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//获取数据String line = value.toString();//切割数据String[] fields = line.split("\t");//封装数据int orderId = Integer.parseInt(fields[0]);double orderPrice = Double.parseDouble(fields[2]);OrderBean orderBean = new OrderBean(orderId, orderPrice);//发送数据context.write(orderBean,NullWritable.get());}
}public class OrderPartitioner extends Partitioner<OrderBean, NullWritable> {@Overridepublic int getPartition(OrderBean orderBean, NullWritable nullWritable, int i) {//构造参数中i的值为reducetask的个数return (orderBean.getOrderId() & Integer.MAX_VALUE ) % i;}
}public class OrderReducer extends Reducer<OrderBean, NullWritable,OrderBean,NullWritable> {@Overrideprotected void reduce(OrderBean key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {context.write(key,NullWritable.get());}
}public class OrderGrouptingComparator extends WritableComparator {//必须使用super调用父类的构造方法来定义对比的类为OrderBeanprotected OrderGrouptingComparator(){super(OrderBean.class,true);}@Overridepublic int compare(WritableComparable a, WritableComparable b) {OrderBean aBean = (OrderBean)a;OrderBean bBean = (OrderBean)b;int rs ;if (aBean.getOrderId() > bBean.getOrderId()){rs = 1;}else if (aBean.getOrderId() < bBean.getOrderId()){rs = -1;}else {rs = 0;}return rs;}
}public class OrderDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//配置信息,Job对象Configuration conf = new Configuration();Job job = Job.getInstance(conf);//执行类job.setJarByClass(OrderBean.class);//设置Mapper、Reducer类job.setMapperClass(OrderMapper.class);job.setReducerClass(OrderReducer.class);//设置Mapper输出数据类型job.setMapOutputKeyClass(OrderBean.class);job.setMapOutputValueClass(NullWritable.class);//设置Reducer输出数据类型job.setOutputKeyClass(OrderBean.class);job.setOutputValueClass(NullWritable.class);//设置辅助排序job.setGroupingComparatorClass(OrderGrouptingComparator.class);//设置分区类job.setPartitionerClass(OrderPartitioner.class);//设置reducetask数量job.setNumReduceTasks(3);//设置文件输入输出流FileInputFormat.setInputPaths(job,new Path("G:\\mapreduce\\order\\in"));FileOutputFormat.setOutputPath(job,new Path("G:\\mapreduce\\order\\out"));//提交任务if (job.waitForCompletion(true)){System.out.println("运行完成!");}else {System.out.println("运行失败!");}}
}

  由于这是敲了很多次的代码,没有加太多注释,请谅解!

 

二、Mapreduce整体的流程

  1.有一块200M的文本文件,首先将待处理的数据提交客户端;

  2.客户端会向Yarn平台提交切片信息,然后Yarn计算出所需要的maptask的数量为2;

  3.程序默认使用FileInputFormat的TextInputFormat方法将文件数据读到maptask;

  4.maptask运行业务逻辑,然后将数据通过InputOutputContext写入到环形缓冲区;

  5.环形缓冲区其实是内存开辟的一块空间,就是内存,当环形缓冲区内数据达到默认大小100M的80%时,发生溢写;

  6.溢写出的数据会进行多次的分区排序(shuffle机制,下一个随笔详细解释)

  7.分区排序后的数据块可以选择进行Combiner合并,然后写入本地磁盘;

  8.reducetask等maptask完全运行完毕后,开始从磁盘中读取maptask产出写出的数据,然后进行合并文件,归并排序(这时就是进行上面辅助排序的时候);

  9.Reducer一次读取一组数据,然后使用默认的TextOutputFormat方法将数据写出到结果文件。

 

转载于:https://www.cnblogs.com/HelloBigTable/p/10617937.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于游戏开发流程的分析

问题 传统游戏开发过程中通常是&#xff1a;策划提出需求&#xff0c;美术制作需求中的资源&#xff0c;程序实现需求中的功能&#xff0c;并导入资源实现最终效果。你觉得策划、美术、程序三者在开发游戏的过程中应该是一种什么关系&#xff0c;是否存在多种开发模式&#xf…

Ubuntu18.04应用程序安装集锦

整理网上的资源&#xff1a; Python Web开发工具箱 ubuntu美化及超NB的zsh配置 api文档查询工具&#xff1a;zeal&#xff0c;dash(收费)转载于:https://www.cnblogs.com/johnyhe/p/10403967.html

final使用详解

final的使用及注意事项 final是一个可以修饰变量&#xff0c;方法&#xff0c;类的修饰符 final修饰的方法不能被重写 final修饰的类不能被继承 final修饰的变量为一个常量 final不能与abstract一起使用 注意&#xff1a;当final修饰一个变量时要么在声明时就给该变量赋值&…

[读书笔记] 史玉柱自述:我的营销心得

与下属的关系 从玩家角度设定目标 目标感的设计 论随机性 在前15分钟留住玩家 实际观察玩家对于游戏的翻译反应 好游戏是改出来的 注重细节 决策民主、责任人制度 论简单与复杂的关系 游戏经济中的投放与回收 避免进入降低压力的怪圈 创业初期的股份分配 单个行业…

记一次面试腾讯的奇葩经历

阅读本文大概需要 2.8 分钟。 作者&#xff1a;黄小斜 文章来源&#xff1a;微信公众号【程序员江湖】 ​ 上回说到&#xff0c;我腾讯面试出师不利&#xff0c;简历随即进入备胎池&#xff0c;不过没过多久&#xff0c;转机还是来了。 大概是一周之后&#xff0c;我的电话响起…

foot

码云链接&#xff1a;https://gitee.com/zyyyyyyyyyyy/codes/rcfdzmin4a82v975pl1ko47 效果图&#xff1a; 原网站截图&#xff1a; 源代码&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title></title><s…

jsp标签在JavaScript中使用时,可能会出现的一个问题。

直接上代码 1 <script type"text/javascript">2 var E window.wangEditor;3 var editor new E(#editor);4 // 或者 var editor new E( document.getElementById(editor) )5 editor.create();6 $(function () {7 $("#btn1&…

CTF小记录

WEB 题目都说了flag在index里所以可以直接构造payloadhttp://120.24.86.145:8005/post/index.php?filephp://filter/convert.base64-encode/resourceindex.php F12 抓包 Base64 Hackbar post get 代码审计 暴力解法 Url编码 本地登录&#xff1a;X-Forwarded-For: 127.0.0…

关于梦想(二)

马丁.路德.金说过“如果你的梦想还站立的话&#xff0c;那么没有人能使你倒下”。 独自仰望夜空&#xff0c;从古至今&#xff0c;不知多少人面对着浩瀚的夜空&#xff0c;满天的繁星而放飞梦想&#xff0c;放飞希望、放飞未来。斑斓璀璨的星空又见证了多少伟大梦想的实现&…

C学习笔记-gdb

gdb即GNU debugger&#xff0c;用来调试程序 gdb使用前提 要使用gdb&#xff0c;则需要在编译源代码时候使用-g参数 gcc -g –o test test.c启动gdb gdb 程序名 [corefile]corefile是可选的&#xff0c;但能增强gdb的调试能力 Linux默认是不生成corefile的&#xff0c;所以需要…

移动开发day1_过渡_2d转换_3d立体

今天是就业班开班的第一天&#xff0c;上完了一天的课&#xff0c;做点总结。 什么叫做移动web 专门在手机或者 平板电脑 浏览器网页 为什么要学习移动web 工资高 1. 人拥有的手机数 大于 电脑的个数 2. 微信 1. 微信公众号  2. 微信小程序   3. 移动web基础知识 可以用在微…

java数组初始化

数组初始化式只能用于声明同时赋值的情况下 如果没有显式赋值&#xff0c;则系统自动赋默认值null Java的对象都是在堆上分配空间 ① String [ ] anew String[ ]{" "," "," " }; ②String [ ] a{" "," "," "…

原型模式和C++的拷贝构造函数有什么区别

都是基于个人理解&#xff0c;本文是为了帮助记忆。 相同点&#xff1a;原型模式和拷贝构造函数都是要产生对象的复制品。 不同点&#xff1a;原型模式实现的是一个clone接口&#xff0c;注意是接口&#xff0c;也就是基于多态的clone虚函数。也就是说原型模式能够通过基类指针…

Taro项目遇到的问题

1. https://taro-ui.aotu.io/#/docs/questions 请在Taro项目根目录找到 config/index.js 文件中的h5项&#xff0c;添加如下&#xff1a; h5: {...esnextModules: [taro-ui] } 2. 原则&#xff1a;少什么就装什么 少了 babel-plugin-transform-decorators-legacy &#xff0c;那…

JSP编译指令

page指令 page指令作用于整个JSP页面&#xff0c;其定义了与页面相关的一些属性&#xff0c;这些属性将被用于和JSP服务器进行通信。 page指令的语法如下&#xff1a; <% page属性1“属性值” 属性2“属性值”……%> 其XML形式为&#xff1a;<jsp:directive.page属性1…

WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法

WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 原文:WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法问题描述 今天发现如果我想在一个TextBlock弄一个右键菜单,并且使用Command绑定,结果发现默认菜单式不可用的. 问题原因…

Syntax error on tokens, delete these tokens

可能出现的错误&#xff1a; 弄错了引号括号之类造成&#xff1b; 在代码前过多空格&#xff0c;特别是对于那些黏贴来的代码&#xff1b;

1698 -Access denied for user 'root@xxxx'

grant all privileges on *.* to userlocalhost Identified by password WITH GRANT OPTION; grant all privileges on *.* to root% Identified by password WITH GRANT OPTION; 予任何主机访问数据的权限 3、MySQL>FLUSH PRIVILEGES修改生效 4、MySQL>EXIT 退出MySQL服…

严重: StandardServer.await: create[localhost:8005]

①看看任务管理器&#xff0c;是否打开了多个Tomcat程序 如果是&#xff0c;关闭其中一个 ②可能是端口冲突 1、将tomcat安装目录下的conf/server.xml中的8005端口号改为其它的端口号。&#xff08;不建议&#xff0c;因为会衍生出其他错误&#xff09; 2、将正在使用的8005端…