爱奇艺数据湖实战 - 基于数据湖的日志平台架构演进

01

   背景

为了满足公司内日志实时查询分析的需求,爱奇艺大数据团队自研了Venus日志服务平台,负责爱奇艺各服务日志的采集、存储、处理、分析等场景。早期采用基于ElasticSearch的存储分析架构,随着数据规模的不断扩大,出现了成本高、管理困难、稳定性差等问题。

数据湖技术近几年快速发展,其采用了统一大数据存储底座和存算分离的架构,提供了一种适合于日志这种大量写入、少量查询场景的解决方案。因此,Venus进行了基于数据湖的架构改造,并推动日志入湖。入湖后,成本降低了70%,稳定性也大幅提升。本文主要介绍Venus从基于ElasticSearch的架构转向基于数据湖架构的思考及建设过程。

02

   Venus日志平台介绍

Venus是由爱奇艺自研的日志服务平台,提供日志的采集、处理、存储、分析等功能,主要用于公司内部的日志排障、大数据分析、监控报警等场景,整体架构如图1所示。

efb250cb2ca1fe07f1a78007311a0600.png图1 Venus链路

本文重点讨论日志排障链路的架构演变,其数据环节包括:

  • 日志采集:通过在机器、容器宿主机上部署采集Agent,收集各业务线前端、后端、监控等多种来源的日志,也支持业务自行投递符合格式要求的日志。部署了超过3万个 Agent,支持Kafka、MySQL、K8s、网关等10种数据源。

  • 日志处理:日志收集后经过正则抽取、内置解析器抽取等标准化处理后以JSON格式统一写入Kafka,再由转存程序写入到存储系统中。

  • 日志存储:Venus存储了近万个业务日志流,写入峰值超过1千万QPS,日新增日志超过500TB。随着存储规模的变化,存储系统的选型经历了从ElasticSearch到数据湖的多次变化。

  • 查询分析:Venus提供可视化查询分析、上下文查询、日志大盘、模式识别、日志下载等功能。

为了满足海量日志数据的存储与快速分析,Venus日志平台经历了三次大的架构升级,从经典的ELK架构逐步演变到基于数据湖的自研体系,本文将介绍Venus架构转型过程中遇到的问题及解决方案。

03

   Venus 1.0:基于ELK架构

Venus 1.0 始于2015年,基于当时流行的ElasticSearch+Kibana搭建,如图2所示。ElasticSearch承担日志的存储与分析功能,Kibana提供可视化查询分析能力,只需要消费Kafka将日志写入ElasticSearch即可提供日志服务。

96cea1b58770f96873c6beaa39711073.png图2 Venus 1.0架构

由于单ElasticSearch集群吞吐、存储容量、索引分片数存在上限,Venus通过不断增加新的ElasticSearch集群应对不断增长的日志需求。为了控制成本,每个ElasticSearch的负载都在高位,索引配置的都是0副本,经常遇到突增流量写入、大数据量的查询、或者机器故障导致集群不可用等问题。同时由于集群上索引多、数据量大,恢复时间也很长导致日志长时间不可用,Venus的使用体验变得越来越糟糕。

04

   Venus 2.0:基于ElasticSearch + Hive

为了缓解Venus 1.0遇到的问题,Venus 2.0引入了Hive,架构如图3所示,主要改进点如下:

  • 集群分级:将ElasticSearch集群分为高优和低优两类。重点业务使用高优集群,集群的负载控制在低位,索引开启1副本配置,容忍单节点故障;非重点业务使用低优集群,负载控制在高位,索引依然采用0副本配置。

  • 存储分级:对于保存时间长的日志双写ElasticSearch和Hive。ElasticSearch保存最近7天的日志,Hive保存更长时间的日志,降低ElasticSearch的存储压力,也可降低大数据量查询将ElasticSearch打挂的风险。但是由于Hive无法做交互式查询,需要通过离线计算平台查询Hive中的日志,查询体验较差。

  • 统一查询入口:提供类似Kibana的统一可视化查询分析入口,屏蔽底层ElasticSearch集群。在集群故障时将新写入日志调度到其他集群,不影响新日志的查询分析。在集群负载不均衡时,在集群之间透明调度流量。

8fda23eeccd0286f7fe2d19968a34a11.png

图3 Venus 2.0架构

Venus 2.0是一种保障重点业务、降低故障风险与影响的妥协方案,依然有成本高、稳定性差的问题:

  • ElasticSearch 存储时间短:由于日志量大,ElasticSearch只能存储 7 天,无法满足日常业务需求

  • 入口很多,数据割裂:20 多个 ElasticSearch集群 + 1 个 Hive 集群,查询入口很多,非常不便于查询和管理

  • 成本高:ElasticSearch虽然只存7天日志,依旧消耗了 500多台机器

  • 读写一体:ElasticSearch服务器同时负责读写,相互影响

  • 故障多:ElasticSearch故障占 Venus总故障 80%,故障后读写阻塞,容易丢日志,且处理困难

05

   Venus 3.0:基于数据湖的新架构

  • 引入数据湖的思考

深入分析Venus的日志场景,我们总结其有如下特点:

  • 数据量大:近万个业务日志流峰值千万QPS的写入,PB级的数据存储。

  • 写多查少:通常业务在有排障需求时才去查询日志,大部分日志一天内都没有查询需求,整体看查询QPS也极低。

  • 交互式查询:日志主要用于排障这种紧急、需要多次连续查询的场景,需要秒级的交互式查询体验。

针对使用ElasticSearch存储分析日志遇到的问题,我们认为其与Venus的日志场景并不十分匹配,原因如下:

  • 单集群写入QPS和存储规模有限,需要多集群分担流量。需考虑集群规模、写入流量、存储空间、索引数量等复杂调度策略问题,增加了管理难度。由于业务日志流量差异大、不可预测,为解决突发流量对集群稳定性的影响,往往需预留较多空闲资源,导致集群资源极大浪费。

  • 写入时做全文索引消耗了大量CPU,导致数据膨胀,造成计算存储成本大幅上升。在很多场景下存储分析日志所需的资源比后台服务资源还多。对于日志这种写入多、查询少的场景,做全文索引的预计算比较奢侈。

  • 存储数据与计算在相同的机器上,大数据量查询或者聚合分析容易影响写入,造成写入延迟甚至集群故障。

为了解决上述问题,我们调研了ClickHouse、Iceberg数据湖等替代方案。其中,Iceberg是爱奇艺内部选择的数据湖技术,是一种存储在HDFS或对象存储之上的表结构,支持分钟级的写入可见性及海量数据的存储。Iceberg对接Trino查询引擎,可以支持秒级的交互式查询,满足日志的查询分析需求。

针对海量日志场景,我们对ElasticSearch、ElasticSearch+Hive、ClickHouse、Iceberg+Trino等方案做了对比评估:

4bd6bced9f3fe39ef1b9c09264be0b33.png

通过对比,我们发现基于Iceberg+Trino的数据湖架构最适合Venus日志场景:

  • 存储空间大:Iceberg底层数据存储在大数据统一的存储底座HDFS上,意味着可以使用大数据的超大存储空间,不需要再通过多个集群分担存储,降低了存储的维护代价。

  • 存储成本低:日志写入到Iceberg不做全文索引等预处理,同时开启压缩。HDFS开启三副本相比于ElasticSearch的三副本存储空间降低近90%,相比ElasticSearch的单副本存储空间仍然降低30%。同时,日志存储可以与大数据业务共用HDFS空间,进一步降低存储成本。

  • 计算成本低:对于日志这种写多查少的场景,相比于ElasticSearch存储前做全文索引等预处理,按查询触发计算更能有效利用算力。

  • 存算隔离:Iceberg存储数据,Trino分析数据的存算分离架构天然的解决了查询分析对写入的影响。

  • 基于数据湖架构的建设

通过上述评估,我们基于Iceberg和Trino构建了Venus 3.0。采集到Kafka中的日志由转存程序写入Iceberg数据湖。Venus查询平台通过Trino引擎查询分析数据湖中的日志。架构如图4所示。

87078fc4674282fe5ea870a2fb533349.png图4 Venus 3.0架构

  • 日志存储

如图4所示,数据湖中的日志存储包含三个层次,分别是HDFS数据存储层、Alluxio缓存层及Iceberg表格式层。对读写可见的是Iceberg表格式层,日志流以表的形式写入,并持久化存储到HDFS。对于查询性能要求高的日志流会开启Alluxio缓存,日志流同时写入Alluxio和HDFS,查询时优先读取Alluxio的数据,加快数据加载速度。所有日志都存在一个Iceberg库下,一个日志流对应一张Iceberg表。表的schema由日志的格式决定,按日志中的时间戳字段做小时级分区,并按业务需求配置TTL。Iceberg的数据可见性由写入时提交周期决定,我们按需每分钟或者每5分钟做一次提交。

  • 查询分析

Venus日志平台将用户的查询分析请求翻译成SQL,通过Trino查询Iceberg,所有SQL的执行由一个Trino集群承担。对于10亿行日志,字符串匹配的查询5秒左右返回结果,聚合查询30秒内返回结果,满足大部分的日志使用场景。

对日志查询性能要求更高的表,我们开启了Alluxio缓存。如图5所示,对于慢查询,使用Alluxio后查询速度有大幅的提升,P99耗时降低84%。

e043cfa95df304b24cb7427370da3af3.png

图5 日志查询性能对比

  • 转存程序

Venus转存程序将Kafka中的数据写入数据湖中,采用了对Iceberg支持比较好的Flink计算引擎,通过Flink SQL消费Kafka写入Iceberg。每个日志流运行一个转存程序,单核支持16MB/s的写入,是写入ElasticSearch的3倍。在爱奇艺,Flink程序部署在YARN集群上,最小的CPU调度粒度为1个核,加上Flink Master,运行起来至少需要2个核。Venus接入的近万个日志采集中95%的日志流量低于16MB/s,相当大比例的日志流量在KB/s级别,部署在YARN上将造成巨大的资源浪费。因此,我们选择了大小流量调度策略,将资源需求大于1核的转存程序部署在YARN上,资源需求小于1核的转存程序,以Flink单机运行模式部署在K8S上,将部署资源粒度降低到0.1核。与写入ElasticSearch的转存程序相比,计算资源消耗降低了70%。

  • 落地效果

得益于Venus 提供的统一查询分析入口,从ElasticSearch到数据湖的切换过程对业务几乎透明。相比旧架构,整体成本降低70%以上,每年节省上千万元,同时故障率降低了85%:

  • 存储空间:日志的物理存储空间降低30%,考虑到ElasticSearch集群的磁盘存储空间利用率较低,实际存储空间降低50%以上。

  • 计算资源:Trino使用的CPU核数相比于ElasticSearch减少80%,转存程序资源消耗降低70%。

  • 稳定性提升:迁移到数据湖后,故障数降低了85%,大幅节省运维人力。

06

   总结与规划

目前基于数据湖的Venus架构已稳定上线一年,为业务提供高性价比的日志服务。未来Venus将在以下几个方面进一步探索:

  • Iceberg+Trino的数据湖架构支持的查询并发较低,我们将尝试使用Bloomfilter、Zorder等轻量级索引提升查询性能,提高查询并发,满足更多的实时分析的需求。

  • 目前Venus存储了近万个业务日志流,日新增日志超过500TB。计划引入基于数据热度的日志生命周期管理机制,及时下线不再使用的日志,进一步节省资源。

  • 如图1所示,Venus同时也承载了大数据分析链路的Pingback用户数据的采集与处理,该链路与日志数据链路比较类似,参考日志入湖经验,我们对Pingback数据的处理环节进行基于数据湖的流批一体化改造。目前已完成一期开发与上线,应用于直播监控、QOS、DWD湖仓等场景,后续将继续推广至更多的湖仓场景。详细技术细节将在后续的数据湖系列文章中介绍。

752f9d19961e3a4eba617709562120c6.jpeg

也许你还想看

爱奇艺数据湖实战

爱奇艺大数据加速 - 从Hive到Spark SQL

爱奇艺数据湖实战 - 广告数据湖应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108981.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

mysql 命令行 执行sql文件

方法1 source source file.sql; file.sql : 绝对路径或 相对路径。 方法2 mysql -u xxx -p < file.sql 方法3 MySQLImport 工具 mysqlimport [options] database file_name 其中&#xff0c;database为要导入数据的数据库名&#xff0c;file_name为要导入的SQL文件名。还可以…

算法通过村第四关-栈白银笔记|括号问题

文章目录 前言1. 括号匹配问题2. 最小栈问题3. 最大栈 总结 前言 提示&#xff1a;如果让我送给年轻人四个字&#xff0c;就是&#xff1a;量力而行。 量力而行不会失眠&#xff0c;不会啃老&#xff0c;不会为各种考试焦虑。顺其自然活得轻松。其实&#xff0c;量力而行最易大…

Docker学习笔记

Docker学习笔记 docker的作用docker的基本组成安装docker阿里云镜像加速run的流程和docker原理 docker的思想来自于集装箱。 核心思想&#xff1a; 隔离 docker可以通过隔离机制将服务器利用到极致。 虚拟机&#xff1a;在windows中装一个Vmware&#xff0c;通过这个软件可以虚…

使用EF Core更新与修改生产数据库

使用EF Core的Code First&#xff0c;在设计阶段&#xff0c;直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据&#xff0c;删除的风险非常低。但是对于已经投入生产的数据库&#xff0c;这个方法就绝对不可行了。 考虑…

粒子群算法的基本原理和Matlab实现

1.案例背景 1.1 PSO算法介绍 粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效…

mac清理磁盘空间软件有哪些 mac清理磁盘空间怎么清理

随着时间的推移&#xff0c;Mac电脑上的文件会越来越多&#xff0c;很快就会占满磁盘空间。这时候&#xff0c;我们需要一个好的Mac清理磁盘空间软件来释放空间&#xff0c;保持电脑的良好性能。那么&#xff0c;mac清理磁盘空间软件有哪些呢&#xff1f;接下来&#xff0c;我将…

用 PHP 和 JavaScript 显示地球卫星照片

向日葵 8 号气象卫星是日本宇宙航空研究开发机构设计制造的向日葵系列卫星之一&#xff0c;重约 3500 公斤&#xff0c;设计寿命 15 年以上。该卫星于 2014 年 10 月 7 日由 H2A 火箭搭载发射成功&#xff0c;主要用于监测暴雨云团、台风动向以及持续喷发活动的火山等防灾领域。…

几个nlp的小任务(生成式任务——语言模型(CLM与MLM))

@TOC 本章节需要用到的类库 微调任意Transformers模型(CLM因果语言模型、MLM遮蔽语言模型) CLM MLM 准备数据集 展示几个数据的结构

【Spring Boot】数据库持久层框架MyBatis — MyBatis简介

MyBatis简介 本节首先会介绍什么是ORM、什么是MyBatis、MyBatis的特点以及核心概念&#xff0c;最后介绍MyBatis是如何启动、如何加载配置文件的&#xff1f; 1.什么是ORM ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;是为了解决面向对象…

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…

C++ 网络编程项目fastDFS分布式文件系统(九)总结

1. Location语法 1. 语法规则 location [ |~|~ * |^~ ] /uri/ { … } 正则表达式中的特殊字符 : - . () {} [] * ? 2. Location 优先级说明 在 nginx 的 location 和配置中 location 的顺序没有太大关系。 与 location 表达式的类型有关。 相同类型的表达式&a…

K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(上)

温故知新 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 基本环境信息&#x1f4d7;机器信息&#x1f4d7;软件信息&#x1f4d7;部署用户kubernetes &#x1f4da;第三章 Kubernetes各组件部署&#x1f4d7;安装kube…

BlazorServer中C#与JavaScript的相互调用

BlazorServer中C#与JavaScript的相互调用 前言&#xff1a; ​ 虽然BlazorServer中推荐使用C#在razor页面中的替代JavaScript来完成逻辑的编写&#xff0c;但当需要使用第三方的javascript文件/组件里的内容时&#xff0c;则难免要在C#中调用其方法或对象。反之当你的(用到第…

Java:HashMap、LinkedHashMap、TreeMap集合的底层原理和集合的嵌套

HashMap的底层原理 LinkedHashMap的底层原理 TreeMap集合的底层原理 集合的嵌套

Elasticsearch 8.X reindex 源码剖析及提速指南

1、reindex 源码在线地址 为方便大家验证&#xff0c;这里给出 reindex github 源码地址。 https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java reindex 常见…

IDEA对Web和Tomcat的一些配置

这里只是做了自己学习中的一点记录&#xff0c;仅供参考哈&#xff01; 配置Tomcat Modules新增Web 新增module后新增Artifacts 新增Artifacts后Tomcat新增布署 将指定的module由普通java项目变成web项目 直接创建布署到Tomcat时所需要的Aritifacts包 配置Servlet的依赖包 配置…

Vue2学习笔记の使用Vue脚手架

目录 使用Vue脚手架脚手架文件结构关于不同版本的Vuevue.config.js配置文件ref属性props配置项mixin(混入)插件scoped样式总结TodoList案例webStorage组件的自定义事件全局事件总线&#xff08;GlobalEventBus&#xff09;消息订阅与发布&#xff08;pubsub&#xff09;nextTic…

redis windows 版本安装

1. 下载windows安装包并解压 如果是Linux版本可以直接到官网下载&#xff0c;自3.x起官网和微软网站就没有redis安装包更新了&#xff0c;好在github有开发者在编译发布更新&#xff08;目前最新有5.0.9版本可下&#xff09;&#xff0c;地址&#xff1a;redis windows 5版本下…

Maven 基础之安装和命令行使用

Maven 的安装和命令行使用 1. 下载安装 下载解压 maven 压缩包&#xff08;http://maven.apache.org/&#xff09; 配置环境变量 前提&#xff1a;需要安装 java 。 在命令行执行如下命令&#xff1a; mvn --version如出现类似如下结果&#xff0c;则证明 maven 安装正确…