EMC颜开分析Dremel原理,如何在3秒内分析1PB数据
上周,InfoQ中文站对 Google的大数据分析工具PowerDrill做了简单介绍。今天,我们来看看服务于EMC的大数据专家颜开 在博客文章中对Dremel的分析。
在这篇文章中,颜开首先提到了Dremel的5个主要特点:
- Dremel是一个大规模系统。在一个PB级别的数据集上面,将任务缩短到秒级,无疑需要大量的并发。磁盘的顺序读速度在100MB/S上下,那么在1S内处理1TB数据,意味着至少需要有1万个磁盘的并发读! Google一向是用廉价机器办大事的好手。
- Dremel是MR交互式查询能力不足的补充。和MapReduce一样,Dremel也需要和数据运行在一起,将计算移动到数据上面。所以它需要GFS这样的文件系统作为存储层。在设计之初,Dremel并非是MapReduce的替代品,它只是可以执行非常快的分析,在使用的时候,常常用它来处理MapReduce的结果集或者用来建立分析原型。
- Dremel的数据模型是嵌套(nested)的。互联网数据常常是非关系型的。Dremel还需要有一个灵活的数据模型,这个数据模型至关重要。Dremel支持一个嵌套(nested)的数据模型,类似于JSON。
- Dremel中的数据是用列式存储的。使用列式存储,分析的时候,可以只扫描需要的那部分数据的时候,减少CPU和磁盘的访问量。同时列式存储是压缩友好的,使用压缩,可以综合CPU和磁盘,发挥最大的效能。
- Dremel结合了Web搜索和并行DBMS的技术。首先,他借鉴了Web搜索中的“查询树”的概念,将一个相对巨大复杂的查询分割成较小较简单的查询。大事化小,小事化了,能并发的在大量节点上跑。其次,和并行DBMS类似,Dremel可以提供了一个SQL-like的接口,就像Hive和Pig那样。
颜开提到了一个Dremel的应用场景。
美女数据分析师有一个新的想法要验证,需要在上亿条数据上面跑一个查询,看看结果和她的想法是不是一样,她可不希望等太长时间,最好几秒钟结果就出来。当然她的想法不一定完善,还需要不断调整语句。然后她验证了想法,发现了数据中的价值。最后,她可以将这个语句完善成一个长期运行的任务。
对于Google,数据一开始是放在GFS上的。可以通过MapReduce将数据导入到Dremel中去,在这些MapReduce中还可以做一些处理。然后分析师使用Dremel,轻松愉悦的分析数据,建立模型。最后可以编制成一个长期运行的MapReduce任务。
接下来,颜开详细分析了Dremel的列存储和嵌套数据模型,并得出结论:
就像其他数据分析系统一样,数据结构确定下来,功能就决定了一大半。对于Dremel的数据查询,必然是“全表扫描”,但由于其巧妙的列存储设计,良好的数据模型设计可以回避掉大部分Join需求和扫描最少的列。
对于Dremel的查询方式,颜开指出:
Dremel可以使用一种SQL-like的语法查询嵌套数据。由于Dremel的数据是只读的,并且会密集的发起多次类似的请求。所以可以保留上次请求的信息,还优化下次请求的explain过程。
……
Dremel是一个多用户的系统。切割分配任务的时候,还需要考虑用户优先级和负载均衡。对于大型系统,还需要考虑容错,如果一个叶子Server出现故障或变慢,不能让整个查询也受到明显影响。
……
Dremel还有一个配置,就是在执行查询的时候,可以指定扫描部分分区,比如可以扫描30%的分区,在使用的时候,相当于随机抽样,加快查询。
颜开还在博客中列出了对Dremel的测试结果,包括列存测试、和MapReduce的对比测试、树状计算Server测试、扩展性测试、容错测试等等。
对于Dremel和Hadoop的关系,颜开指出:
Dremel的公开论文里面已经说的很明白,Dremel不是用来替代MapReduce,而是和其更好的结合。Hadoop的Hive,Pig无法提供及时的查询,而Dremel的快速查询技术可以给Hadoop提供有力的补充。同时Dremel可以用来分析MapReduce的结果集,只需要将MapReduce的OutputFormat修改为Dremel的格式,就可以几乎不引入额外开销,将数据导入Dremel。使用Dremel来开发数据分析模型,MapReduce来执行数据分析模型。
Hadoop无论存储结构还是计算方式都没有Dremel精致。对Hadoop实时性的改进也一直是个热点话题。要想在Hadoop中山寨一个Dremel,并且相对现有解决方案有突破,笔者觉得Hadoop自身需要一些改进。一个是HDFS需要对并发细碎的数据读性能有大的改进,HDFS需要更加低的延迟。再者是Hadoop需要不仅仅支持MapReduce这一种计算框架。其他部分Hadoop都有对应的开源组件,万事俱备只欠东风。
颜开接下来提到几个与Dremel类似的开源实现:
- OpenDremel/Dazo
可以在GoogleCode上找到 http://code.google.com/p/dremel/。目前还没有发布。作者声称他已经完成了一个通用执行引擎和OpenStack Swift的集成。笔者感觉其越走越歪,离Dremel越来越远了。
- Apache Drill
Drill 是Hadoop的赞助商之一MapR发起的。有和Dremel相似的架构和能力。他们希望Drill最终会像Hive、Pig一样成为Hadoop上的重要组成部分。Drill支持更标准的数据结构,还有更大的灵活性,支持多重查询语言,多种接口。
目前Drill包括四个组件:
- 类似Google BigQuery的查询语言,支持嵌套模型,名为DrQL。
- 低延迟分布式执行引擎,可以支持大规模扩展和容错。可以运行在上万台机器上计算数以PB的数据。
- 嵌套数据模型,和Dremel类似。也支持CSV、JSON、YAML类似的模型。这样执行引擎就可以支持更多的数据类型。
- 支持多种数据源,现阶段以Hadoop为数据源。
颜开在文中提到:伯克利分校的教授Armando Fox说过一句话——“如果你曾事先告诉我Dremel声称其将可做些什么,那么我不会相信你能开发出这种工具”。
读者如果希望了解更多Dremel的实现细节,请到颜开的博客上去看这篇 文章。
郑柯 InfoQ中文站总编。做过开发,当过PM,干过销售,搞过市场,最终还是回到媒体。实用的理想主义者,相信:每天改变一点点,这个世界会更好。