今天给大家讲解一下大数据面试中对于数据采集部分的一些问题。
01 什么是数据采集
数据采集是大数据的基石,不论是现在的互联网公司,物联网公司或者传统的IT公司,每个业务流程环节都会产生大量的数据,同时用户操作的日志也会产生大量的数据,为了将这些结构化和非结构化的数据进行采集,我们必须要有一套完整的数据采集方案流程,为后续的数据分析应用提供数据基础。
根据不同业务场景,对于数据采集的时效性要求也是不一样的,一般分为离线数据采集和实时数据采集。
02 离线数据采集
离线数据采集主要包括从数据库中采集,如MySQL、Oracle、MongoDB等;从离线文件采集,如外部系统数据。每天凌晨会抽取前一天的数据(T+1),对于维度数据一般采用每次全量采集,对于业务数据,为了提高采集效率,同时也为了保住业务数据库的稳定性,采用每天增量采集,然后将T+1的数据合并成新的全量数据。
对于关系型数据库,如MySQL,一般是有主从数据库的,为了保住稳定和不影响主库的查询性能,我们一般抽取从库数据。对于文件数据抽取前需要先检测文件是否存在,源系统提供文件的时候需要提供对应的校验文件,校验文件里一般包含文件的记录数、字段格式等信息。采集到文件后需要对文件进行校验,文件完整的情况下才能继续后续数据处理程序。
03 实时数据采集
实时数据采集主要是一些页面日志的采集,也就是我们常说的用户行为分析数据。日志采集一般有以下几个步骤:数据埋点,数据上报,数据存储。
- 数据埋点:网站上线后一般会植入一段JS脚本,用户访问页面时,JS会收集当前页面的一些信息,用户问的上下文信息以及当前访问的页面业务相关数据。
- 数据上报:JS执行完毕后,会将所有收集到的信息拼装到一个请求内,通过日志请求将数据发送到日志服务器,存储为JSON文件;一般情况下,在 JS 执行完成后就会立即向日志服务器发送消息队列中。
- 数据存储:存储在磁盘上的文件会部署数据采集组件比如Flume,将采集到的日志数据发送到HDFS进行存储或者转存到HBase进行存储。消息队列的数据则可以直接消费落地到HDFS或者HBase进行存储。
04 数据采集的问题
- 是不是所有的日志数据都实时采集?
用户的每个操作都会产生一个操作日志,但并不是每生成一条日志就实时上报至服务器,而是在产生日志后,先暂存在客户端本地,再结合着相应的上报控制策略进行数据上报。其中上报策略主要指根据日志的业务特性,数据的时效性,用户的网络特性等等信息设定不同的上报策略,有些日志会因为其数据时效性的要求进行实时数据上报,而有些日志则会在用户启动应用,或者间隔一段时间后将日志上报上来。
- 总是找不到想要的埋点数据?
在实际业务数据采集中会发现每个模块的业务数据格式都是不一样的。因此就需要设计一种日志数据采集标准,可以针对特定的业务场景,制定通用的数据采集标识,研发人员在进行页面埋点时,依据标准的数据采集标识规则进行埋点,从而收集业务的详细信息。这个标准需要产品经理、前端开发人员、数据开发人员、数据分析人员、数据运营人员等多方达成一致,确保后面产品展现、埋点开发、模型开发、数据分析和运营能够正常开发、解析、统计分析数据。
- 如何对多个业务生成唯一标识?
在数据埋点中如何唯一确定用户的身份一件很重要的工作,因为如果做不到用户的唯一标识,那么后续很多数据模型是无法构建的。所以在设计埋点标准时,一般会包含用的设备ID和用户ID,关于设备ID安卓和IOS的方法也不一样,大家可以搜索相关资料(https://zhuanlan.zhihu.com/p/152051748);用户ID,也就是我们常说的注册账号。
05 数据采集用到的大数据技术
在数据采集中用到了哪些大数据技术呢?可以看到数据采集组件,消息中间件,数据存储组件等,后续我们来一一讲解每个技术。