当前位置: 首页 > news >正文

产品设计排版网站怎样建立企业网站

产品设计排版网站,怎样建立企业网站,肇庆seo公司咨询23火星,松原做招聘的网站有哪些文章目录 #xff08;99#xff09;WritableComparable排序什么是排序什么时候需要排序排序有哪些分类如何实现自定义排序 #xff08;100#xff09;全排序案例案例需求思路分析实际代码 #xff08;101#xff09;二次排序案例#xff08;102#xff09; 区内排序案例… 文章目录 99WritableComparable排序什么是排序什么时候需要排序排序有哪些分类如何实现自定义排序 100全排序案例案例需求思路分析实际代码 101二次排序案例102 区内排序案例参考文献 99WritableComparable排序 什么是排序 排序是MR中最重要的操作之一也是面试中可能被问到的重点。 MapTask和ReduceTask中都会对数据按照KEY来排序主要是为了效率排完序之后相同key值的数据会被放在一起更方便下一步如Reducer()的汇总处理。 默认排序是按照字典顺序字母由小到大或者是数字由小到大排序且实现该排序的方法是快速排序。 什么时候需要排序 MR的过程中什么时候用到了排序呢 Map阶段 环形缓冲区溢写到磁盘之前会将每个分区内数据分别进行一个快排这个排序是在内存中完成的对key的索引按照字典顺序排列环形缓冲区多轮溢写完毕后会形成一堆文件这时候会对这些文件做merge归并排序我理解是单个MapTask最终会汇总形成一个文件 Reduce阶段 ReduceTask会主动拉取MapTask们的输出文件理论上是会优先保存到内存里但是往往内存里放不下所以多数情况下会直接溢写到磁盘于是我们会得到多个文件。当文件数量超过阈值之后需要做归并排序合并成一个大文件。如果是内存中的数据超过阈值则会进行一次合并后将数据溢写到磁盘。当所有数据拷贝完后ReduceTask会统一对内存和磁盘上的所有数据进行一次归并排序。文件合并后其实还可以进行一个分组排序过于复杂这里就不介绍了。 排序有哪些分类 MR里的排序还有部分排序、全排序、辅助排序、二次排序的不同说法注意它们之间不是像那种传统的排序算法之间的区别只是当排序在不同场景的时候分别起了个名字。 MapReduce根据输入记录的键对数据集排序保证输出的每个文件内部是有序的这就是部分排序。 最终输出结果只有一个文件且文件内部有序。这就是全排序。 全排序的实现方式是只设置一个ReduceTask。但是这种方式在处理大型文件时效率很低很低因为一台机器处理全部数据完全没有利用MR所提供的并行架构的优势生产环境上完全不适用。 所以生产环境里常用的还是部分排序。 辅助排序就是GroupingComparator分组。 这个似乎是可选的是在Reduce阶段Reducer在从Map阶段主动拉取完数据后会对所有文件做一次归并排序。做完归并排序之后理论上就可以进行辅助排序。 辅助排序有啥用呢就是当接收到的Key是个bean对象时辅助排序可以让一个或者几个字段相同的key全部字段不相同进入同一个Reduce()所以也起名叫做分组排序。 二次排序比较简单在自定义排序过程中如果compareTo中的判断条件为两个那它就是二次排序。 如何实现自定义排序 说到这里那 如何实现自定义排序 呢 如果是bean对象作为key传输那需要实现WritableComparable接口重写compareTo方法就可以实现自定义排序。 Override public int compareTo(FlowBean bean) {int result;// 按照总流量大小倒序排列if (this.sumFlow bean.getSumFlow()) {result -1;}else if (this.sumFlow bean.getSumFlow()) {result 1;}else {result 0;}return result; }100全排序案例 案例需求 之前我们做过一个案例输入文件有一个里面放的是每个手机号的上行流量和下行流量输出同样是一个文件里面放的除了手机号的上行流量和下行流量之外还多了一行总流量。 这时候我们提一个新需求就是我不止要这个输出文件我还要这个文件里的内容按照总流量降序排列。 思路分析 MapReduce里只能对Key进行排序。在先前的需求里我们是用手机号作为key上行流量、下行流量和总流量组成一个bean作为value这样的安排显然不适合新需求。 因此我们需要改变一下将上行流量、下行流量和总流量组成的bean作为key而将手机号作为value如此来排序。 所以第一步我们需要对我们自定义的FlowBean对象声明WritableComparable接口并重写CompareTo方法这一步的目的是使得FlowBean可进行算数比较从而允许排序 Override public int CompareTo(FlowBean o){// 按照总流量降序排列return this.sumFlow o.getSumFlow()?-1:1; }注意这里因为Hadoop里默认的字典排序是从小到大排序如果想实现案例里由大到小的排序那么当大于的时候就要返回-1从而将大的值排在前面。 其次Mapper类里 context.write(bean, 手机号)bean成了key手机号成了value。 最后Reduce类里需要循环输出避免出现总流量相同的情况。 for (Text text: values){context.write(text, key); // 注意顺序原先的key放在value位置 }2023-7-19 11:16:04 这里没懂。。。 哦哦明白了什么样的数据会进一个Reducer呢当然是key 值相同的会进同一个又因为我们之前compareTo的时候用的是总流量所以最后是总流量相同的记录会送进同一个Reducer然后汇总成一条记录做输出毕竟reducer就是用来做汇总的。 但汇总成一条记录这并不是我们想要的我们需要的是把这些数据原模原样输出来。这就是为什么我们在Reducer的reduce()里面要加上循环输出的原因。 实际代码 贴一下教程里的代码实现 首先是FlowBean对象需要声明WritableComparable接口并重写CompareTo() package com.atguigu.mapreduce.writablecompable;import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException;public class FlowBean implements WritableComparableFlowBean {private long upFlow; //上行流量private long downFlow; //下行流量private long sumFlow; //总流量//提供无参构造public FlowBean() {}//生成三个属性的getter和setter方法public long getUpFlow() {return upFlow;}public void setUpFlow(long upFlow) {this.upFlow upFlow;}public long getDownFlow() {return downFlow;}public void setDownFlow(long downFlow) {this.downFlow downFlow;}public long getSumFlow() {return sumFlow;}public void setSumFlow(long sumFlow) {this.sumFlow sumFlow;}public void setSumFlow() {this.sumFlow this.upFlow this.downFlow;}//实现序列化和反序列化方法,注意顺序一定要一致Overridepublic void write(DataOutput out) throws IOException {out.writeLong(this.upFlow);out.writeLong(this.downFlow);out.writeLong(this.sumFlow);}Overridepublic void readFields(DataInput in) throws IOException {this.upFlow in.readLong();this.downFlow in.readLong();this.sumFlow in.readLong();}//重写ToString,最后要输出FlowBeanOverridepublic String toString() {return upFlow \t downFlow \t sumFlow;}Overridepublic int compareTo(FlowBean o) {//按照总流量比较,倒序排列if(this.sumFlow o.sumFlow){return -1;}else if(this.sumFlow o.sumFlow){return 1;}else {return 0;}} }然后编写Mapper类 package com.atguigu.mapreduce.writablecompable;import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException;public class FlowMapper extends MapperLongWritable, Text, FlowBean, Text {private FlowBean outK new FlowBean();private Text outV new Text();Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//1 获取一行数据String line value.toString();//2 按照\t,切割数据String[] split line.split(\t);//3 封装outK outVoutK.setUpFlow(Long.parseLong(split[1]));outK.setDownFlow(Long.parseLong(split[2]));outK.setSumFlow();outV.set(split[0]);//4 写出outK outVcontext.write(outK,outV);} }然后编写Reducer类 package com.atguigu.mapreduce.writablecompable;import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException;public class FlowReducer extends ReducerFlowBean, Text, Text, FlowBean {Overrideprotected void reduce(FlowBean key, IterableText values, Context context) throws IOException, InterruptedException {//遍历values集合,循环写出,避免总流量相同的情况for (Text value : values) {//调换KV位置,反向写出context.write(value,key);}} }最后编写驱动类 package com.atguigu.mapreduce.writablecompable;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; 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 FlowDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//1 获取job对象Configuration conf new Configuration();Job job Job.getInstance(conf);//2 关联本Driver类job.setJarByClass(FlowDriver.class);//3 关联Mapper和Reducerjob.setMapperClass(FlowMapper.class);job.setReducerClass(FlowReducer.class);//4 设置Map端输出数据的KV类型job.setMapOutputKeyClass(FlowBean.class);job.setMapOutputValueClass(Text.class);//5 设置程序最终输出的KV类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//6 设置输入输出路径FileInputFormat.setInputPaths(job, new Path(D:\\inputflow2));FileOutputFormat.setOutputPath(job, new Path(D:\\comparout));//7 提交Jobboolean b job.waitForCompletion(true);System.exit(b ? 0 : 1);} }完成仅做了解即可。 101二次排序案例 二次排序的概念很简单其实之前提过了就是在自定义排序的时候判断条件有两个。 比如说原先我对一堆人排序是按照身高从高到低排但是身高一样的就没法排序了这时候我可以再加入一个判断条件比如说如果身高一样的话就按体重排序。 具体就是修改FlowBean的CompareTo方法在第一条件相等的时候添加第二判定条件。 public int compareTo(FlowBean o) {//按照总流量比较,倒序排列if(this.sumFlow o.sumFlow){return -1;}else if(this.sumFlow o.sumFlow){return 1;}else {if (this.upFlow o.upFlow){return 1;} else if (this.upFlow o.upFlow){return -1;}else {return 0;}} }如果有需要的话还可以继续加第三判定条件。 102 区内排序案例 还是之前的手机号案例之前我们想要的是只有一个文件然后文件内所有数据按照总流量降序排列。 现在我们提出一个新要求按照前3位来分区输出比如说136的在一个文件里137的在一个文件里以此类推。而且每个文件内部还需要按照总流量降序排列。 本质上就是之前说的分区 排序这两部分的结合。需要额外定义好Partitioner类。 贴一下教程里的代码示例其实只需要在上一小节的基础上补充自定义分区类即可 首先自定义好分区类 package com.atguigu.mapreduce.partitionercompable;import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Partitioner;public class ProvincePartitioner2 extends PartitionerFlowBean, Text {Overridepublic int getPartition(FlowBean flowBean, Text text, int numPartitions) {//获取手机号前三位String phone text.toString();String prePhone phone.substring(0, 3);//定义一个分区号变量partition,根据prePhone设置分区号int partition;if(136.equals(prePhone)){partition 0;}else if(137.equals(prePhone)){partition 1;}else if(138.equals(prePhone)){partition 2;}else if(139.equals(prePhone)){partition 3;}else {partition 4;}//最后返回分区号partitionreturn partition;} }然后在驱动类里注册好分区器 // 设置自定义分区器 job.setPartitionerClass(ProvincePartitioner2.class);// 设置对应的ReduceTask的个数 job.setNumReduceTasks(5);其他跟上一小节保持一致即可。 参考文献 【尚硅谷大数据Hadoop教程hadoop3.x搭建到集群调优百万播放】
http://www.dnsts.com.cn/news/121921.html

相关文章:

  • 相册管理网站模板下载失败wordpress 读写分离
  • 新网站建设代理商行列资讯工程造价信息网
  • 什么网站做英语翻译练习廊坊建设部网站
  • 菜鸟式网站建设图书angular wordpress
  • 创立外包网站企业网站制作公司合肥
  • zencart 网站怎样设置自己的网站
  • 网站怎么做支付接口检查网站打开速度
  • 网站开发部门工作职责百度在线下载
  • wap网站推广方法wordpress数据库排序规则
  • 自主设计和创建网站建设云购网站
  • 国外教程 网站长沙房产交易中心官网
  • 国内有wix做的好的网站网上做中考题的网站
  • 网站 需求分析招聘广告模板
  • 上海响应式网站营销加盟网站建设
  • 网站内容包括哪些吴江区建设工程招标网站
  • 免费企业网站建设要求商城网站建设公司招聘
  • 寻找合肥网站建设免费活动策划方案的网站
  • 中国建设教育协会网站查询传奇小程序源码
  • 网站建设项目方案模板墙绘做网站推广有作用没
  • 邵阳市住房和城乡建设局网站wordpress首页标题修改
  • 建官网个人网站wordpress公众号推送
  • 现在什么省网站备案最快网站公司制作网站有何优势
  • 公司网站维护费大概需要多少网页设计素材包
  • 联想粒子云可以做网站福田专门做网站推广公司
  • 云网站7china做公司网站要提供什么
  • 广州市建设工程交易中心网站网页设计一个多少工资
  • 太仓市住房和城乡建设局规网站白嫖云服务器
  • 地下彩票网站建设编程培训班学费是多少
  • 现在网站优化wordpress 消耗 资源
  • 萧县城乡建设局网站logo图案素材免费网站