`
flyingdutchman
  • 浏览: 357057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hadoop中的快速排序算法

阅读更多
        在Hadoop中,排序是MapReduce框架中最重要的操作之一,Map Task和Reduce Task都会对数据按照key排序,不管逻辑上是否真的需要排序,任何程序中的数据都会被排序,这是Hadoop的默认行为。
        MapReduce中使用了两种排序算法:快速排序和优先队列。在Map和Reduce Task的缓冲区使用的是快速排序,而对磁盘上的IFile文件合并使用的是优先队列。
        在学习Hadoop中实现的快速排序之前,我们先来回顾一下之前的三篇文章快速排序及改进取中位数的算法三向切分的快速排序算法:有大量重复元素的快速排序,MapReduce中使用的快速排序在经典的快速排序之上进行了一些列的优化,具体优化处理如下:
        1)、由于快速排序的分割基数(基数左边的数都不大于该基数,而右边的都不小于该基数)选择的好坏直接影响快速排序的性能,最坏的情况是划分过程中是中产生两个极端不对称称的子序列——一个长度为1而另一个长度为n-1,此时有最坏的时间复杂度O(N^2),为了减小出现划分严重不对称的可能性,Hadoop将序列的守卫和中间元素中的中位数作为选择的分割基数;
        2)、子序列的划分方法,Hadoop使用了两个索引i和j分别从左右两端进行扫描,并让索引i扫描到大于等于分割基数为止,索引j扫描到小于等于分割基数为止,然后交换两个元素,重复这个过程直到两个索引相遇;
        3)、对相同的元素的优化,在每次划分子序列时,将于分割基数相同的元素放在中间位置,让他不再参与后续的递归处理,即将序列划分为三部分:小于分割基数、等于分割基数和大于分割基数;
        4)、当子序列中元素数小于13时,直接使用插入排序算法,不在递归。
        对于这四种处理,再对照之前我们学过的《快速排序及改进》、《取中位数的算法》和《三向切分的快速排序算法:有大量重复元素的快速排序》,看看都用到了那些知识?
        具体实现代码如下:
 /*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hadoop.util;

/**
 * An implementation of the core algorithm of QuickSort.
 */
public final class QuickSort implements IndexedSorter {

  private static final IndexedSorter alt = new HeapSort();

  public QuickSort() { }

  private static void fix(IndexedSortable s, int p, int r) {
    if (s.compare(p, r) > 0) {
      s.swap(p, r);
    }
  }

  /**
   * Deepest recursion before giving up and doing a heapsort.
   * Returns 2 * ceil(log(n)).
   */
  protected static int getMaxDepth(int x) {
    if (x <= 0)
      throw new IllegalArgumentException("Undefined for " + x);
    return (32 - Integer.numberOfLeadingZeros(x - 1)) << 2;
  }

  /**
   * Sort the given range of items using quick sort.
   * {@inheritDoc} If the recursion depth falls below {@link #getMaxDepth},
   * then switch to {@link HeapSort}.
   */
  public void sort(IndexedSortable s, int p, int r) {
    sort(s, p, r, null);
  }

  /**
   * {@inheritDoc}
   */
  public void sort(final IndexedSortable s, int p, int r,
      final Progressable rep) {
    sortInternal(s, p, r, rep, getMaxDepth(r - p));
  }

  private static void sortInternal(final IndexedSortable s, int p, int r,
      final Progressable rep, int depth) {
    if (null != rep) {
      rep.progress();
    }
    while (true) {
    if (r-p < 13) {
      for (int i = p; i < r; ++i) {
        for (int j = i; j > p && s.compare(j-1, j) > 0; --j) {
          s.swap(j, j-1);
        }
      }
      return;
    }
    if (--depth < 0) {
      // give up
      alt.sort(s, p, r, rep);
      return;
    }

    // select, move pivot into first position
    fix(s, (p+r) >>> 1, p);
    fix(s, (p+r) >>> 1, r - 1);
    fix(s, p, r-1);

    // Divide
    int i = p;
    int j = r;
    int ll = p;
    int rr = r;
    int cr;
    while(true) {
      while (++i < j) {
        if ((cr = s.compare(i, p)) > 0) break;
        if (0 == cr && ++ll != i) {
          s.swap(ll, i);
        }
      }
      while (--j > i) {
        if ((cr = s.compare(p, j)) > 0) break;
        if (0 == cr && --rr != j) {
          s.swap(rr, j);
        }
      }
      if (i < j) s.swap(i, j);
      else break;
    }
    j = i;
    // swap pivot- and all eq values- into position
    while (ll >= p) {
      s.swap(ll--, --i);
    }
    while (rr < r) {
      s.swap(rr++, j++);
    }

    // Conquer
    // Recurse on smaller interval first to keep stack shallow
    assert i != j;
    if (i - p < r - j) {
      sortInternal(s, p, i, rep, depth);
      p = j;
    } else {
      sortInternal(s, j, r, rep, depth);
      r = i;
    }
    }
  }

}

       
分享到:
评论
1 楼 lawlietwf 2014-11-04  
三篇文章中有两篇链接地址一样,po主看下

相关推荐

    基于Hadoop大数据平台实现遗传算法并行化

    Hadoop的并行环境使得在大数据集上进行非支配排序成为可能,通过分布式计算可以快速找出不同代的帕累托前沿,进而指导种群向更好的解空间移动。 在Hadoop平台上实现遗传算法并行化,还需要考虑数据通信和协调问题。...

    数据算法(Hadoop与Spark)_ORellly出版

    例如,MapReduce可以用于实现分布式排序,如归并排序和快速排序;Spark则提供了MLlib库,支持各种机器学习算法,如线性回归、决策树、随机森林和神经网络等。这些算法在数据分析和预测建模中具有广泛应用。 书中还...

    Hadoop之外卖订单数据分析系统

    在这个外卖订单分析系统中,MapReduce负责将订单数据进行拆分、映射和排序,而Reduce阶段则对映射后的数据进行聚合,提取关键信息。 在Hadoop平台上,我们通常会使用Hive或Pig这样的数据仓库工具进行数据预处理和...

    基于hadoop 用户行为分析

    4. **优化搜索算法**:根据行为模式分析的结果,调整搜索算法中的权重分配,优化搜索结果的排序策略,使得搜索结果更加符合用户的期望。 #### 实验验证 文中提到,该模型被应用于分析了某搜索引擎一个月内的大约...

    hadoop 64位 本地库

    3. **MapReduce Native Libraries**:这些库提高了MapReduce任务的执行效率,例如,通过使用本地排序和合并算法来减少Java虚拟机(JVM)的开销。 4. **Avro Native**:Avro是Hadoop生态系统中的一个数据序列化系统...

    hadoop map-reduce turorial

    对于初次使用者,推荐参考Hadoop快速入门指南;对于大型分布式集群环境,则需查阅Hadoop集群设置文档,以确保系统能够高效稳定地运行Map-Reduce任务。 #### 概览 Hadoop Map-Reduce将输入数据集分割成独立的块,...

    Hadoop对文本文件的快速全局排序实现方法及分析

    Hadoop是一个开源框架,它允许在分布式环境中存储大量数据,并通过MapReduce模型运行并行运算。...通过上面介绍的几种方法,可以有效地对Hadoop中的Text文件进行快速全局排序,满足不同场景下的需求。

    hadoop经典实战教程

    - **Hadoop生态系统**:除了HDFS和MapReduce之外,Hadoop生态还包括其他许多组件,如Hive(用于数据仓库)、Pig(用于数据分析)、Spark(用于快速数据处理)、HBase(用于非关系型数据库)等。 #### 二、HDFS深入...

    hadoop技术

    Hadoop是一个广泛使用的开源分布式存储和计算平台,它由...书中内容注重实战,强调了理论与实践相结合,旨在帮助读者快速掌握Hadoop及其生态圈的使用方法,并能够应用于实际工作中,快速成为大数据行业的专业人才。

    hadoop打造一个搜索引擎

    5. **结果排序**:介绍如何根据相关性对搜索结果进行排序,可能涉及TF-IDF、PageRank等算法的Hadoop实现。 总之,"hadoop打造一个搜索引擎"这一主题涵盖了大数据处理和信息检索的结合,涉及到Hadoop的分布式存储和...

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

    再通过对Hadoop平台的几种现有的排序算法的分析比较,发现频繁的读写磁盘降低数据处理的效率,提出了一种优化现有排序算法的置换选择算法,并进行了测试。测试结果表明,该算法简化了运行过程,可实现更快速的合并,...

    spark 数据算法 Hadoop/Spark大数据处理技巧(Data Algorithms)

    例如,快速排序、归并排序在大数据环境下的实现,K-means聚类算法、决策树、随机森林等机器学习算法的应用。这些算法的介绍结合实际案例,让读者能直观地了解算法在大数据场景下的运用和优化。 另外,书中还可能...

    Hadoop海量数据处理

    4. **Hadoop生态组件**: Hadoop生态系统包括众多项目如HBase(分布式NoSQL数据库)、Hive(数据仓库工具)、Pig(高级数据流语言)、Spark(快速通用的大数据处理引擎)等,它们共同扩展了Hadoop的功能。 **Hadoop...

    TeraByte Sort on Apache Hadoop

    《TeraByte Sort on Apache Hadoop》是由Yahoo公司的Owen O’Malley撰写的一篇关于Hadoop基准测试方法的论文,该论文详细介绍了一种用于Hadoop平台的大规模数据排序算法——TeraByte Sort。这一基准测试方法因其高效...

    数据算法 Hadoop Spark大数据处理技巧

    它不仅涉及基础的数据结构(如数组、链表等),还包括更复杂的算法(如排序算法、搜索算法)以及高级的数据处理技术(如机器学习算法)。 #### 二、Hadoop简介 Hadoop是一个开源软件框架,用于分布式存储和处理大...

    Hadoop就业面试宝典

    - 数据挖掘是利用各种算法和技术从大量数据中提取有用信息的过程。 - 常用技术包括统计分析、机器学习、模式识别等。 6. **Spark与MapReduce的区别**: - **数据存储**: Spark利用内存缓存机制,而MapReduce通常...

Global site tag (gtag.js) - Google Analytics