时间:2016-06-25 10:30 文章来源:http://www.lunwenbuluo.com 作者:肖颖 点击次数:
摘要:重分区连接查询是基于传统MapReduce框架的最常用的连接查询算法之一。在讨论基于传统MapReduce框架的标准重分区连接算法及减小数据缓存的改进算法的基础上,提出了在数据文件分块阶段进行预筛选以精简MapReduce框架中处理的数据量的方法。该方法能有效减少框架内部各个阶段处理的数据总量,进一步压缩缓存的使用空间并降低不同阶段之间数据传输的网络开销。
关键词:MapReduce;连接查询;重分区连接;预筛选
引言
近年来,随着移动互联网、电子商务及社交媒体快速发展,网络的数据信息量呈指数型增长。为了能更快更好地分析处理这些庞大的数据信息,很多企业选择将数据迁移到价格相对低廉且容错性能较强的云环境[1]中进行处理。MapReduce框架[2]是云计算最为核心的技术之一。作为海量数据的并行处理平台,MapReduce编程模型[3]简单,隐藏了并发、容错、分布式计算和负载平衡等复杂繁琐的细节,并具有较高的可扩展性和容错性,现已广泛应用于海量数据的分析和处理领域。
但在MapReduce框架中,连接查询运算仍然过程复杂、工序繁琐,同时面临数据倾斜、分布式环境数据传输等问题,效率较低。如果能提高MapReduce的连接查询效率,则可进一步提高数据分析效率和用户体验满意度。
本文就现有的基于传统MapReduce框架的重分区连接查询方法进行深入探讨和研究,并进一步讨论可能的优化策略。
1传统MapReduce框架实现机制
传统MapReduce框架将所有面向海量数据的计算划分成两个阶段:Map阶段和Reduce阶段,每个阶段可由用户自行定义其处理函数,且都以(K,V)二元组的形式进行输入和输出。但由于大部分Mapper与Reducer并非执行在相同节点上,因此MapReduce框架需要一个介于Map函数和Reduce函数之间的Shuffle过程来实现它们之间的数据整理和传输。以下是传统MapReduce框架的具体工作步骤[4]。
⑴准备工作
MapReduce框架将大量输入数据分割成M个大小固定的块。
⑵Map阶段
Mapper读取分配给它的块信息,并从中分离出各条记录。
Mapper从每条记录中抽象出二元组(K1,V1),并传递给用户自定义的Map函数执行生成二元组(K1',V1')。由此块信息经由Map阶段处理得到一个输出序列{(K1',V1'),(K2',V2'),…,(Kn',Vn')},同时这些数据将被存入缓存。
⑶MapReduce框架的Shuffle过程
(a)为了使Reduce函数获得有序的输入信息,Shuffle过程负责将Map阶段的输出序列进行排序分组归并,使得具有相同键值K'的数据V'集中在一起,形成(K',list(V')),且list(V')中的值按V'进行排序。因为数据量巨大,所以该阶段可能使用外部排序。
(b)将处理好的(K',list(V'))发送给Reduce函数。
⑷Reduce阶段
执行Reduce函数,生成最终的执行结果(K'',V''),并作为输出结果写入文件。
2重分区连接查询算法及其优化探讨
在数据爆炸的今天,有些大型的互联网公司每天需要利用高达TB甚至PB级别的日志信息来分析数据,以获取有利于其发展的统计信息。但其中大部分操作都是对巨型数据表(例如用户表User和日志表Log)进行连接查询操作:
SELECTUser.Col1,User.Col2,…,User.Coln,
Log.Col1,Log.Col2,…,Log.Colm
FROMUser,Log
WHEREUser.UserID=Log.UserIDANDCUserANDCLog
其中CUser表示仅和表User相关的筛选条件,CLog表示仅和表Log相关的筛选条件,User.Col1,User.Col2,…,User.Coln表示表User中的n个列(表User的列数≥n),Log.Col1,Log.Col2,…,Log.Colm表示表Log中的m个列(表Log的列数≥m)。假设若表User共有mU行,每行的数据量为lenU字节;表Log共有mL行,每行的数据量为lenL字节,则执行该连接查询将面临为(mU×lenU)×(mL×lenL)级别的巨大数据量。
在此我们讨论基于传统MapReduce框架的最常用的连接查询算法之一——重分区连接查询算法[5]。该算法类似于并发数据库管理系统中的分块归并排序连接,同时继承了传统MapReduce框架的容错性能和负载均衡性。
2.1标准重分区连接算法
联系方式
随机阅读
热门排行