互联网业务实战(三)--ETL和推荐

这篇简单聊下互联网的日志分析和推荐,日志分析过程就是ETL,就是对数据的各种处理。推荐是头条的一个强项,尤其在信息流领域。推荐实现了千人千面,使得今日头条和抖音能够更好留住用户。

因为工作本职是web后端开发,但因为业务需要,以及头条开放共享的文化氛围,能够有机会去学习。大部分都是看文档学习到的,所以也只是了解的水平。

日志分析之ETL

在互联网领域,日志是个很重要的东西。日志范围比较广,包括代码里的调试日志,比如info、debug、warn等级别的日志,也包括操作日志。比如今日头条APP,你打开了APP会有一个启动日志,然后点击了文章会有click日志,从文章退出也会有一个日志,关闭APP也会发日志。这些日志对于公司来说是宝贵的资源,通过日志可以得到某个用户看这篇文章花了多少时间,将日志汇总可以统计这篇文章的平均阅读时间是多少,因为有些标题党的文章虽然阅读量大,但质量差阅读时长比较小。

对于To B的研发,可能很少会想到种竟然操作也要发日志。因为B端用户的行为分析需求很少,B端的很多需求都是比较确定的,客户的需求会通过销售直接反馈给研发。

这么多日志是怎么采集又是怎么上报的,上报之后又是怎么处理的。日志处理哇往往需要大量研发投入。首先需要客户端配合,在Android或iOS客户端中使用对应的组件,采集到这些日志,然后发给服务端。发送也是有讲究的,会定期集中发送,比如半分钟或一分钟,而不是一个操作就发送一次,那样请求太多了,服务器扛不住。还有就是日志内容和格式,到底哪些要发,怎么发,也是有一套框架去约束的。而且格式还会结合后端的处理方式去做。

发给后台服务器,一般是直接丢kafka。为什么直接丢kafka? 那不丢kafka怎么处理了,存数据库还是直接统计分析? 不仅直接丢kafka,kafka后面还有好几级kafka。 当然后台服务在丢kafka之前还是做了些处理的, 不然APP发送一次日志就扔kafka,如果上亿用户同时使用,对kafka集群的压力相当大,需要建立很多tcp连接。

到了kafka又怎么处理了,因为客户端只管发送日志,不管你是哪个业务的,所有业务的日志都是统一丢过来。今日头条上的业务太多了,图文、视频、体育、音乐,每个业务要的数据是不一样的。也就是在1分钟之内,你看了一个视频,又看了一篇文章,这两者的日志会一起发到kafka。但在头条内部,图文和视频是不同的项目组在负责,各个组关心的数据不一样。A组只关心图文,B组只关心视频。所以第一级kafka出来之后先做一个简单聚合处理,然后再发到下级kafka,处理后再发,数据流如下:
互联网业务实战(三)--ETL和推荐

只有kafka当然不能叫ETL,中间还得结合spark、flink做实时处理和统计。然后kakfa的数据也要落hive用于离线分析,包括小时级和天级。

在日常工作中,产品或运营很多时候都需要看小时级的数据,比如改了推荐策略,每次刷新改为强制出一个视频,想看下这个策略上线的效果。改推荐是非常慎重的,改了后很快就会生效,因为头条的推荐模型是实时训练和更新的。这个时候就需要看小时级的数据(当然更多的是看grafana看板),比如文章的平均点击率,并且按分类拆开,分类就是历史、财经、新闻等。这个需求就可以通过这套ETL实现,将kafka数据每一个小时落一次hive,然后通过跑hive进行分析。

但是hive还是太慢了,尤其数据量大的时候。所以又有了clickhouse,头条也在广泛使用,统计数据比hive快很多,并且还能自动做成图表。

在大厂,一份数据往往会存储多次,但是不同的格式,会在不同平台做转换。比如mysql落hive,mysql转es,kafka落hive,es落hive,转来转去的,目的就是为了各种业务需要。

推荐

推荐是每个公司的核心,因为推荐做的好,点击率提升1个百分点,那对公司收益提升可能是千万级的。一般说推荐会加个推荐引擎,并且讲究效率会用c++开发,因为推荐引擎是总的出口,并发大延迟低。

推荐的通用框架如下图,现在的推荐引擎一般都是包括召回、粗排、精排三个阶段。头条也是这样,但很多细节做的比较好,所以效果好。之前看过讲推荐入门的文章,暂时没找到链接。
互联网业务实战(三)--ETL和推荐

推荐有很多难点需要解决,而不像业务后台开发主要写crud。比如召回,怎么做到快速给千万级别的用户从千亿级别的文章筛选出可能喜欢看的文章;召回之后怎么做去重,不能让用户老是看重复的内容;召回之后排序怎么更精准。粗排和精排会用到机器学习和深度学习模型,比如FM、DeepFM等,怎么做模型的离线、在线训练和更新?推荐模型是大规模稀疏模型,模型规模非常大,怎么做分布式训练?还有怎么做好监控和debug工具?推荐策略一直会调整上线,那推荐策略到底是有效还是没效,肯定得有数据监控着。

推荐模型的训练实际用的是上面介绍的日志数据,日志数据反映了用户的行为。头条的推荐主要是结合用户的行为来推的,对于新用户是冷启动阶段,是随机推的,得等用户用一段时间,数据采集够了,模型才能推的准。日志ETL出来后的数据然后再做些其他处理再用于模型训练。

关于推荐理论,可以看下项亮大佬的《推荐系统实战》,项亮也是头条推荐的负责人。当然看完书之后你还是不会怎么做推荐引擎。头条的推荐现在大部分都是结合业务想策略,因为整个推荐流程已经打通且稳定运行了,也有部分在研究新的模型提升预测准确度。