腾讯业务产品线众多,拥有海量的活跃用户,每天线上产生的数据超乎想象,必然会成为数据大户。特别是随着传统业务增长放缓,以及移动互联网时代的精细化运营,对于大数据分析和挖掘的重视程度高于以往任何时候,如何从大数据中获取高价值,已经成为大家关心的焦点问题。
在这样的大背景下,为了公司各业务产品能够使用更丰富优质的数据服务,近年腾讯大数据平台得到迅猛发展。
从上图可以看出,腾讯大数据平台有如下核心模块:TDW、TRC、TDBank和Gaia。简单来说,TDW用来做批量的离线计算,TRC负责做流式的实时计算,TDBank则作为统一的数据采集入口,而底层的Gaia则负责整个集群的资源调度和管理。
接下来,本文会针对这四块内容进行整体介绍。
为了降低用户从传统商业数据库迁移门槛,TDW基于开源Hive进行了大量定制开发。
在功能扩充方面,SQL语法兼容Oracle,实现了基于角色的权限管理、分区功能、窗口函数、多维分析功能、公用表表达式-CTE、DML-update/delete、入库数据校验等。
在易用性方面,增加了基于Python的过程语言接口,以及命令行工具PLClient,并提供可视化的IDE集成开发环境,使得开发效率大幅度提升。另外,在性能优化方面也做了大量工作,包括Hash Join、按行split、Order by limit优化、查询计划并行优化等,特别是针对Hive元数据的重构,去掉了低效的JDO层,并实现元数据集群化,使系统扩展性提升明显。
从架构上来看,TBank可以划分为前端采集、消息接入、消息存储和消息分拣等模块。
前端模块主要针对各种数据形式(普通文件,DB增量/全量,Socket消息,共享内存等)提供实时采集组件,提供了主动且实时的数据获取方式。中间模块则是具备日接入量万亿级的基于“发布-订阅”模型的分布式消息中间件,它起到了很好的缓存和缓冲作用,避免了因后端系统繁忙或故障从而导致的处理阻塞或消息丢失。
针对不同应用场景,TDBank提供数据的主动订阅模式,以及不同的数据分发支持(分发到TDW数据仓库,文件,DB,HBase,Socket等)。整个数据通路透明化,只需简单配置,即可实现一点接入,整个大数据平台可用。
TRC是基于开源的Storm深度定制的流式处理引擎,用Java重写了Storm的核心代码。
为了解决了资源利用率和集群规模的问题,重构了底层调度模块,实现了任务级别的权限管理、资源分配、资源隔离,通过和Gaia这样的资源管理框架相结合,做到了根据线上业务实际利用资源的状况,动态扩容&缩容,单集群轻松超过1000台规模。
为了提高平台的易用性和可运维性,提供了类SQL和Pig Latin这样的过程化语言扩展,方便用户提交业务,提升接入效率,同时提供系统级的指标度量,支持用户代码对其扩展,实时监控整个系统运营环节。另外将TRC的功能服务化,通过REST API提供PaaS级别的开放,用户无需了解底层实现细节就能方便的申请权限,资源和提交任务。
为了支撑单集群8800台甚至更大规模,Gaia基于开源社区Yarn之上自研Sfair (Scalable fair scheduler)调度器,优化调度逻辑,提供更好的可扩展性,并进一步增强调度的公平性,提升可定制化,将调度吞吐提升10倍以上。为了满足上层多样化的计算框架稳定运行,Gaia除了CPU、Mem的资源管理之外,新增了Network IO,Disk space,Disk IO等资源管理维度,提高了隔离性,为业务提供了更好的资源保证和隔离。
同时,Gaia开发了自己的内核版本,调整和优化CPU、Mem资源管理策略,在兼容线程监控的前提下,利用cgroups,实现了hardlimit+softlimit结合的方式,充分利用整机资源,将container oom kill机率大幅降低。另外,丰富的API也为业务提供了更便捷的容灾、扩容、缩容、升级等方式。