全排序
Hive的排序关键字是SORT BY,它有意区别于传统数据库的ORDER BY也是为了强调两者的区别–SORT BY只能在单机范围内排序。考虑以下表定义:
CREATE TABLE if not exists t_order( id int, -- 订单编号 sale_id int, -- 销售ID customer_id int, --客户ID product _id int, -- 产品ID amount int -- 数量 ) PARTITIONED BY (ds STRING);
在表中查询所有销售记录,并按照销售ID和数量排序:
set mapred.reduce.tasks=2; Select sale_id, amount from t_order Sort by sale_id, amount;
这一查询可能得到非期望的排序。指定的2个reducer分发到的数据可能是(各自排序):
Reducer1:
Sale_id | amount 0 | 100 1 | 30 1 | 50 2 | 20
Reducer2:
Sale_id | amount 0 | 110 0 | 120 3 | 50 4 | 20
因为上述查询没有reduce key,hive会生成随机数作为reduce key。这样的话输入记录也随机地被分发到不同reducer机器上去了。为了保证reducer之间没有重复的sale_id记录,可以使用DISTRIBUTE BY关键字指定分发key为sale_id。改造后的HQL如下:
set mapred.reduce.tasks=2; Select sale_id, amount from t_order Distribute by sale_id Sort by sale_id, amount;
这样能够保证查询的销售记录集合中,销售ID对应的数量是正确排序的,但是销售ID不能正确排序,原因是hive使用hadoop默认的HashPartitioner分发数据。
这就涉及到一个全排序的问题。解决的办法无外乎两种:
1.) 不分发数据,使用单个reducer:
set mapred.reduce.tasks=1;
这一方法的缺陷在于reduce端成为了性能瓶颈,而且在数据量大的情况下一般都无法得到结果。但是实践中这仍然是最常用的方法,原因是通常排序的查询是为了得到排名靠前的若干结果,因此可以用limit子句大大减少数据量。使用limit n后,传输到reduce端(单机)的数据记录数就减少到n* (map个数)。
2.) 修改Partitioner,这种方法可以做到全排序。这里可以使用Hadoop自带的TotalOrderPartitioner(来自于Yahoo!的TeraSort项目),这是一个为了支持跨reducer分发有序数据开发的Partitioner,它需要一个SequenceFile格式的文件指定分发的数据区间。如果我们已经生成了这一文件(存储在/tmp/range_key_list,分成100个reducer),可以将上述查询改写为
set mapred.reduce.tasks=100; set hive.mapred.partitioner=org.apache.hadoop.mapred.lib.TotalOrderPartitioner; set total.order.partitioner.path=/tmp/ range_key_list; Select sale_id, amount from t_order Cluster by sale_id Sort by amount;
有很多种方法生成这一区间文件(例如hadoop自带的o.a.h.mapreduce.lib.partition.InputSampler工具)。这里介绍用Hive生成的方法,例如有一个按id有序的t_sale表:
CREATE TABLE if not exists t_sale ( id int, name string, loc string );
则生成按sale_id分发的区间文件的方法是:
create external table range_keys(sale_id int) row format serde'org.apache.hadoop.hive.serde2.binarysortable.BinarySortableSerDe' stored as inputformat'org.apache.hadoop.mapred.TextInputFormat' outputformat'org.apache.hadoop.hive.ql.io.HiveNullValueSequenceFileOutputFormat' location '/tmp/range_key_list'; insert overwrite table range_keys select distinct sale_id from source t_sale sampletable(BUCKET 100 OUT OF 100 ON rand()) s sort by sale_id;
生成的文件(/tmp/range_key_list目录下)可以让TotalOrderPartitioner按sale_id有序地分发reduce处理的数据。区间文件需要考虑的主要问题是数据分发的均衡性,这有赖于对数据深入的理解。
测试案例:
数据 140g, 按照字段time 降序排列 选出最大的前50个。
使用 一般方法 select * from table order by time desc limit 50. 执行了1小时6分钟完全算出。
任务数1个 map数 1783 reduce 1
而 select * from (select * from table distribute by time sort by time desc limit 50 ) t order by time desc limit 50;
需要5分钟算出。结果一致。
任务数2个 分别是:
map 1783 reduce 245
map 245 reduce 1
相关推荐
标题中的“Hadoop排序”指的是Hadoop框架中的MapReduce排序机制。MapReduce是Apache Hadoop的核心组件,主要用于处理和生成大规模数据集。在Hadoop中,数据被分割成多个块,然后并行处理,其中排序是一个关键步骤,...
再通过对Hadoop平台的几种现有的排序算法的分析比较,发现频繁的读写磁盘降低数据处理的效率,提出了一种优化现有排序算法的置换选择算法,并进行了测试。测试结果表明,该算法简化了运行过程,可实现更快速的合并,...
【尚硅谷大数据技术之Hadoop(MapReduce)1】深入解析MapReduce MapReduce是Google提出的一种用于处理和生成大规模数据集的编程模型,被广泛应用于大数据处理领域。Hadoop将其作为核心组件,实现了分布式计算的功能...
- **mapreduce.task.io.sort.mb**:设置Map任务的排序缓冲区大小。 - **yarn.nodemanager.vmem-check-enabled**:启用或禁用基于虚拟内存的容器限制。 ##### 2. 数据存储与读取优化 - **压缩**:选择合适的压缩...
在Hadoop MapReduce框架中,shuffle和排序是两个至关重要的步骤,它们发生在map阶段和reduce阶段之间,确保数据被正确地处理和聚合。...理解和掌握这一过程对于优化Hadoop作业性能和解决可能出现的问题至关重要。
### 流式数据排序优化 #### 一、窗口大小选择优化 **1.1 窗口大小对算法性能和资源消耗的影响** - **延迟**:较小的窗口能够更快地处理数据,从而减小延迟。 - **吞吐量**:较大窗口可能会导致更高的吞吐量,因为...
3. **MapReduce原理**:MapReduce的工作流程包括Map阶段和Reduce阶段,中间通过Shuffle和Sort过程进行数据排序和分区。Map函数将输入数据拆分成键值对,Reduce函数则聚合这些键值对,处理结果。书中会详述如何编写...
,Hadoop 技术已经在互联网领域得到了广泛的应用。互联网公司往往需要 存储海量的数据并对其进行处理,而这正是Hadoop 的强项。如Facebook 使用Hadoop ...阿里巴巴则将Hadoop 用于商业数据的排序和搜索引擎的优化等。
开发和优化高效的Hadoop & Hive程序 大数据技术如今是互联网行业处理海量数据不可或缺的技术。Hadoop作为大数据生态的底层框架,Hive作为建立在Hadoop之上的数据仓库工具,二者在实际应用中都有着非常广泛的应用。...
在Hadoop平台上,排序操作是MapReduce框架的核心功能,它保证了数据的有序性,使得数据分析和处理更为高效。...这种灵活性使得用户可以根据具体业务需求对数据进行复杂排序,从而优化数据分析和处理的效率。
4. 性能优化:实验可能包括如何调整Hadoop参数以优化性能,如修改Map和Reduce的任务数量,设置内存大小等。 三、Hadoop作业 作业通常涉及解决特定的问题或实现特定的功能,可能涵盖以下内容: 1. 数据分析:使用...
**Hadoop The Definitive Guide** 这本书是Hadoop领域的权威指南,涵盖了Hadoop的安装、配置、优化以及各种实用技巧。通过阅读这本书,你可以深入了解Hadoop的内部工作机制,如何管理Hadoop集群,以及如何编写...
在具体的实施过程中,可能还需要进行一系列的准备工作和后续的优化措施,比如调整Hadoop的配置参数以获得更好的性能,或者在数据迁移前对数据进行清洗和预处理,以确保数据质量。此外,数据迁移完成后,还需要进行...
"chaper4"可能指的是一个章节或教程的第四部分,可能详细介绍了Hadoop MapReduce的某个特定主题,如数据分区、排序或者Shuffle阶段的优化。 "IOTLibrarynew"可能是一个与物联网(IoT)相关的库,它可能包含了一些将...
- 从测试结果来看,Hadoop集群在数据读写和排序方面表现出色,但在大规模数据处理时,map和reduce任务的分配、执行时间以及资源利用率等方面可能需要进一步优化,以提升整体性能。 - 考虑到硬件配置和软件版本,...
8. **日志管理**:Hadoop提供了丰富的日志系统,包括标准输出、JobTracker和TaskTracker的日志,方便开发者调试和优化作业。 深入学习Hadoop源码,有助于我们理解其内部机制,如数据分布策略、任务调度算法、容错...