当前位置:首页 >爱情故事 >日均百亿级日志处理:微博基于Flink的实时计算平台建设

日均百亿级日志处理:微博基于Flink的实时计算平台建设

2019-12-08 13:02:20 [短篇小说] 来源:郁金网
作者介绍了微博广告高级数据开发工程师、实时数据项目组组长陆魏勇。 微博广告实时数据开发工程师黄鹏负责法拉第实验平台、实时数据关联平台、实时算法特征数据计算、实时数据仓库和实时数据清理组件开发的数据开发。 微博广告高级数据开发工程师林发明负责算法实时特征数据的计算、实时数据关联平台、实时数据仓库和FlinkStream组件开发工作。 微博广告高级数据开发工程师崔泽峰负责实时算法特征数据计算、实时任务管理平台、FlinkStream组件和FlinkSQL扩展开发工作。 引言是随着微博服务线的快速扩张,微博广告的各种服务日志数量也急剧增加。 基于Hadoop生态的传统离线数据存储和计算方案已经在业界形成了统一的默契。然而,由于离线计算时效性的限制 ,越来越多的数据应用场景已经从离线变为实时 微博广告实时数据平台就是在这样的背景下设计和构建的 。目前,系统已支持每日平均处理日志数超过一百亿条,访问产品线和几种类型的业务日志 首先,与Spark相比,Spark的生态环境更加完善,暂时领先于机器学习的集成和应用。 然而,Flink,下一代大数据引擎的强大竞争对手,在流计算方面有着明显的优势。FLINK属于流计算中真正的单一进程,每一条数据都会触发计算,而不是像Spark这样的迷你批处理作为流处理的折衷。 Flink的容错机制相对较轻,对吞吐量影响不大。此外,Flink对图形和调度进行了一些优化,这使得Flink获得了很高的吞吐量。 Strom的容错机制要求每条数据都有ack,因此它的吞吐量瓶颈也受到了批评 。 这里引用了一个图表来比较常用的实时计算框架 。 Flink是一个开源分布式实时计算框架 Flink是有状态的和容错的,可以无缝地从故障中恢复,同时保持应用程序的状态一次。它支持大规模计算能力,可以在数千个节点上并发运行。它具有良好的吞吐量和延迟特性 同时,Flink提供了多种灵活的窗口功能 1)状态管理机制Flink检查点机制可以保持精确一次语义的计算 状态维护意味着应用程序可以保存处理后的数据集结果和状态 。 2)事件机制Flink支持流处理和窗口事件时间语义 事件时间可以很容易地从事件到达的顺序和事件可能的到达延迟流中计算出准确的结果。 Flink窗口机制支持基于时间、数量和会话的非常灵活的窗口机制。 窗口的触发条件可以定制,以支持更复杂的流动模式。 4)容错机制Flink的高效容错机制允许系统以高吞吐量精确支持一次语义计算 Flink可以准确、快速地从故障中恢复,实现零数据丢失 5)高吞吐量和低延迟Flink具有高吞吐量和低延迟(能够快速处理大量数据)的特点 下图显示了Apache Flink和Apache Storm在完成分布式项目计数任务时的性能比较 第二 ,在架构演化之初,架构之初的架构只有两层计算和存储 ,在新的计算需求被访问之后,需要开发一个新的实时计算任务来上线。 重复模块的代码重用率低,重复率高。计算任务之间的差异主要集中在任务的计算指标口径上。 在存储层,每个需求方所需的存储路径不同,计算索引可能在不可访问的存储引擎上重复,可能会浪费计算资源和存储资源 。 此外 ,指标的计算标准只限于单个任务的要求,同一指标的计算标准也不统一地限于无要求任务的保证。 每个业务方还在不同的存储引擎上开发数据采集服务。对于那些专注于数据应用程序本身的团队来说,毫无疑问,当前的模型有一些缺点。 随着后期数据量的增加和业务线的扩展 ,前期架构模式的弊端逐渐开始显现。 从单一需求和单一任务的原始模式逐渐向通用数据架构模式转变 为此,我们开发了一些基于Flink框架的通用组件 ,以支持快速数据访问,并确保代码模式的一致性和可维护性。 在数据层,我们使用Clickhouse作为数据仓库的计算和存储引擎,利用其支持多维OLAP计算的特点来处理多维多索引大数据量下的快速查询需求。 在数据分层方面,我们借鉴和借鉴离线数据仓库的经验和方法,构建多层实时数据仓库服务,开发各种微服务,为数据聚合、索引提取、数据导出、数据质量、报警监控等提供支持。数据仓库的 整体架构分为五层:1)访问层:访问原始数据进行处理,如卡夫卡(Kafka)、拉比(RabbitMQ)、文件(File)等。 2)计算层:选择Flink作为实时计算框架,对实时数据进行清理和关联。 3)存储层:对清理后的数据进行数据存储。我们分层构建了实时数据仓库模型,并将不同应用场景的数据存储在Clickhouse、Hbase、Redis、Mysql等存储器中。 在服务中,抽象公共数据层和维度层的数据,分层处理压缩数据 ,统一数据口径 4)服务层:向外界提供统一的数据查询服务,支持从底层细节数据到5分钟/10分钟/1小时的汇总层数据的多维计算服务 同时 ,顶层特征索引数据,如输入到Redis和Mysql的计算层,也是从这个数据接口获得的 5)应用层:以统一查询服务为支持,支持各业务线数据场景 监控报警:监控Flink任务的生存状态,对异常任务发出电子邮件报警,并根据设定的参数自动拉起和恢复任务 根据卡夫卡消费等偏移指标,对消费处理延迟的实时任务进行报警提醒 数据质量:监控实时数据指标,定期将历史实时数据与离线蜂箱计算数据进行比较,提供实时数据的数据质量指标,超过阈值的报警指标数据 3.数据处理流程1。访问原始数据后,通过ETL处理整个流程的整体数据,进入实时数据仓库的底层数据表,通过配置的聚合微服务组件向上聚合分层数据 根据不同服务的索引需求,也可以通过特征提取微服务直接配置,并从Redis、es和Mysql等多个仓库中提取 大多数数据需求可以通过统一的数据服务接口获得 。 2.问题和挑战由于不同的业务日志,原始日志数据的维度或指标数据不完整 因此,需要实时日志关联来获得不同维度条件下索引数据的查询结果 此外,相关日志的返回周期也不同,包括在10分钟内完成95%以上返回的业务日志 ,以及依赖第三方返回的任务日志,例如延迟时间超过1天的激活日志。 最大日志相关任务的日平均数据量超过10亿,如何快速处理和构建实时相关任务是摆在我们面前的首要问题。 为此,我们开发了一个基于Flink框架的可配置关联组件。 对于不同关联日志的索引提取 ,我们还开发了一个可配置的索引提取组件来快速提取复杂的日志格式 。 上述两个自行开发的组件将在以下内容中详细描述。 1)如何处理返回周期超过相关窗口的日志 ?对于回发较晚的日志,我们没有在相关窗口中获得相关结果 。 我们使用实时+离线方法来完成数据回刷 对于实时处理的日志,我们将把未关联的原始日志输出到另一个临时存储位置(卡夫卡) 。同时 ,我们将继续使用和处理未关联的日志集,设置超时重新关联时间和超时重新关联时间,并在超过任何设置的阈值后再次重新关联。 在离线部分,我们使用Hive计算昨天的全天日志,并将n天内的全部相关日志进行关联,并写回最终结果以替换昨天实时计算的相关数据 2)如何提高Flink任务性能?(1)操作员链为了更有效地分布式执行,Flink会尽可能将操作员子任务链接(链)在一起形成一个任务 每个任务在一个线程中执行。 将操作符链接到任务是一种非常有效的优化:它可以减少线程之间的切换,减少消息的序列化/反序列化,减少缓冲区中的数据交换 ,减少延迟,同时提高整体吞吐量 Flink会将代码中可以优化的操作符优化成在作业图生成阶段任务(线程)中执行的操作符链(Operator Chains),从而降低线程间切换和缓冲的开销,提高整体吞吐量和延迟。 下面是官方网站上的一个例子 在图中,源操作符、映射操作符、[键盘操作符|窗口操作符|应用操作符]和接收器操作符的并行度分别为2、2、2、2和1。Flink优化后,源操作符和映射操作符形成一个操作符链,该操作符链作为任务在线程上运行。该图显示在精简视图中,并行图显示在并行视图中 。 运营商之间能否形成运营商链取决于是否满足以下条件:上下游运营商的并行性一致;下游节点的入口为1;上游和下游节点都在同一个时隙组中;下游节点的链策略总是;;上游节点的链策略是“总是”或“头”;;转发两个节点之间的数据划分模式;;用户没有禁用链 。 (2) Flink异步输入输出流计算通常需要与外部系统交互 然而,通常需要很长时间才能建立连接,并在一个连接中等待通信 。 下图是两种方法的比较示例:图中的棕色条表示等待时间,可以发现网络等待时间极大地阻碍了吞吐量和延迟 。 为了解决同步访问的问题,异步模式可以同时处理多个请求和回复。 换句话说,您可以连续发送用户a、b、c等的请求。同时,您可以处理首先返回的请求的响应 ,因此不需要阻塞连续请求之间的等待,如上图右侧所示。 异步输入输出就是这样实现的。 (3)检查点优化Flink实现了一套强大的检查点机制,不仅可以获得高吞吐量性能,还可以确保精确一次级的快速恢复 提高检查点性能的第一件事是存储引擎的执行效率。 Flink正式支持的三种检查点状态存储方案中 ,内存仅用于调试级别,不能用于故障后的数据恢复。 还有Hdfs和Rocksdb。当检查点的数据量较大时,可以将Rocksdb视为检查点的存储,以提高效率。 第二个想法是建立资源。我们都知道检查点机制将在每个任务上实施 。在总状态数据大小不变的情况下,如何分配和减少由单个任务划分的检查点数据成为提高检查点执行效率的关键 。 最后,增量快照。在非增量快照下,每个检查点包含作业的所有状态数据 在大多数场景中,前后检查点的数据变化相对较少,因此设置增量检查点只会存储和计算最后一个检查点和当前检查点之间的状态差异,从而减少检查点的时间消耗。 3)如何确保任务的稳定性?在任务执行过程中,会遇到各种问题,导致任务异常甚至失败。 因此,做好异常情况下的恢复工作极其重要。 (1)设置重启策略Flink支持不同的重启策略 ,以控制故障发生时作业如何重启 群集将以默认重启策略启动 ,当未定义特定重启策略时将使用该策略。 如果在提交作业时指定了重新启动策略,它将覆盖群集的默认策略。 默认重启策略可以通过Flink的配置文件flink-conf.yaml来指定 配置参数重启策略定义了使用哪个策略 常见重启策略:固定延迟;失败率;不重启 (2)设置HAFlink来指定任务启动时的高可用性配置 ,主要是使用Zookeeper在所有运行的作业管理器实例之间进行分布式协调。动物园管理员通过领导者选择和轻量级一致的状态存储提供高度可用的分布式协调服务 (3)任务监控与报警平台在实际环境中,我们遇到了由于集群状态不稳定而导致的任务失败 在Flink 1.6版中,任务甚至有一个假死亡,也就是说,当Flink任务实际死亡时,纱线上的作业资源仍然存在。 为了监控和恢复这些异常任务,统一管理提交、报警监控和任务恢复等实时任务,我们开发了一个任务提交和管理平台。 壳牌公司将纱线上的运行状态和弗林克作业状态列表进行比较,监控心跳监控平台上的所有任务,并执行报警和自动恢复等操作。 ④在作业指示器监控Flink任务运行期间,每个操作员将生成自己的指示器数据。例如,“来源”将生成各种指标信息,如数字记录、数字记录来源等。我们将收集这些指示器信息,并将其显示在可视化平台上。 指标平台如下:⑤任务操作节点监控我们的Flink任务都在纱线上运行。对于每个正在运行的作业,我们需要监控其操作环境 将收集作业管理器和任务管理器的每个指标。 收集的指标有jobmanager-fullgc-count、jobmanager-younggc-count、jobmanager-fullgc-time、taskmanager-fullgc-count、Taskmanager-younggc-count、taskmanager-fullgc-time、taskmanager-younggc-time等。用于判断任务运行环境的健康状况并排除可能出现的问题。 监控界面如下:4 .数据关联组件1。如何选择关联方法 ?1)Flink Table从Flink的官方文档中,我们知道Flink的编程模型分为四层,sql是最高的api ,Table api是中间层,DataTeam/DataSet Api是核心,有状态流处理层是底层实现 开始时,我们直接使用Flink Table作为数据关联方法,直接将被访问的数据流注册为动态表(Dynamic Table)来执行两表关联查询,如下图所示:但是,经过尝试,我们发现当使用大日志数据量进行关联查询时,我们只能在很小的时间窗口内进行查询,否则,我们将会超过单个数据节点的内存限制 ,并生成异常。 然而,为了满足不同服务日志延迟到达的情况 ,这种实现方法并不通用 。 2)Rocksdb之后,我们直接在数据流(DataStream)上进行处理,在CountWindow窗口中进行关联操作,将关联数据的哈希分散并存储在每个数据节点的Rocksdb中,使用Flink State支持Rocksdb作为检查点的本机特性来备份和恢复操作符中的数据。 这种方法是可行的,但是由于Rocksdb群集物理磁盘是非固态硬盘,这种方法需要很长时间才能在我们实际的在线场景中进行关联。 3)与外部存储(如Redis)相关联的千伏存储确实大大提高了查询速度,但是大的单个日志大小(如广告日志数据)占用了大量宝贵的机器内存资源 经过调查,我们选择Hbase作为日志关联组件的关联数据存储方案。 为了快速构建相关任务,我们开发了一个基于Flink的配置组件平台。提交配置文件可以生成数据关联任务,并自动将其提交给集群 下图显示了任务执行的处理流程。 原理图如下:下图是相关组件内的执行流程图:2。问题和优化1)连接间隔连接随着日志数量的增加,需要关联的日志数量可能达到每天数十亿甚至数十亿个。 为早期关联组件配置和生成任务的方式确实解决了大多数在线业务需求,但是随着进一步关联需求的增加,Hbase面临巨大的查询压力。 在我们优化了Hbase表(包括rowkey)之后,我们开始了相关组件的迭代和优化。 第一步是减少Hbase的查询。 我们使用Flink Interval Join方法首先完成程序内部的大多数关联要求,只有少量仍需要查询的日志将被查询外部存储(Hbase) 。已经验证,以请求日志和实验日志之间的关联为例 ,设置间隔连接窗口可以减少80%的hbase查询请求(1)间隔连接的语义示意图数据连接的间隔——例如,时间为3的exp将在IMP时间[2,4的间隔内连接);水印-例如,如果EXP的数据时间为3,IMP的数据时间为5,那么水印是通过从实际最小值中减去上博来生成的 ,即最小值(3,5)-1 = 2;过期数据-出于性能和存储方面的考虑,应该清除过期数据,如图所示,水印为2时,以及时间2之前的数据过期并可以清除。 (2)intervaljoin的内部实现逻辑(3)interval Join的转换是内部连接,因为Flink的原始interval Join ,而我们业务中需要的是左连接。具体转换如下:取消右数据流的连接标志位;当左侧数据流中存在连接数据时 ,状态不存在 2)关联率的动态监控在任务执行过程中,经常会出现意外情况,如缺少关联数据日志或日志格式错误导致异常,导致关联任务的关联率严重下降 此时,相关任务继续运行,但它们对整体数据质量没有什么意义,甚至有相反的效果。 当任务恢复时 ,还需要清除异常间隔中的数据,并在处理前将卡夫卡偏移(Kafka Offset)设置为异常前的位置。 因此,我们为相关组件的优化增加了动态监控 。下图显示:在相关任务中,定期检测是否有最新数据写入Hbase的指定时间范围。如果没有,如果写Hbase时出现问题,则终止相关任务;当写入Hbase任务堆积时 ,相关率将相应下降,当相关率低于指定阈值时,相关任务将终止。当相关联的任务被终止时,将发出警报,并且在上游任务被修复之后 ,相关联的任务可以被恢复,以确保相关联的数据不会丢失。 5.数据清理组件为了快速从日志数据中提取索引,我们开发了一个基于Flink计算平台的索引提取组件Logwash 基于Freemaker的模板引擎被打包为日志格式的解析模块,它提取日志、执行算术运算、判断条件、替换日志以及循环遍历日志。 下图显示了Logwash组件的处理流程:该组件支持两种类型日志的解析和提取,文本和Json。目前,清理组件已经支持了近100条微博广告的实时清理需求,为运维团队和其他第三方非实时计算人员提供了快速提取日志的能力。 配置文件的一些例子:6。FlinkStream组件库中DataStream的开发Flink提取公共逻辑和相同的代码来生成我们的公共组件库FlinkStream FlinkStream包括拓扑的抽象和默认实现、流的抽象和默认实现、源的抽象和一些实现、运算符的抽象和一些实现、接收器的抽象和一些实现以及一些实现 。 任务提交统一使用可执行Jar和配置文件。Jar将读取配置文件来构建相应的拓扑图 1.源抽象抽象源,创建抽象类和相应的接口。对于Flink连接器中的现有实现,如卡夫卡和弹性搜索 ,直接创建新类并继承接口来实现相应的方法 对于需要自己实现的连接器,直接继承抽象类和相应的接口并实现方法 目前,仅实现了KafkaSource。 2.运算符抽象与源抽象相似。我们已经实现了基于流到流级别的操作符抽象 创建抽象操作类,抽象转换方法 对于要实现的转换操作,直接继承抽象类并实现其抽象方法 根据文档,直接使用当前实现的运算符。 以下几点:3 .接收器抽象对于接收器,我们还创建了抽象类和接口 封装Flink连接器中存在的接收器 目前,可以通过配置输出数据的接收器是可用的 。 目前,实现和打包的接收器组件有:卡夫卡、标准输出、弹性搜索、点击屋、Hbase、Redis 、MySQL 4.流抽象创建流抽象类和抽象方法构建流,用于构建流图 我们已经实现了默认流。构建流方法读取源配置以生成数据流,通过操作员配置列表顺序生成拓扑图,并通过接收器配置生成数据写出组件 5.拓扑抽象对于单个流,要处理的逻辑可能相对简单 。它主要读取各种数据操作的源并输出它 针对复杂的多流业务需求,如多流连接、多流联合 、分流等。,我们抽象多流业务并生成拓扑 可以在拓扑层配置多数据流。 对于常见的操作,我们已经实现了默认拓扑,并且我们可以通过配置文件直接实现业务需求。 对于更复杂的业务场景,用户可以自己实现拓扑 6.配置我们可以为抽象组件配置。我们通过编写配置文件直接构建任务的运行拓扑,并在启动任务时指定配置文件。 文本框Flink环境已配置 ,包括时间处理类型、重启策略、检查点等。拓扑是可配置的 ,可以配置处理逻辑和接收器;不同溪流之间;流可配置、可配置源、操作员列表、接收器 配置示例如下:run _ env:time characters:“处理时间”#处理时间\导入时间\ eventtimerestart: # restart策略配置类型:# norestart 。fixedDelayRestart,fallBackRestart ,FailureRatereStart检查点:# Open检查点类型:“Rocksdb”# Streams:ImpStream:# Fan经济暴露日志类型:“defaultstream”配置:源:类型:“kafka011”#源是Kafka 011版本配置:并行度:20运算符:-类型:“stringmap”配置:-类型:“spli tElement”配置:...-类型:“SelectElement”配置:转换:-类型:“KeyBy”配置:-类型:“带超时的计数窗口”#窗口需要使用配置:-类型:“splitstream”配置:-类型:“selectstream”配置:接收器:-类型:卡夫卡配置:-类型:卡夫卡配置:7。在实时任务管理平台上部署、创建新任务 、填写任务名称、选择任务类型(Flink)和版本、上传可执行Jar文件、导入配置或手动写入配置 、填写作业管理器和任务管理器内存配置、填写并行性配置、选择是否重试 、选择是否从检查点恢复等。保存后,可以在任务列表中启动任务,并查看启动日志以排除启动错误 第七,FlinkSQL扩展的SQL语言是一种声明性的、简单的和灵活的语言,Flink本身提供对SQL的支持 Flink1.6版本1.6和1.8对SQL语言的支持有限 ,不支持表语句,也不支持对外部数据的关联操作 因此,我们已经通过阿帕奇方解石扩展了弗林克SQL应用程序接口。用户只需要关心业务需求是如何用SQL语言表达的。 1.支持创建源表扩展了支持创建源表的SQL。通过解析SQL语句 ,获取数据源配置信息,创建表资源的相应实例 ,并在Flink环境中注册 实例如下:2 .支持创建维度表。使用Apache方解石解析SQL,通过维度表关键字识别维度表 ,使用RichAsyncFunction运算符异步读取维度表数据,通过flatMap操作生成关联的数据流,然后转换成表向Flink环境注册 实例如下:3 .支持创建视图使用sqlQuery方法,支持从以前的级别表或视图创建视图表 ,并在Flink环境中注册新的视图表 创建语句需要按顺序编写,例如,我的视图2是从视图1创建的,然后我的视图1创建语句需要在我的视图2语句之前 以下几点:4 .支持创建结果表。支持创建结果表。通过分析SQL语句,获得配置信息,创建相应的追加流表链接或追加流表链接实例 ,并在Flink环境中注册 实例如下:5 .支持自定义UDF支持自定义UDF函数,继承标量函数或表函数 资源目录中有一个相应的UDF资源配置文件。默认情况下 ,将注册在所有可执行Jar包中配置的UDF 可以根据使用方法直接使用。 6.部署方法与FlinkStream组件相同。 八.实时数据仓库的构建为了保证实时数据的统一导出和数据索引的统一口径,我们根据行业离线盘点仓库的经验,设计并构建了实时微博广告仓库 。 1.分层概图数据仓库自下而上分为三层:数据引入层(ODS、操作数据存储)、数据公共层(CDM、公共数据模型)和数据应用层(ADS、应用数据服务)数据引入层(ODS、操作数据存储):原始数据存储在数据仓库系统中,几乎不进行任何处理。该结构与源系统基本一致,是数据仓库的数据标准 数据公共层(CDM,Common Data Model,也称为公共数据模型层):包括DIM维度表、DWD和DWS,从消耗臭氧层物质层数据进行处理 它主要完成数据处理和集成,建立一致性维度,构建面向分析和统计的可重用详细事实表,并总结通用粒度指标 公共维度层次(DIM):基于维度建模的概念,为整个企业建立一致的维度 降低了数据计算口径和算法不一致风险 公共维度级别的表通常也称为逻辑维度表。维度和维度逻辑表通常一一对应。 公共聚集粒度事实级(DWS,数据仓库服务):以分析主题对象为建模驱动,基于上层应用和产品的索引需求,构建公共聚集索引事实表,并通过宽表对模型进行物理化。 建立命名规范、口径一致的统计指标,为上级提供公共指标,建立汇总宽表和详细事实表 通用汇总粒度事实级别的表通常也称为汇总逻辑表,用于存储派生指标数据 。 DWD(数据仓库细节):基于每个特定业务流程的特征,业务流程被用作建模驱动,以构建最细粒度的细节层事实表 。 根据企业的数据使用特点,详细事实表中的一些重要维度属性字段可以适当冗余,即广播。 粒度事实级的表通常也称为逻辑事实表。 应用数据服务:存储数据产品的个性化统计索引数据 根据清洁发展机制和消耗臭氧层物质层处理 2.详细层次模型(Detailed Hierarchical Model)对于原始日志数据 ,在从几乎每一个日志中提取字段后,都会保留ODS层,这样问题就可以追溯和跟踪。 在清洁发展机制层,消耗臭氧层物质数据仅在时间粒度上被压缩,即所有维度的指标都被聚集在一个特定的时间分段窗口中,不涉及任何业务操作。 在ADS层,我们将有一个可配置的提取微服务,它对底层数据执行定制的计算和提取 ,并将其输出到用户指定的存储服务 >;>;>;>;建议10月26日,北京:dbaplus社区将举办一场关于数据架构和优化的沙龙,并与JD.com、AWS、滴滴、新居网络、爱克胜等数据领域的高级技术专家携手,聚焦台湾热点话题、数据架构和数据优化。 了解代码的更多详细信息 11月15日 ,广州:Gdevops全球敏捷运维峰会将举办2019年度闭幕活动,重点关注智能运维、开发运维和数据库领域。它将与阿里、腾讯、京东、新浪微博、甜橙金融、中国联通大数据、微银行、壳牌搜索和新火炬网的技术代表合作 ,进行年度技术总结和发展趋势展望,并扫描代码吸收年度技术精华。 单词小助手C语言版

(责任编辑:经典散文)

相关内容