互联网公司同质应用服务竞争日益激烈,业务部门亟需利用线上实时反馈数据辅助决策支持以提高服务水平。Alluxio(前Tachyon)作为一个以内存为中心的虚拟分布式存储系统,在大数据系统性能提升以及生态系统多组件整合的进程中扮演着重要角色。本文将介绍去哪儿网(Qunar)的一个基于Alluxio的实时日志流的处理系统,Alluxio在此系统中重点解决了异地数据存储和访问慢的问题,从而将生产环境中整个流处理流水线的性能总体提高了近10倍,而峰值时甚至达到300倍左右。
目前,去哪儿网的流处理流水线每天需要处理的业务日志量大约60亿条,总计约4.5TB的数据量。其中许多任务都需要保证在稳定的低延时情况下工作,快速迭代计算出结果并反馈到线上业务系统中。例如,无线应用的用户点击、搜索等行为产生的日志,会被实时抓取并写入到流水线中分析出对应的推荐信息,然后反馈给业务系统并展示在应用中。如何保证数据的可靠性以及低延时,就成了整个系统开发和运维工作中的重中之重。
Alluxio大数据存储系统源自于UC Berkeley AMPLab,目前由Alluxio公司在开源社区主导开发。它是世界上第一个以内存为中心的虚拟的分布式存储系统,并将多样化的上层计算框架和底层存储系统连接起来,统一数据访问方式。Alluxio以内存为中心的存储特性使得上层应用的数据访问速度比现有常规方案快几个数量级。此外,Alluxio提供的层次化存储、统一命名空间、世系关系、灵活的文件API、网页UI以及命令行工具等特性也方便了用户在不同实际应用场景下的使用。在本文中,我们将结合具体案例做进一步地阐述。
在我们的案例中,整个流处理计算系统部署在一个物理集群上,Mesos负责资源的管理和分配,Spark Streaming和Flink是主要的流计算引擎;存储系统HDFS位于另外一个远端机房,用于备份存储整个公司的日志信息;Alluxio则是作为核心存储层,与计算系统部署在一起。业务流水线每天会产生4.5TB左右的数据写入存储层,同时通过Kafka消费大约60亿条日志与存储层中的数据进行碰撞分析。Alluxio对整个流处理系统带来的价值主要包括:
本文剩余部分将详细对比分析Qunar原有流处理系统以及引入Alluxio改进后的流处理系统,最后简述我们下一步的规划和对Alluxio未来方向的期待。
我们的实时流处理系统选择了Mesos作为基础架构层(Infrastructure Layer)。在原先的系统中,其余组件都运行在Mesos之上,包括Spark、Flink、Logstash以及Kibana等。其中主要用于流式计算的组件为Spark Streaming,在运行时Spark Streaming向Mesos申请资源,成为一个Mesos Framework,并通过Mesos调度任务。
如上图所示,在该流处理系统中,待处理的日志数据来自于多个数据源,由Kafka进行汇总,数据流在经过了Logstash集群清洗后再次写入Kafka暂存,后续由Spark Streaming和Flink等流式计算框架消费这些数据,计算的结果写入HDFS。在原先的数据处理过程中,主要存在着以下性能瓶颈:
在引入Alluxio之后,我们很好地解决上述问题。在新的系统架构中,整个流式处理的逻辑基本不变。唯一变化的地方在于使用Alluxio代替原先的HDFS作为核心存储系统,而将原来的HDFS作为Alluxio的底层存储系统,用于备份。Alluxio同样运行在Mesos之上,各个计算框架和应用都通过Alluxio进行数据交换,由Alluxio提供高速的数据访问服务并维护数据的可靠性,仅将最终输出结果备份至远程HDFS存储集群中。
在新的系统架构中,最初的输入数据仍然经过Kafka过滤,交由Spark Streaming消费,不同的是,Spark Streaming在计算时产生的大量中间结果以及最终的输出都存放在Alluxio中,避免与较慢的远程HDFS集群进行交互,同时,存放在Alluxio中的数据也能够很方便地与上层组件,如Flink、Zeppelin进行共享。在整个过程中,Alluxio的一些重要特性对整个流水线的性能提升起到了重要的作用:
通过利用Alluxio众多特性以及将数据从远程HDFS存储集群预取至本地Alluxio等优化方式,整个流处理流水线中的数据交互过程大量转移到本地集群的内存中,从而极大地提升了数据处理的整体吞吐率,降低了响应延时,满足了流处理的需求。从我们的线上实时监控的每次micro batch(间隔10分钟)的监控图中,可以看到平均处理吞吐量从由以前单个mirco batch周期内20至300的eps,提升到较为稳定的7800eps,平均的处理时间从8分钟左右降低到30至40秒以内,整个流处理加速16-300倍。尤其是在网络繁忙拥挤时,上百倍的加速效果尤为明显。
而对Kafka的消费指标来看,消费速度也从以前的200K条消息稳定提升到将近1200K。
此外,我们利用Alluxio自带的metrics组件将监控数据发送到graphite,以方便来监控Alluxio的JVM以及Alluxio的FileSystem状态。可以看到Alluxio Master对Heap内存占用率维持在低水平。
同期的文件数量和操作统计为下图所示。
本文介绍的优化方法主要是针对利用Alluxio来解决异地存储访问慢的问题。性能提升的工作是永无止境的,最后我们也总结了一些未来的工作:
关于:中科研拓
深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供很好的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com