APP做为进入移动互联网的重要载体得到越来越多开发者的关注,做APP,开发、产品、运营、推广等每个环节都离不开海量数据的支持。这样一来,如何采集,存储,整理,分析,挖掘海量数据成为开发者们面临的紧要问题。友盟从2010年成立至今,在这方面有独特技术和宝贵经验,51CTO对友盟数据平台负责人吴磊进行专访,就移动大数据平台的底层架构演进、实践经验与数据增值等内容进行了分享。
吴磊,友盟公司数据平台负责人。目前主要负责Umeng移动数据分析平台的软件研发和系统架构。拥有10多年的软件开发经验,先后在大型通讯系统,通用搜索引擎以及海量数据分析等领域工作。在基础平台架构和海量数据处理方向有多年的深厚积累,对Hadoop等大数据领域相关技术在具体工作中的落地有深刻的实践和体会。
当问及加入友盟之后和之前工作有何不同时,吴磊这样回答,“之前工作主要是做数据搜索,大数据的源头和搜索引擎有分不开的联系,可以说,大数据是从搜索开始的,加入友盟之后,工作和之前有很多相似之处,只是最终的目标不一样。友盟架构很多方面和搜索引擎架构是有很多共通性的,但友盟有更多自己的特点,因为其更注重于数据分析。”
友盟的架构思想是借鉴了lambda的混合架构体系,其核心思想是既能兼顾低延迟的计算需求,同时也能具有处理需要处理全量数据的能力,最后通过将两部分的视图聚合起来提供外部服务。Lambda架构是由批处理层,快速处理层,和服务层三部分组成,整个体系也比较简单,通过视图层的聚合就能将两部分计算结果合并起来提供一个完整的视图。系统维护的代价也比较低。
结合友盟的业务架构和Lambda架构思想,最终的系统如上图,友盟为APP集成提供手机、平板、盒子的SDK,APP通过SDK将日志返回到平台的Nginx,负载均衡之后送到基于Finagle框架的日志接收器,之后流入数据接入层。使用两个 Kafka 集群来承担数据接入功能。上面Kafka集群被实时计算消费。下面kafka用于离线数据消费,两个集群之间通过Kafka的Mirror功能进行同步。主要目的是IO负载的分离,避免离线部分过大的IO请求影响到实时计算部分;以及实时离线部分的业务解耦,方便两部分业务独立发展。接下来是数据计算层,分别由离线计算层和实时计算层组成。
离线部分,主要是基于Hadoop Mapreduce框架开发了一系列的MR任务。同时使用Hive建立数据仓库,使用pig进行数据挖掘,现在也在逐步使用Spark来承担数据挖掘相关的工作。实时部分是通过storm来进行流式计算。
实时部分,最终计算结果会存储到 MongoDB,离线部分的数据存储在 HDFS 。离线分析的结果存储在 HBase 。因为 HBase 缺少二级索引的相关功能,所以引入了 Elastic Search 来为 HBase 相关表提供索引查询功能。最后通过统一的 REST Service 来对外提供数据服务。
数据接入层让Kalfka集群承担,后面由Storm消费,存储在MongoDB里面,通过Kafka自带的Mirror功能同步,两个Kafka集群,可以分离负载;计算有离线和实时两部分,实时是Storm,离线是Hadoop,数据挖掘用Hive,分析任务,正在从Pig迁移到Spark平台,大量的数据通过计算之后,存储在HFDS上,最后存储在HBase里面,通过ES来提供多级索引,以弥补HBase二级索引的缺失。
为了快速上线,友盟在2010年的数据平台是基于RoR开发,在后台通过Resque进行一些离线的处理。这个架构很快就跟不上移动互联网的发展速度,面临巨大的数据压力,不调整是不性的。
之后就切换到基于Finagle Server的日志服务器,Finagle Server是Twitter开源出来的一个异步服务器框架,很适合移动互联网访问特点:高并发,小数据量。切换到Finagle Server之后,单台服务器的处理能力得到了极大的提升。同时日志收集服务的无状态特性可以支持横向扩展,即使面临非常高压力时也可简单的通过增加临时服务器来应对。
唯一标识。移动统计分析可以使用设备ID来作为标识符。 但也会遇到问题,吴磊在采访中以Android设备为例,对这部分进行了详细分享:
安卓设备通常可以拿来作为设备标识的是 IMEI, MAC, 和Android ID,可安卓设备的碎片化和开放性,导致得到数据变得不是那么容易。由于Android的开放性,各种刷机rom横行, 会出现一些设备MAC地址完全一样的情况,还有部分山寨机则会出现公用IMEI的问题。同样还有一些安卓设备是没有IMEI的,如平板和盒子。
针对这一问题,友盟采用统一计算和机器学习来应对,统一计算就是综合以上提到的三种设备ID,按一定的算法来计算出唯一的ID,对于重复的IMEI,MAC地址,Andriod ID等数据加入计算黑名单,在计算时不予采用。机器学习就是通过基于图的分析方法,来讲计算设备标识。
数据标准化。型号、地域识别、时间识别等角度考虑。
数据格式。Json、Thrift、Protobuf等。
吴磊在采访中表示,数据计算会占用数据平台工程师大部分的时间,数据计算分为实时计算、离线计算、准实时计算三部分,以下是这三部分计算面临的挑战:
实时计算:时效性问题是实时计算首要面对的,从实时上考虑,就不能放一些太复杂的计算。突发流量冲击大多会发生在晚上10:00开始到12:00结束,就是睡前刷一刷。会产生一些延迟,如果延迟特别严重会临时扩容,Lambda的架构很灵活,保证了有能力很方便进行扩容。误差,lambda的计算架构,实时和离线部分是两套代码,产生差异是必然的。为了不会让实时部分偏差太大,一般最长也是天级任务。到凌晨就清理了。这样数据会在离线计算时得到纠正。
离线计算:数据倾斜是贯穿离线计算始终的问题,因为数据倾斜几乎是天然存在的,如大App数据量是小App几万倍,如不及时处理,会不断放大,最后会对效果产生严重影响,不同的数据倾斜会有不同的方法,通常对最常见的倾斜问题,会通过进一步细分然后再汇总的办法来解决。还有因为离线计算数据量大,就得处处压缩,通过时间换取空间,那么资源调度的问题就来了,任务是有优先级的,通过改造Hadoo的公平调度算法来保证大任务能得到充分的计算资源在可接受的范围内计算完毕。
准实时计算:对于延迟有一定敏感但又不适合放置在离线任务中运算的,称为准实时计算。如下载服务,消息推送中的圈人服务等,最早是通过mini batch的方式,不断提交mr任务完成,最近通过实验验证使用spark streaming 来作这事比较适合。
在线存储。读写均衡(主要分清读写的请求哪个更多,来进行优化,例如实时部分,读和写是比较均衡的,采用了MongoDB,但是离线计算写远远大于读,需要对HBase进行优化)
离线存储。数据压缩,数据生命周期
数据缓存。横向扩展,预加载 TWME搭建 redis 集群
吴磊表示, 数据安全做大数据的人会关注,也是所有做数据的人都非常关注的问题。事实上安全是有很多个维度的,有从技术方面,有产品策略方面,还有有政策方面安全等等。
友盟在数据安全方面首先有自己的商业底线,就是绝对不采集用户的敏感数据,如个人用户识别数据、手机号码、,地理位置信息等。其次,友盟数据计算结果,需要完全认证才能访问,就是说每个用户只能访问自己的数据,永远不可能访问其他人的数据。最后,进行数据处理时,团队与团队之间的信息是隔离的,如离线处理这部分的工程师,看到都是一些经过脱敏的数据,是不可能知道这些数据属于哪个APP。
谈到数据增值,吴磊先给记者分析了当前移动互联网的发展行情,现在移动互联网的红利已经接近尾声,就说是说靠移动互联网本身的迅猛发展给开发者用户增长的可能性已经很渺茫。所以提高自身产品的吸引力或其他营销手段增加用户活跃度,才能使得开发者的产品得到更好的发展。友盟大数据平台可以助开发者们一臂之力,这是现在乃至未来友盟给客户提供的主要服务。
采访最后,吴磊表示为了能够更好的服务于客户,友盟能做的就是让现有的这些庞大数据增值起来。那如何能够让数据增值呢?
其一:内部数据打通,友盟不光是做统计分析,还有即时通讯、社会化分享、工具推荐等业务。 把这些业务的数据尽可能的进行横向打通,这样一来,就可以用户自身的自定义事件,进行一些有针对性的推送。
其二,用户画像。友盟还和其他的数据方合作,给用户进行画像,这样就可以进行更加精准的推送。用户画像可以根据现有的数据更精准的自己用户属性和兴趣、行为等方面。
其三:设备评级。对于APP开发者来说,更解渠道的推广效果,如哪些渠道进行推广更有价值用户,哪些渠道推广的用户价值小,或哪些渠道有作弊行为,推广全是一些虚假的用户。
其四,APP健康度评估。通过APP健康度能使开发者了解自己这一款APP当前是处于生命周期哪个阶段,是属于快速增长阶段、平稳发展阶段,还是属于衰减阶段。这样就能更好了解自己的产品目前的健康状况。同时也能了解自身产品,用户群体里面有多少是垃圾设备,有多少是有价值的设备。