您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[美团研究院]:2019-2021美团技术年货:编写更美好的生活(综合篇) - 发现报告
当前位置:首页/行业研究/报告详情/

2019-2021美团技术年货:编写更美好的生活(综合篇)

2019-2021美团技术年货:编写更美好的生活(综合篇)

2019-2021美团技术年货CODE A BET TER LIFE【综合篇】 数据·安全·测试 | 2021 1美团外卖实时数仓建设实践 1美团酒旅数据治理实践 14实践之后,我们来谈谈如何做好威胁建模 37Fairplay DRM 与混淆实现的研究 59Spock 单元测试框架介绍以及在美团优选的实践 78美团 App 页面视图可测性改造实践 114数据 | 2020 131Apache Kylin 的实践与优化 131Apache Doris 在美团外卖数仓中的应用实践 148美团配送数据治理实践 164美团内部讲座|北航全权:一种城市空中移动性管理分布式控制框架 188运维 / 安全 | 2020 206AIOps 在美团的探索与实践——故障发现篇 206复杂风控场景下,如何打造一款高效的规则引擎 231隐藏在浏览器背后的“黑手” 246云原生之容器安全实践 260工程师文化 | 2020 275美团技术十年:让我们感动的那些人那些事 275目录 推荐收藏 | 美团技术团队的书单 294工程师的基本功是什么?该如何练习?听听美团技术大咖怎么说 309想进美团不知道选哪个技术岗位?这里有一份通关秘籍! 314青年人在美团是怎样成长的? 336大数据 | 2019 359Hadoop YARN:调度性能优化实践 360将军令:数据安全平台建设实践 379OneData 建设探索之路:SaaS 收银运营数仓建设 397研发团队资源成本优化实践 414Jupyter 在美团民宿的应用实践 428人物志 | 2019 450MIT 科技创新“远见者”:美团 NLP 负责人王仲远 450美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年 466 美团外卖实时数仓建设实践作者:朱良 玉良 文博 山林实时数仓以端到端低延迟、SQL 标准化、快速响应变化、数据统一为目标。美团外卖数据智能组总结的最佳实践是:一个通用的实时生产平台跟一个通用交互式实时分析引擎相互配合,同时满足实时和准实时业务场景。两者合理分工,互相补充,形成易开发、易维护且效率高的流水线,兼顾开发效率与生产成本,以较好的投入产出比满足业务的多样性需求。01 实时场景实时数据在美团外卖的场景是非常多的,主要有以下几个方面: ●运营层面:比如实时业务变化,实时营销效果,当日营业情况以及当日分时业数据·安全·测试 2 > 2021年美团技术年货务趋势分析等。 ●生产层面:比如实时系统是否可靠,系统是否稳定,实时监控系统的健康状况等。 ●C 端用户:比如搜索推荐排序,需要实时行为、特点等特征变量的生产,给用户推荐更加合理的内容。 ●风控侧:实时风险识别、反欺诈、异常交易等,都是大量应用实时数据的场景。02 实时技术及架构1. 实时计算技术选型目前,市面上已经开源的实时技术还是很多的,比较通用的有Storm、Spark Streaming 以及Flink,技术同学在做选型时要根据公司的具体业务来进行部署。美团外卖依托于美团整体的基础数据体系建设,从技术成熟度来讲,公司前几年主要用的是 Storm。当时的 Storm,在性能稳定性、可靠性以及扩展性上也是无可替代的。但随着 Flink 越来越成熟,从技术性能上以及框架设计优势上已经超越了Storm,从趋势来讲就像 Spark 替代 MR 一样,Storm 也会慢慢被 Flink 替代。当然,从 Storm 迁移到 Flink 会有一个过程,我们目前有一些老的任务仍然运行在Storm 上,也在不断推进任务迁移。具体Storm 和 Flink的对比可以参考上图表格。 数据·安全·测试 < 32. 实时架构① Lambda 架构Lambda 是比较经典的一款架构,以前实时的场景不是很多,以离线为主,当附加了实时场景后,由于离线和实时的时效性不同,导致技术生态是不一样的。而 Lambda架构相当于附加了一条实时生产链路,在应用层面进行一个整合,双路生产,各自独立。在业务应用中,顺理成章成为了一种被采用的方式。双路生产会存在一些问题,比如加工逻辑 Double,开发运维也会 Double,资源同样会变成两个资源链路。因为存在以上问题,所以又演进了一个 Kappa 架构。② Kappa 架构 4 > 2021年美团技术年货Kappa 从架构设计来讲,比较简单,生产统一,一套逻辑同时生产离线和实时。但是在实际应用场景有比较大的局限性,在业内直接用 Kappa 架构生产落地的案例不多见,且场景比较单一。这些问题在美团外卖这边同样会遇到,我们也会有自己的一些思考,将会在后面的章节进行阐述。03 业务痛点首先,在外卖业务上,我们遇到了一些问题和挑战。在业务早期,为了满足业务需要,一般是 Case By Case 地先把需求完成。业务对于实时性要求是比较高的,从时效性的维度来说,没有进行中间层沉淀的机会。在这种场景下,一般是拿到业务逻辑直接嵌入,这是能想到的简单有效的方法,在业务发展初期这种开发模式也比较常见。如上图所示,拿到数据源后,我们会经过数据清洗、扩维,通过 Storm 或 Flink 进行业务逻辑处理,最后直接进行业务输出。把这个环节拆开来看,数据源端会重复引用相同的数据源,后面进行清洗、过滤、扩维等操作,都要重复做一遍。唯一不同的是业务的代码逻辑是不一样的,如果业务较少,这种模式还可以接受,但当后续业务量上去后,会出现谁开发谁运维的情况,维护工作量会越来越大,作业无法形成统一管理。而且所有人都在申请资源,导致资源成本急速膨胀,资源不能集约有效利用,因此要思考如何从整体来进行实时数据的建设。 数据·安全·测试 < 504 数据特点与应用场景那么如何来构建实时数仓呢?首先要进行拆解,有哪些数据,有哪些场景,这些场景有哪些共同特点,对于外卖场景来说一共有两大类,日志类和业务类。 ●日志类:数据量特别大,半结构化,嵌套比较深。日志类的数据有个很大的特点,日志流一旦形成是不会变的,通过埋点的方式收集平台所有的日志,统一进行采集分发,就像一颗树,树根非常大,推到前端应用的时候,相当于从树根到树枝分叉的过程(从 1 到 n 的分解过程)。如果所有的业务都从根上找数据,看起来路径最短,但包袱太重,数据检索效率低。日志类数据一般用于生产监控和用户行为分析,时效性要求比较高,时间窗口一般是 5min 或10min,或截止到当前的一个状态,主要的应用是实时大屏和实时特征,例如用户每一次点击行为都能够立刻感知到等需求。 ●业务类:主要是业务交易数据,业务系统一般是自成体系的,以 Binlog 日志的形式往下分发,业务系统都是事务型的,主要采用范式建模方式。特点是结构化,主体非常清晰,但数据表较多,需要多表关联才能表达完整业务,因此是一个 n 到 1 的集成加工过程。而业务类实时处理,主要面临的以下几个难点: ●业务的多状态性:业务过程从开始到结束是不断变化的,比如从下单 -> 支付 -> 配送,业务库是在原始基础上进行变更的,Binlog 会产生很多变化的日 6 > 2021年美团技术年货志。而业务分析更加关注最终状态,由此产生数据回撤计算的问题,例如 10点下单,13 点取消,但希望在 10 点减掉取消单。 ●业务集成:业务分析数据一般无法通过单一主体表达,往往是很多表进行关联,才能得到想要的信息,在实时流中进行数据的合流对齐,往往需要较大的缓存处理且复杂。 ●分析是批量的,处理过程是流式的:对单一数据,无法形成分析,因此分析对象一定是批量的,而数据加工是逐条的。日志类和业务类的场景一般是同时存在的,交织在一起,无论是 Lambda 架构还是Kappa 架构,单一的应用都会有一些问题。因此针对场景来选择架构与实践才更有意义。05 实时数仓架构设计1. 实时架构:流批结合的探索基于以上问题,我们有自己的思考。通过流批结合的方式来应对不同的业务场景。如上图所示,数据从日志统一采集到消息队列,再到数据流的 ETL 过程,作为基础数据流的建设是统一的。之后对于日志类实时特征,实时大屏类应用走实时流计算。对于 Binlog 类业务分析走实时 OLAP 批处理。流式处理分析业务的痛点是什么?对于范式业务,Storm 和 Flink 都需要很大的外存,来实现数据流之间的业务对齐,需要大量的计算资源。且由于外存的限制,必须 数据·安全·测试 < 7进行窗口的限定策略,最终可能放弃一些数据。计算之后,一般是存到 Redis 里做查询支撑,且 KV 存储在应对分析类查询场景中也有较多局限。实时 OLAP 怎么实现?有没有一种自带存储的实时计算引擎,当实时数据来了之后,可以灵活的在一定范围内自由计算,并且有一定的数据承载能力,同时支持分析查询响应呢?随着技术的发展,目前 MPP 引擎发展非常迅速,性能也在飞快提升,所以在这种场景下就有了一种新的可能。这里我们使用的是 Doris 引擎。这种想法在业内也已经有实践,且成为一个重要探索方向。阿里基于 ADB 的实时OLAP 方案等。2. 实时数仓架构设计从整个实时数仓架构来看,首先考虑的是如何管理所有的实时数据,资源如何有效整合,数据如何进行建设。从方法论来讲,实时和离线是非常相似的。离线数仓早期的时候也是Case By Case,当数据规模涨到一定量的时候才会考虑如何治理。分层是一种非常有效的数据治理方式,所以在实时数仓如何进行管理的问题上,首先考虑的也是分层的处理逻辑,具体内容如下: ●数据源:在数据源的层面,离线和实时在数据源是一致的,主要分为日志类和业务类,日志类又包括用户日志、DB 日志以及服务器日志等。 ●实时明细层:在明细层,为了解决重复建设的问题,要进行统一构建,利用离线数仓的模式,建设统一的基础明细数据层,按照主题进行管理,明细层的目的是给下游提供直接可用的数据,因此要对基础层进行统一的加工,比如清洗、过滤、扩维等。 ●汇总层:汇总层通过 Flink 或 Storm 的简洁算子直接可以算出结果,并且形成汇总指标池,所有的指标都统一在汇总层加工,所有人按照统一的规范管理建设,形成可复用的汇总结果。 8 > 2021年美团技术年货总结起来,从整个实时数仓的建设角度来讲,首先数据建设的层次化要先建出来,先搭框架,然后定规范,每一层加工到什么程度,每一层用什么样的方式,当规范定义出来后,便于在生产上进行标准化的加工。由于要保证时效性,设计的时候,层次不能太多,对于实时性要求比较高的场景,基本可以走上图左侧的数据流,对于批量处理的需求,可以从实时明细层导入到实时 OLAP 引擎里,基于 OLAP 引擎自身的计算和查询能力进行快速的回撤计算,如上图右侧的数据流。06 实时平台化建设架构确定之后,我们后面考虑的是如何进行平台化的建设,实时平台化建设是完全附加于实时数仓管理之上进行的。 数据·安全·测试 < 9首先进行功能的抽象,把功能抽象成组件,这样就可以达到标准化的生产,系统化的保障就可以更深入的建设,对于基础加工层的清洗、过滤、合流、扩维、转换、加密、筛选等功能都可以抽象出来,基础层通过这种组件化的方式构建直接可用的数据结果流。这会产生一个问题,用户的需求多样,为了满足了这个用户,如何兼容其他的用户,因此可能会出现冗余加工的情况。从存储的维度来讲,实时数据不存历史,不会消耗过多的存储,这种冗余是可以接受的,通过冗余的方式可以提高生产效率,是一种以空间换时间思想的应用。通过基础层的加工,数据全部沉淀到 IDL 层,同时写到 OLAP 引擎的基础层,再往上是实时汇总层计算,基于 Storm、Flink 或 Doris,生产多维度的汇总指标,形成统一的汇总层,进行统一的存储分发。当这些功能都有了以后,元数据管理,指标管理,数据安全性、SLA、数据质量等系统能力也会逐渐构建起来。1. 实时基础层功能实时基础层的建设要解决一些问题。首先是一条流重复读的问题,一条 Binlog 打过来,是以 DB 包的形式存在的,用户可能只用其中一张表,如果大家都要用,可能存在所有人都要接这个流的问题。解决方案是可以按照不同的业务解构出来,还