腾讯公司数据平台高级架构师 郭玮:TDW在Hadoop上的实践分享-CSDN.NET

摘要:腾讯是一个巨无霸公司,我们日常的生活中已与它产生了千丝万缕的联系,不可避免的也产生了海量的数据,如何正确而快速地处理这些海量数据,腾讯数据平台高级架构师郭玮通过发表主题为“TDW在Hadoop上的实践分享”的演讲,向大家分享了腾讯处理超大规模数据的经验。

【CSDN现场报道】第四届中国云计算大会将于2012年5月23-25日在北京国家会议中心隆重举行。本次大会由中国电子学会主办,北京市经济和信息化委员会协办,中国云计算技术与产业联盟、中国电子学会云计算专家委员会承办,CSDN与《程序员》杂志协办。在2012国内公共云全面开花、云计算实践元年之际,本次大会云集云计算核心专家,就国内外云计算核心技术以及行业应用创新实践进行了深入探讨。

腾讯公司数据平台高级架构师 郭玮

腾讯是一个巨无霸公司,我们日常的生活中已与它产生了千丝万缕的联系,不可避免的也产生了海量的数据,如何正确而快速地处理这些海量数据,腾讯数据平台高级架构师郭玮通过发表主题为“TDW在Hadoop上的实践分享”的演讲,向大家解答了这方面的疑惑,并分享了腾讯处理超大规模数据的经验。

郭玮说,腾讯公司的用户量活跃用户超过7亿,这么长的产品线这么多活跃用户产生的是海量数据,腾讯公司如何在这么海量的数据里面挖掘宝藏,从中间获取什么样的高价值的东西,很大程度上就要看腾讯海量数据处理平台。日常的数据进入统一采集的模块,这个统一采集模块包括实时采集功能,采集进来以后,会进入到海量存储的模块。如果实时计算就进入我们另一个模块,需要批量处理有TDW和TDCP。通过我们批量计算得到的东西,我们会有一个统一分发的模块,这个模块分发给产品用,同样可以具备实时功能。

以下为文字实录:

郭玮:谢谢大家,这个演讲题目是TDW在Hadoop上面的实践分享,这次演讲的经验分享不是一个在某一个问题上或者某一个领域里面很深入的,这些经验来自于我们在实际运营过程中间,我们可能遇到的问题或者我们想要去优化的点,我们在Hadoop做了这些东西,有很多点拿出来分享给大家,我相信有很多公司在用Hadoop的时候,他们可能会很容易遇到这些问题或者很容易遇到我想要在方面做得更好,我想要在这方面做一些优化,我可能腾讯公司在这方面做了一些工作,给得到分享一下。TDW是腾讯数据库的简称,看一下今天我们议程,其实很简单,三部分,第一部分简单给大家讲腾讯公司的海量数据处理平台,再介绍咱们海量数据处理平台的核心部件,TDW腾讯分布式数据仓库,最后是TDW在Hadoop上面的实践。

接下来看看腾讯公司的产品,在座的大家都是腾讯公司的用户吧?腾讯公司的产品或者说腾讯公司进入互联网各个领域,各条战线都能够看到它的产品,这幅图大家也是比较熟悉的,在互联网前段时间四面出击跟各大互联网公司都在作战,这两幅图想说明的是,腾讯公司的产品线是非常多的,具体多少产品,我也说不上来。腾讯公司的用户量活跃用户超过7亿,这么长的产品线这么多活跃用户产生的是海量数据,腾讯公司如何在这么海量的数据里面挖掘宝藏,从中间获取什么样的高价值的东西,很大程度上就要看腾讯海量数据处理平台,其实这个海量数据处理平台是很简单的图,一眼能够看出来,数据进入统一采集的模块,这个统一采集模块包括实时采集功能,采集进来以后,会进入到海量存储的模块如果实时计算就进入我们另一个模块,需要批量处理有TDW和TDCP通过我们批量计算得到的东西,我们会有一个统一分发的模块,这个模块分发给产品用,同样可以具备实时功能。

我们还分析的结果通过一条路给到产品和用户,就是通过BI分析工具做想要的工作。我们看一下分布式数据仓库,是海量数据平台的核心部件,下面是基于开源软件Hadoop和Live大量的优化。

这是特性列表,作为数据仓库,它应该具备的基本特性和扩展特性,很快进入了在Hadoop上实践的分享,这些分享会从这几个方面给大家介绍,首先是存储,存储格式支持自己的结构化存储以及压缩,在Join操作提高它的效率,基于负载感知的公平调度策略,都是在调度任务的时候更加得心应手,不会出现一些问题。在我们存储策略上面希望通过差异化多级存储策略降低存储成本。分时计算框架是我们针对计算有时间差异性任务,会通过框架做到填补的功能。MED使TDW访问到外部的数据源,TDW是很多用户内部使用的开发,开发人员超过百人规模,需要有非常友好的丰富用户界面提供到我们的用户。这些实践等下会一一跟大家分享。

首先看一下结构化存储和列存储和压缩,相比起文本来说具有更高效的存储和效率,同时腾讯结构化存储提供了一些DB特性,从原数据修改结构,并且为它的一些设计,也为未来提供随机访问,这是简单结构架构图。这三个是我们做的基础单位,有了结构化存储我们在上面很容易做了列存储和压缩功能,我们通过列存储可以大规模减少,我们数据仓库里面有很多宽表,实际上每一个分析用到的几个,最多十几个甚至更多,如果是一种存储,每次读取数据量很大,如果用列存储,把关心的列读出来。所以我们大大减少了磁盘的IO。通过压缩我们采用LZO的算法和IO和CPU的兼顾。

这展示了一下列存储和压缩的功能,通过我们的列存储出和压缩,大概在平均处理能力上面有10到20倍的提升,当然是相对于没有做列存储,行存储和Hadoop本身存储相比会更好。在行存储压缩比平均1:2,列存储上面有更多的数据有更高的压缩比。总体来说,整个节省空间有60%的规模。PB是谷歌协议,PB具有这样的优势,描述能力非常强,解析效率非常高,节省存储空间,腾讯公司为什么引入PB,实际上是广告业务采用PB为主,其他业务也逐渐使用,我们开始来支持PB了实际上早于社区的版本已经实现了,并且有比较方便的功能,它可以根据结果文件自动创建表结构,这相对来说比较方便用户。这是它实现上面的简单数据,这个数据流转过程大家是比较熟悉的,我们做的是相应点上面做了一些适配工作,使得PB被Hadoop所理解。

接下来看Join做了一些优化,大家应该在海量数据库里面做两类,一类关联操作,一类是聚合操作,一个是左边,大家应该很熟悉这个过程,有什么区别呢?进行分区,在做聚合的时候,我们可以把相同的数据用同一个Map进行处理。同时在优化器上面自动使用Hash Join,接下来我们看Colocation,已经实现了hash分区,按hash进行分区了,比如说,A表分区在0上,B表在1上面,通过网络进行一次传输,运气比较好的情况下面,像第一个hash分区1,左下角这个,这个不用搬,因为数据摆放是不受控的,你在集群非常大的结点非常多的集群里面,想要做到刚好的hash放到一个结点,这是很难遇到的事情。这样的话,有非常多的网络拉取的动作,这个地方是不是可以做优化,我们就做了colocation的东西,首先修改了摆放策略,使得同一个hash分区放一个电脑上,特的特点是在这个集群里面增加我的机器对整个集群的影响,非常小。通过这个基于colocation就可以完成计算,节省了join的80%。

下面给大家介绍调动策略做了优化工作,社区做得非常多的工作,我们工作结合了社区的工作,也加入了我们自己的东西,首先我们看一下,大家可能会遇到这些问题,举三个例子,第一,我是集群的用户,我有很多任务在这个集群上跑,如果有一个大的任务,我有一堆很小的任务,不巧的是大人物先进入了大集群,根据最早的服务策略,大任务会被先调起来,小任务被堵住,只要获得很少资源可以走掉,但是他得大任务做完。第二个场景,有两个用户,我和另外一个用户,另外一个人提交了大任务,大任务占了整个集群资源,我的任务不能执行,肯定很伤心,本来共同使用集群,但是他的大任务占用了我的资源,我的资源必须排在他后面,这个很恼火,这是第二个情况。

第三个情况,相信大家应该有遇到过,我们大家知道下发任务的依据,这台电脑是否还有空闲的槽,有多少槽基于它的空间来设定,会有一些情况,因为这个调度策略只看到CPU,并没有看机器其他资源,比如说内存或者磁盘,会有一种情况,当有一些任务非常需要消耗大量的内存,因为内存通常来说也是比较紧缺的资源,比如说是数据挖掘的算法算法的精准程度是依赖于读到内存中的多少,读得数据越多算法越精准,这样的任务会向我的集群申请比较多的内存,2G或者4G。一个内存量相对是有限的,有可能不是特别多,这样的话,可能会出现一些情况,我这台机器的内存分配差不多。跟大家讲这几个情况,我们在调度策略上面,如果做得不够好,可能出现这些情况,以下特点和分组得到保障,以及用户隔离,我用户允许重要的紧急任务,这个出现一些实际应用情况,比如说老板突然要看什么东西,还有就是小任务优先获得,保障它尽快获得资源,不被大任务堵塞。如果在集群上面没有足够的内存空间,不会下发这个任务,这是很简单的示意图,它大概已经列举了刚才说的几个特点,比如说分组,比如说可以直接获得尽可能多的资源,以及我们会有内存信息、磁盘信息,掌握了这些信息以后可以知道自己到底应不应该往这台机器上面下发任务。

调度策略上线以后的情况,总体情况是稳定运营,资源不变效率得到提升,有几个数据等待时间下降,平均耗时降低了10%,得到这些提升的前提是CPU负载保持不变,当然也没有出现互相影响和堵塞,或者集群多数机器出现负载过高,造成机器不工作了。我们看一下差异化存储设定,这基于成本控制的东西,当然数据存储我们肯定是有生命周期管理的,但生命周期管理基础之外,有一些业务数据,存储时间相对来说比较长,有些能够达到一年甚至是三年存储时间,这些久远的数据没有被生命周期管理系统干掉,但是在里面活跃度相对来说较低,被访问到的可能性,也是比较小的,如果还是一样的不做区分采用这个策略,实际上相对来说比较浪费,我们就有这么差异化策略。我们提供了差异化的压缩算法,这实际上平均压缩比率比LZO棒得多,这相对比较冷的数据可以采用差异化压缩的存储。

在此之外,其实还提供了差异化副本策略,有1.4到2.6两种选择,节约的存储情况下面并没有降低数据安全,实际上还可以选择更接近的策略,比如说就是两个副本,这实际上是我们整个数据有这三种策略选择,对它进行存储。最终的结果,如果对整个集群中间数据实行了差异化存储策略会得到50%的节省,同时数据计算并没有得到影响。

接下来看一个分时计算框架,这也是有问题来源的,有一个情况,计算腾讯网用户点击数据,压力非常大,集群非常高,白天压力很小,当数据量不断的增长的时候,甚至会出现没有办法在早晨上班之前给老板看报告,因为数据量非常大,但是白天集群很闲这是一个矛盾,怎么解决这个问题?看一下当时的CPU的情况,解决思路将一段时间计算压力分散到全天,这个动作不能去麻烦用户,用户写好了程序丢在上面,如果说现在要去做分时,你去把程序重新写,这不行,用户肯定不答应,我们分时计算是由框架自动形成的,有这么一个示意图,蓝色部分是用户,橙色部分是我们框架部分,相当于每个小时用通用的方式代替它,汇总的时候会根据规则读取数据,进行捆绑送给用户的程序。

再介绍一下SQL MED的,Web数据是SQL的标准,TDW可以通过MED接口来访问,我们可以去做一些优化,把外部数据源的条件去下接到对方,我们就可以减少数据的拉取工作,这样用户用TDW,可以访问外部层面,就是一些相对来说数据量比较小,但是变化比较活跃的数据,我们可以存储在外部数据流,可以跟数据仓库进行交互计算。

最后大家可以看一下丰富友好的用户界面,因为TDW是整个公司的用户开发的东西必须给用户提供比较方便的工具和语言支持,这样才能用的过程中间比较顺手,我们首先看PLClient,用户可以通过客户端,到TDW发展各种命令进行操作。下面是类似结果展示,类似云计划查询,包括历史的查询等等的一些东西,这实际上是编辑界面,还有PR编辑界面,我们做过程语言,那个界面有断点的一些功能,这是几乎所有用户使用的开发工具。

统一调度平台,用户把程序写完以后放到系统进行调度,给他比较方便的平台进行任务的配置和任务之间的关系,依赖关系的定义,这是简单的雏形,用户可以通过拖,拉方块,可以编辑里面的信息,把一些依赖关系通过箭头建立起来,这样的话,可以在编辑好以后提交到我们的统一管理系统里面去,就会被定时调度。

这是我们提供的工具,过程语言是前面提到的有语言框架,用户填写自己的过程的信息。

我们比较多的用户本身相对来说是比较高端的,所以我们也作为腾讯TDW作为数据仓库,参加Rollup来做一些工作,这些功能都提供给用户,用户可以比较方便、高效的使用这些分析函数。我们大概今天的分享内容就是这么多,谢谢大家。

来源URL:http://cache.baiducontent.com/c?m=9d78d513d9d430de4f9be7697b15c0161d438113668486482296870fd33a541b0120a1ac26510d199680397001d8181dbcac2172405f77f1869bc80c86eacc7f32db3a34721f865612a51ba8dc4653c1218d5ae3ad1eedbffa&p=8f618315d9c342ac05a2c92d02149e&newp=987b8316d9c109f208e2947d0e49c6231610db2151d4d2163789&user=baidu&fm=sc&query=%CC%DA%D1%B6hadoop&qid=ced6cc0b000393ca&p1=2