让你的MapReduce SQL引擎加速 ---- Google-Tenzing下的那些Tricks

让你的MapReduceSQL引擎加速
           ---- Google-Tenzing下的那些Tricks
Tenzing:
在Google-MapReduce计算框架之上实现对SQL的支持,Tenzing是SQL engine forMapReduce framework。

Motivation:
分布式数据库提供的SQL查询的不足:
1)节点扩展的问题
2)加载数据造成整个系统服务的抖动
3)传统SQL屏蔽了应用人员直接访问的数据的接口。然而,复杂的数据分析需要分析人员设计操作数据的程序,单一的SQL已经不再满足需求。
Target:
1)扩展性强
2)容错性较强
3)性能好,可与当前的MapReduce类SQL执行引擎一比高下(Hive, Pig)
4) 较高的ETL(Extract Transform and Load)效率
5)提供全面的SQL特性和一些高级操作特性,为高级用户暴露更多接口。

Architecture:
让你的MapReduce <wbr>SQL引擎加速 <wbr>---- <wbr>Google-Tenzing下的那些Tricks


Tricks:
(1)Hash aggregation
使用Hashtable来缓存所有map的输入对<k,v>
避免MapReduce过程中的排序,通过hash函数保证相同的key的map输出,会归入统一个ReduceTask上,在Reduce过程Hashtable来缓存数据。
源代码:
Consider the following query:
SELECT dept id, COUNT(1)
FROM Employee
GROUP BY 1;
The following is the pseudo-code:
// In the mapper startup, initialize a hash table with deptid
// as key and count as value.
Mapper::Start() {
dept hash = new Hashtable()
}
// For each row, increment the count for thecorresponding
// dept id.
Mapper::Map(in) {
dept hash[in.dept id] ++
}
// At the end of the mapping phase, flush the hash tableto
// the reducer, without sorting.
Mapper::Finish() {
for (dept id in dept hash) {
OutputToReducerNoSort(
key = dept id, value = dept hash[dept id])
}
}
// Similarly, in the reducer, initialize a hash table
Reducer::Start() {
dept hash = new Hashtable()
}
// Each Reduce call receives a dept id and a count from
// the map output. Increment the corresponding entry in
// the hash table.
Reducer::Reduce(key, value) {
dept hash[key] += value
}
// At the end of the reduce phase, flush out the
// aggregated results.
Reducer::Finish() {
for (dept id in dept hash) {
print dept id, dept hash[dept id]
}
}
不足之处:hashtable内存占用对处理数据的规模而言是一个瓶颈。
(2)Joins
  1)使用不同的数据结构构建查找表
  • integer array <-> integer keys ina limited range
  • a sparse integer map <-> integerkeys in a wide range
  • hash table <-> other type ofkeys
  2)仅加载需要的列,提高内存使用效率。
  3)多线程work共享同一份数据
  4)拷贝数据到work之后,处理之后稍微保留一段时间。在works较小的情况下,mapshards会多次在该节点使用同一块数据,从而避免反复拷贝。
  5)被频繁读取的内容,会被保存在本地磁盘
(3) Remote joins
结合本地的LRU缓存的异步批查找技术。这个技术论文里面没有给出详细的说明,个人认为这是系统很大的一个trick。在进行远程读取过程中,一次读取多行,缓存起来,并使用LRU算法替换过时的数据。
(4)Distributed Hash joins
不是所有的情况下,要处理的表的数据都可以加载到内存中,另外两个需要连接的表格Join-key有可能没有索引。
在这种情况下,需要将执行计划分成3部分,MR1,MR2,MR3。MR1和MR2负责按照join-keyhash的方式切割两个表格,MR3负责执行join过程,MR3依赖于MR1和MR2的结果。
Tenzing系统这里的trick在于它的调度系统,MR1和MR2并行调度执行,MR3在MR1或者MR2有一个执行结束之后,就以完成的MR作业的结果为join-source启动join过程。
(5)Query嵌套
Trick:如果需要两个或者多个MaoReduce,上一个Reducer会和下一个Mapper放在同一个process中。
(6)DML:
Trick:Metadata管理数据的位置,也就是Metadata的内容大概为:reference--> data
INSERT支持不同增量的插入功能,UPDATE和DELETE主要修改了Metadata中reference的位置。
DDL:
控制metadata 与 access,提出Metadata descovery机制导入数据到Tenzing

(7) MapReduce Enhancement
作为MapReduce之上的SQL执行引擎,它对于Google-MapReduce也做了一定的优化:
  1)整体架构是以池来构建。
The Master watcher负责为一个Query选择一个合适的Master pool,同时监管Masterwork上Query和资源使用情况。每一个Master pool的工作用来接收任务,调度任务到不同的work上执行。The workpool包含多个workers,支持FIFO和基于优先级的执行队列。
  2)Streaming & In-MemoryChaining
在SQL执行计划,会翻译成多个MR作业,MR作业之间通过Streaming进行交互,GFS用来备份。
同时在一个job中Reducer和下一个阶段的Mapper放在一个Process中执行,实现内存数据的连续使用。
  3)避免不必要的sort
有些SQL语义没有涉及排序,可以使用Hashtable来组织key-value的MapReduce过程,避免sort过程。
  4)Block Shuffle
传统的MapReduce按照key进行shuffle,会涉及到row的序列化和反序列化。Tenzing使用以1M大小的block作为单位进行shuffle(当然这是在不需要sort的情况下),3Xfaster。
  5)本地执行
在处理的数据量很小的情况下,使用单节点执行比分布式更有优势。


文章来自于 klose blog
本文是参阅了Google的一篇paper而来,期望与有这方面问题的同学联系作者,作者的邮箱在文章的参考文献之后给出。
参考文献: Tenzing:A SQLImplementation On The MapReduce Framework
 http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en//pubs/archive/37200.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值