`

hadoop几种排序简介

 
阅读更多

在map reduce框架中,除了常用的分布式计算外,排序也算是比较重要的一环了。这形如sql查询中的排序数据一样重要。

 

 

一。无排序

当书写code 时,如果指定了mapred.reduce.tasks=0(same effect as setNumReduceTasks)。这样便达到目的。

产生的效果当然是只有一个part file,而且其中的entries是unorder.

 

 

二。默认排序(sort only in partition)

其实这也称”局部排序“。这种情况是产生若干个part files,并且各file内部是排序好的,但file之间没有内容排序之分。

 

 

三。全局排序

当你使用TotalOrderPartitioner来作partitioner时,便可以了(注意在mapreduce lib中已经删除了)。当然要更新 一下它的setPartitionFile(xx),以便它利用样本估算得出边界的几个参数(数量是reduces num - 1)。但通常会使用InputSampler.RandomSampler实现来取样。

具体的算法如下 :

/**
     * Randomize the split order, then take the specified number of keys from
     * each split sampled, where each key is selected with the specified
     * probability and possibly replaced by a subsequently selected key when
     * the quota of keys from that split is satisfied.
     */
public K[] getSample(InputFormat<K,V> inf, JobConf job) throws IOException {
      InputSplit[] splits = inf.getSplits(job, job.getNumMapTasks());
      ArrayList<K> samples = new ArrayList<K>(numSamples);
      int splitsToSample = Math.min(maxSplitsSampled, splits.length);  //取多少样本(splits)

      Random r = new Random();
      long seed = r.nextLong();
      r.setSeed(seed);
      LOG.debug("seed: " + seed);
      // shuffle splits;其实就 是随机交換splits达到混乱的效果显得更加均匀。
      for (int i = 0; i < splits.length; ++i) {
        InputSplit tmp = splits[i];
        int j = r.nextInt(splits.length);
        splits[i] = splits[j];
        splits[j] = tmp;
      }
      // our target rate is in terms of the maximum number of sample splits,
      // but we accept the possibility of sampling additional splits to hit
      // the target sample keyset
      for (int i = 0; i < splitsToSample ||
                     (i < splits.length && samples.size() < numSamples); ++i) {
        RecordReader<K,V> reader = inf.getRecordReader(splits[i], job,
            Reporter.NULL);
        K key = reader.createKey();
        V value = reader.createValue();
        while (reader.next(key, value)) {
          if (r.nextDouble() <= freq) {    // 概率要小于初始概率 
            if (samples.size() < numSamples) {  //未达到上限时直接添加样本
              samples.add(key);
            } else {
              // When exceeding the maximum number of samples, replace a
              // random element with this one, then adjust the frequency
              // to reflect the possibility of existing elements being
              // pushed out
              int ind = r.nextInt(numSamples); /// 否则更新某个样本元素
              if (ind != numSamples) {
                samples.set(ind, key);
              }
              freq *= (numSamples - 1) / (double) numSamples; //更新了之后降低后续更新概率,否则太频繁了。
            }
            key = reader.createKey();
          }
        }
        reader.close();
      }
      return (K[])samples.toArray();
    }
 

利用上述返回值,hadoop便 会得出此样本的比例情况。具体的算法我没有找到在哪里实现,但大概我认为是这样的:

1.利用当前100 / reduce num / 100来得出平均概率分布;

2.对样本进行排序

3.由低到高(相反也可以)逐个区间进行各种key占比例统计,当达到平均概率值(当然允许有偏差)时停止此区间的添加 ,并得到最大key作为第一个边界值 ;

4.同样道理处理其它keys

5.这样处理可能最后出现很多组边界值,所以得有一个优化算法再进一步筛选。

 

不过我尝试实现过,发现这种计算也是挺复杂 的,因为你不知道该什么时候结束;而且要记住不同情况下的边界值。

我认为hadoop也会设置一个offset值,并且限制优化次数。TODO 有空我会继续找源码看看。


 

四。分组(二次排序)

这个功用就类似于sql中的group by clause,就是对已经排序的数据再进一步key去重。

实现也是很简单的,过程大概是这样:

1.生成复合键;

之所以生成复合键,因为hadoop最終排序的是key而不是value.这个我有统计日志时就 过同样需求了。

即在通常的key后加入其它要grouping values。

 

2.利用复合键来排序;

这过程基本上是利用复合键中的所有参数进行,因为毕竟你最終目标是同key的只要一个(最大或最小 ,这是group特性)

当然你也要写个partitioner否则,原本相同key的去到不同的reduce中。

 

3.对复合键分组;

在这个Comparator中,要将过滤的条件写要里面即可。比如按照原key只要第一条数据:

return compsedKeyObject.key.compare(that.key)

这样在进入reduce前有相同的key便被过滤了。

 

 

另外,也有可能是三四组合,这样达到各part files之间有序,同时也达到了grouping的效果。

 

其实二次排序关键的是明白group来对key进行逻辑分组功能。

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    新版Hadoop视频教程 段海涛老师Hadoop八天完全攻克Hadoop视频教程 Hadoop开发

    07-MR程序的几种提交运行模式.avi 08-YARN的通用性意义.avi 09-yarn的job提交流程.avi 第四天 常见mr算法实现和shuffle的机制 01-复习.avi 02-hadoop中的序列化机制.avi 03-流量求和mr程序开发.avi 04-...

    hadoop段海涛老师八天实战视频

    07-MR程序的几种提交运行模式.avi 08-YARN的通用性意义.avi 09-yarn的job提交流程.avi 第四天 常见mr算法实现和shuffle的机制 01-复习.avi 02-hadoop中的序列化机制.avi 03-流量求和mr程序开发.avi 04-...

    基于Hadoop的排序性能优化研究

    首先对基于Hadoop平台的几种高效的排序算法(Quicksort,Heapsort和Mergesort算法)进行了研究。再通过对Hadoop平台的几种现有的排序算法的分析比较,发现频繁的读写磁盘降低数据处理的效率,提出了一种优化现有排序...

    最新Hadoop的面试题总结

    12、描述mapReduce有几种排序及排序发生的阶段 1)排序的分类: (1)部分排序: MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部排序。 (2)全排序: 如何用Hadoop产生一个全局排序的文件?最简单...

    Hadoop实战(第2版)

    join 7.3 本章小结8 结合R 和Hadoop 进行数据统计8.1 比较R 和MapReduce 集成的几种方法8.2 R 基础知识 8.3 R 和Streaming 8.3.1 Streaming 和map-only R 技术点57 计算股票日平均值8.3.2 Streaming...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    8.1 比较R 和MapReduce 集成的几种方法 8.2 R 基础知识 8.3 R 和Streaming 8.3.1 Streaming 和map-only R 技术点57 计算股票日平均值 8.3.2 Streaming、R 和完整的MapReduce 技术点58 计算股票的...

    大数据工作面试练习题 BAT大数据面试题 Hadoop、kafka、HDFS、Spark、MapReduce 共19页.pdf

    大数据工作面试练习题 2018最新BAT大数据面试题 Hadoop、kafka、HDFS、Spark、MapReduce 【内容大纲-共25道题目】 1、kafka的message包括...15、MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么? 11

    基于hadoop实现的评价预测系统+源代码+文档说明

    好评 通过 朋友 介绍 住 苏州 南林 饭店 一进 酒店 大堂 感觉 很 好 酒店 行李 员 前台 服务员 大堂 经理 很 热情 有种 宾至如归 感觉 房间 很 特色 背景 墙上 金色 字体 诗词 我 住 朝南 景观 房 感觉 真的 很 好 ...

    这就是搜索引擎

    Hadoop 系列和Google 的云计算框架是什么 关系? Goo剖e 的三驾马车GFS、BigTable、MapReduce 各自代表什么含义?是什么关系? • Google 的咖啡因系统的基本原理是什么? • Google 的Pregel 计算模型和MapReduce ...

    cloud-kepler:Cloud Kepler是启用了云的Kepler Planet搜索管道

    假设数组的排序是使代码更快的一种方法。 因此,如果要将数组传递给Cython,它应该是C连续的,否则会收到错误消息。 Cython输出共享对象(.so)文件,该文件已复制到Python目录中。 编译后,将其像.py文件一样对待...

    大数据到底是什么.doc

    现在我们可以通过几个基本要素来衡量一下大数据技术,这就是——流处理、并行性 、摘要索引和可视化。 大数据技术涵盖哪些内容? 一、流处理 伴随着业务发展的步调,以及业务流程的复杂化,我们的注意力越来越集中在...

    BI与大数据区别.docx

    而且不再有人机交互那么好的客户端了,至少要懂流处理、HADOOP、列式或分布式键值数据库吧,还需要能在SPARK上开发算法程序,对于用户画像、产品标签化、推荐系统、排序算法都应有所理解。 因此,大数据相对于传统BI...

Global site tag (gtag.js) - Google Analytics