小米数据工场的技术架构
小米数据工场主要承担着为全公司各团队及小米的生态链企业,提供数据采集、计算、存储等基础能力,以及机器学习、挖掘的工具和方法的任务。
整个底层基础平台建立在 Hadoop 体系之上。考虑到扩展性,数据工场天生基于 Scala 设计成分布式架构。由于小米及其生态链企业业务场景丰富 ,因此在技术选型方面全生态都会涉及,如消息流、批处理、实时计算等技术都需要用到,HBase、Hive、Spark、Storm 、Impala 都在不同的场景下使用。
最底层使用 HDFS,上面使用 Hive、Spark 和 Mapreduce 这些混合到一个亚运集群上。而且 Impala 小米很早就在用,是一个很重的计算角色。
小米数据工场总体结构
如上图,上半部分是小米自研的数据工厂,是为最顶部业务层提供服务的。数据工厂主要是提供数据可视化、计算任务管理、数据管理、权限管理、任务调度、数据共享等服务。
公司越大就更希望数据能够开放给公司的各个部门,数据可相互利用。但不能没有任何限制的去使用,所以需要对数据权限做管理。
任务调度是整个工厂里面最重的部分。数据共享就是类似非常火的用户画像类数据,还有其他公共数据如 IP 库,这些数据具有公共特点,不用重复计算,就可以通过数据共享的方式在各个团队之间使用。
数据管理
分为数据预览、元数据、数据源三部分。
数据预览,是每个团队用来互相了解数据。
元数据,就是数据使用过程中要把非结构化的数据转换成结构化的数据。元数据管理就是去了解每个字段的含义和机器解析。机器解析包括 Mapreduce 程序可直接读文件可解析,如用 Impala、Spark 和 Hive 同样也能解析,而不需要每个使用者再去格式化,再去解析这个数据。但面临的问题是数据一旦出现格式的转变或者某些字段的调整,以前任务可能都会出现问题,所以一定要统一管理的地方。
数据源,数据管理非常核心的是数据集成,能够把各个地方的数据集成到平台上来。
HDFS 目录管理
有公共数据空间、业务数据空间、团队数据空间、个人数据空间、Yarn计算空间五部分。
公共数据空间,是用来把公共数据放到上面,把维护权限和读的权限分开。这样大部分都是读这个空间,空间数据安全性等级相对来讲比较低,可以付给更多人。
业务数据空间,因为每个业务数据的增长量是不一样的,甚至有些业务会出现如刚上来一个新功能,数据量迅速的增大,有的甚至会出现某个团队的数据增加,导致把整个集群空间全吃掉,又没有事先打招呼。这种情况下做好业务间的限额配额非常重要,防止某一个团队的增长导致整个集群出现一些问题。
团队数据空间,就是把权限控制到个人,用来帮助做团队之间的数据协作。如把线上任务放到团队账号中去,团队账号的权限要做好控制,权限不随便开放。当团队人员发生变动后,整个团队任务不用再去切换账户而导致交接的复杂性。
个人数据空间,数据工程师、开发工程师等是需要做一些调试或做自己的计算,这就要给这些人一定空间的同时对其数据做配额。这是为了防止这些人过多的使用资源和为了空间不够需要清理数据时,哪些数据要清理,哪些数据不能清理一目了然。这样限制空间的情况下,废弃文件或者垃圾文件的积累会相对较少。
Yarn计算空间,做配额限制是为了杜绝空间滥用的问题。比如:之前发生过一件事,某人在 Reduce 里面写了一个死循环,不停的输出数据,导致整个集群很快出现报警。后来才发现是这个计算造成的一些问题,最后差点导致那些日志上传、数据的写入都出问题,幸亏处理的比较及时。
所以,Yarn 计算空间是需要做一个配额限制,防止对整个集群造成过大的影响。
小米数据处理方式
除了底层的能力,小米数据工场也为公司及生态链企业提供一些具体的基础数据服务,用于小米信用卡的风控和额度评估、广告精准投放、限时抢购时用数据打击黄牛等等。通过数据工场提供的数据能力,企业不仅能够对业务进行数据分析,也实实在在将数据应用到核心业务场景中。
小米数据存储格式
统一采用的 Parquet,优点在于其使用的是列式存储,支持Mapreduce、Hive、Impala、Spark 和读取快、占用空间少。
客户端数据接入
客户端指的是 Wap、App 等数据,存在方式有 SDK 和服务端 Log 两种模式。下图为两种模式的优劣势。
客户端数据接入两种模式优劣势
服务器端数据源
除前端数据源外,整个处理数据时还会有大量服务器端数据源需要处理。业务数据库类,用 ETL 工具做导入。服务器端日志,用 Scribe 将数据写入 HDFS.
元数据管理
当公司业务变多后,每一个数据的处理方式都有可能不一样,这时候就凸显出元数据管理的重要性。如视频播放日志,分析师希望用 Hive,用 Impala 直接写 SQL 去计算,但数据挖掘工程师就要去写 Mapreduce,写 Spark 的方式去读,去解析。
元数据管理就是要做数据统一,既能够满足 Hive、Spark、Impala,还能满足 Mapreduce.这样一来节省大家对数据理解、执行的时间。
元数据管理
如上图,小米数据工厂是每一份数据的描述都需要在数据工厂上提交,之后数据工厂会在 MetaStore 中做建表的同时带上元数据的行为,供 Hive、Spark、Impala 使用。数据管理还会生成 Jave Class,给 Mapreduce 使用。当去解析用某个数据的时候,可以直接用这样的方式把它解析成 Jave 类。
计算管理
数据管理相对来讲是一次性的活,计算就是很复杂的事情。计算任务数一天达到几千或过万时,就会变得非常复杂。对于计算管理这块的优化,小米做了如下一些工作:
Docker
为了管理好这些纷繁的计算框架和模型,在计算的执行方面,小米使用 Docker 来解决对环境的不同需求和异构问题,并且与 Hive、Impala、Spark 这些不同的计算模型都进行了对接,去适配不同应用场景计算不同数据的模型。
另外,在不同业务场景下,同一个计算逻辑也可以选用不同的计算模型,Docker 的使用也避免了资源的浪费。比如:一个计算任务每天凌晨运行,为了追求吞吐量,可以放到 Hive 里跑;还是同样一个计算模型,现在就要跑,可以不用更改,就放到 Impala 里运行。
Docker 不仅解决了环境的异构,也解决了资源问题。
另外,Docker 的环境适应性很强,做横向扩展会比较容易。对于数据隐私方面,小米考虑得非常重。采用 Docker 与自身安全策略的综合,小米用户数据的隐私和安全性也得到了极其严格的控制。
总结
无论你用什么样的技术,一定要做好数据的积累,这是一家数据公司非常重要的部分。不仅要提前规划好数据,还要避免逻辑孤岛,还需要注意 ID 问题,也就是关联的问题。不要当采集了数据,却发现没有采用户 ID,当算到用户级别的时候,那就尴尬了。
以前讲的是流量时代,讲的是 PV 如何,而现在越来越多的业务都回到了用户时代。核心问题就是我们要做好用户的数据积累,尤其是用户模型建立。模型包括画像、用户点点滴滴行为等。这些行为在业务发展之后,尤其是要做数据挖掘,做推荐系统时,会非常有帮助。