- 浏览: 359068 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
希恩杰:
采样器的目的是啥?使数据均匀分布到所有分区?使key的数量均匀 ...
Hadoop深入学习:Hadoop全排序中的Sampler采样器 -
lawlietwf:
三篇文章中有两篇链接地址一样,po主看下
Hadoop中的快速排序算法 -
坏小四:
...
《Hbase权威指南》深入学习hbase:表,列族,列标识,版本和cell -
fbwfbi:
发现使用pika-0.9.13的版本依然出错:Tracebac ...
RabbitMQ:使用python发布/订阅消息 -
hehu158:
centos6.5 chmod +x qq2012.tra.g ...
CentOS 6.4安装qq2012
在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时,直接使用插入排序算法,不在递归。
对于这四种处理,再对照之前我们学过的《快速排序及改进》、《取中位数的算法》和《三向切分的快速排序算法:有大量重复元素的快速排序》,看看都用到了那些知识?
具体实现代码如下:
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; } } } }
发表评论
-
CentOS 6.4 hadoop集成 Hbase Hive
2013-07-10 00:05 2361在之前的CentOS 5.4 hadoop集 ... -
CentOS 6.4 hadoop集成 Hbase Zookeeper
2013-07-09 22:41 2537再上一章中我们已经学习了Hadoop-1.0. ... -
CentOS 6.4 hadoop集成Hive
2013-07-09 01:58 2425在本节中,我们来学习如何安装Hive。在之前我 ... -
Hadoop深入学习:MapReduce Job中的Shuffle和sort
2013-07-06 22:30 1488... -
Hadoop深入学习:解析HDFS的写文件流程
2013-07-06 16:43 7316之前,我们 ... -
Hadoop深入学习:再谈MapReduce作业提交和执行
2013-07-03 22:00 2040在本章中,我们将来重温一下和Hadoop的作业 ... -
CentOS 6.4 安装伪分布式Hadoop 1.0.3
2013-07-02 00:52 2386在本章中学习如何在CentOS 6.4上安装配 ... -
Hadoop深入学习:Combiner
2013-07-04 00:03 10648在本节中,我们着重学习MapReduce编程模 ... -
Hadoop深入学习:MapReduce的Shuffle过程详解
2013-05-29 22:11 5196在本节中,我们再来仔细回顾一下MapRedu ... -
Hadoop深入学习:Hadoop全排序中的Sampler采样器
2013-05-28 18:27 4230在Partitioner组件的设计与实现中,我 ... -
Hadoop深入学习:ReduceTask详解
2013-05-28 16:16 1544本节我们来着重学习ReduceTask的内部操 ... -
Hadoop深入学习:MapTask详解
2013-05-28 15:23 4577在本节中 ... -
Hadoop深入学习:MapReduce中的心跳机制
2013-05-28 13:13 3235在本节中,我们特别来学习一些有心跳(Heart ... -
Hadoop深入学习:MapReduce作业提交和初始化
2013-05-27 22:24 4524之前已经学过了MapReduce接口编程模型及 ... -
Hadoop深入学习:OutputFormat组件
2013-05-27 16:45 2630在本节中,我们着重来学习一下MapReduc ... -
Hadoop深入学习:Reduce组件详解
2013-05-27 15:59 1459在本节中我们主要来学习MapReduce编程接 ... -
Hadoop深入学习:Partitioner组件的设计与实现
2013-05-27 15:31 3443本节我们来学习MapReduce编程框架中的P ... -
Hadoop深入学习:Mapper组件详解
2013-05-26 22:29 2224本节我们主要学习MapReduce编程接口模型 ... -
Hadoop深入学习:InputFormat组件
2013-05-26 22:26 8535在本节里, ... -
Hadoop深入学习:MapReduce的序列化
2013-05-26 20:27 2143在学习MapReduce ...
相关推荐
Hadoop的并行环境使得在大数据集上进行非支配排序成为可能,通过分布式计算可以快速找出不同代的帕累托前沿,进而指导种群向更好的解空间移动。 在Hadoop平台上实现遗传算法并行化,还需要考虑数据通信和协调问题。...
例如,MapReduce可以用于实现分布式排序,如归并排序和快速排序;Spark则提供了MLlib库,支持各种机器学习算法,如线性回归、决策树、随机森林和神经网络等。这些算法在数据分析和预测建模中具有广泛应用。 书中还...
在这个外卖订单分析系统中,MapReduce负责将订单数据进行拆分、映射和排序,而Reduce阶段则对映射后的数据进行聚合,提取关键信息。 在Hadoop平台上,我们通常会使用Hive或Pig这样的数据仓库工具进行数据预处理和...
这个过程中包括了数据分区、排序、合并等步骤,对于提高MapReduce任务的执行效率至关重要。 - **海量数据存储和计算平台的调试器研究**:针对Hadoop平台的特殊性,开发专门的调试工具对于提升开发效率非常有帮助。...
3. **MapReduce Native Libraries**:这些库提高了MapReduce任务的执行效率,例如,通过使用本地排序和合并算法来减少Java虚拟机(JVM)的开销。 4. **Avro Native**:Avro是Hadoop生态系统中的一个数据序列化系统...
对于初次使用者,推荐参考Hadoop快速入门指南;对于大型分布式集群环境,则需查阅Hadoop集群设置文档,以确保系统能够高效稳定地运行Map-Reduce任务。 #### 概览 Hadoop Map-Reduce将输入数据集分割成独立的块,...
Hadoop是一个开源框架,它允许在分布式环境中存储大量数据,并通过MapReduce模型运行并行运算。...通过上面介绍的几种方法,可以有效地对Hadoop中的Text文件进行快速全局排序,满足不同场景下的需求。
- **Hadoop生态系统**:除了HDFS和MapReduce之外,Hadoop生态还包括其他许多组件,如Hive(用于数据仓库)、Pig(用于数据分析)、Spark(用于快速数据处理)、HBase(用于非关系型数据库)等。 #### 二、HDFS深入...
Hadoop是一个广泛使用的开源分布式存储和计算平台,它由...书中内容注重实战,强调了理论与实践相结合,旨在帮助读者快速掌握Hadoop及其生态圈的使用方法,并能够应用于实际工作中,快速成为大数据行业的专业人才。
5. **结果排序**:介绍如何根据相关性对搜索结果进行排序,可能涉及TF-IDF、PageRank等算法的Hadoop实现。 总之,"hadoop打造一个搜索引擎"这一主题涵盖了大数据处理和信息检索的结合,涉及到Hadoop的分布式存储和...
再通过对Hadoop平台的几种现有的排序算法的分析比较,发现频繁的读写磁盘降低数据处理的效率,提出了一种优化现有排序算法的置换选择算法,并进行了测试。测试结果表明,该算法简化了运行过程,可实现更快速的合并,...
例如,快速排序、归并排序在大数据环境下的实现,K-means聚类算法、决策树、随机森林等机器学习算法的应用。这些算法的介绍结合实际案例,让读者能直观地了解算法在大数据场景下的运用和优化。 另外,书中还可能...
4. **Hadoop生态组件**: Hadoop生态系统包括众多项目如HBase(分布式NoSQL数据库)、Hive(数据仓库工具)、Pig(高级数据流语言)、Spark(快速通用的大数据处理引擎)等,它们共同扩展了Hadoop的功能。 **Hadoop...
《TeraByte Sort on Apache Hadoop》是由Yahoo公司的Owen O’Malley撰写的一篇关于Hadoop基准测试方法的论文,该论文详细介绍了一种用于Hadoop平台的大规模数据排序算法——TeraByte Sort。这一基准测试方法因其高效...
它不仅涉及基础的数据结构(如数组、链表等),还包括更复杂的算法(如排序算法、搜索算法)以及高级的数据处理技术(如机器学习算法)。 #### 二、Hadoop简介 Hadoop是一个开源软件框架,用于分布式存储和处理大...
- 数据挖掘是利用各种算法和技术从大量数据中提取有用信息的过程。 - 常用技术包括统计分析、机器学习、模式识别等。 6. **Spark与MapReduce的区别**: - **数据存储**: Spark利用内存缓存机制,而MapReduce通常...