您当前的位置:首页 > 电脑百科 > 数据库 > 百科

从本地到云端:豆瓣如何使用JuiceFS实现统一的数据存储

时间:2023-06-25 13:31:14  来源:  作者:OSC开源社区

豆瓣成立于 2005 年,是中国最早的社交网站之一。在 2009 到 2019 的十年间,豆瓣数据平台经历了几轮变迁,形成了 DPark + Mesos + MooseFS 的架构

由机房全面上云的过程中,原有这套架构并不能很好的利用云的特性,豆瓣需要做一次全面的重新选型,既要考虑未来十年的发展趋势,也需要找到与现有组件兼容且平滑过渡的解决方案。一番改造后, 豆瓣数据平台目前形成了 Spark + Kube.NETes + JuiceFS 的云上数据湖架构,本文将分享此次选型升级的整体历程。

01 豆瓣早期数据平台

在 2019 年,豆瓣所使用的数据平台主要由以下组件构成:

Gentoo linux,内部使用的 Linux 发行版;MooseFS ,分布式文件系统;Apache Mesos 负责整个集群的资源管理,以及 Dpark 作为分布式计算框架提供给开发者使用。

(豆瓣早期数据平台架构)

从上图可以看到在这个数据平台中,计算和存储是一体的,每个计算任务是由 Mesos 进行调度的。计算任务的 I/O 操作都是通过 MooseFS 的 Master 获取元数据,并在本地获取需要计算的数据。此外,GPU 计算集群也是通过 Mesos 进行管理,不同的是, GPU 会基于显存进行共享。

平台组件介绍 Gentoo Linux

Gentoo Linux 是一个较为小众的 Linux 发行版,具有几乎无限制的适应性特性,是一个原发行版。Gentoo Linux 采用滚动更新的方式,所有软件包都直接从社区中获取二进制包,我们则通过源代码构建我们所需的软件包。Gentoo Linux 有一个强大的包管理器,使用它也会带来很多便利,也同时存在一些问题。比如,滚动更新的速度非常快,但对于服务器来说,可能存在一定的不稳定性。

使用源代码构建软件包的好处是当社区没有预编译好我们所需的软件包时,我们可以非常简单地构建出自己所需的软件包,并且当已有的软件包无法满足我们的需求时,也可以很容易地进行定制调整。但这也会带来较高的维护成本。

另外,如果所有软件包都能按照规范进行编写的话,依赖冲突问题几乎是不存在的,因为在打包过程中就已经可以发现。但实际情况是并不是所有软件包都能遵守一个好的依赖描述的约定,因此依赖冲突问题可能仍然存在。

Gentoo Linux 是较为小众的选择,尽管社区质量很高,但是用户也比较少,一些新项目可能没有用户进行足够的测试,我们在实际使用过程中会遇到各种各样的问题。这些问题大部分需要我们自己解决,如果等待其他人回复的话,响应会比较慢。

MooseFS

MooseFS 是一个开源的、符合 POSIX 标准的分布式文件系统,它只使用 FUSE 作为 I/O 接口,并拥有分布式文件系统的标准特性,如容错、高可用、高性能和可扩展性。

对于几乎所有需要使用标准文件系统的场景,我们都使用 MooseFS 作为替代品,并在其基础上开发了一些自己的小工具。例如,我们可以直接使用分布式文件系统来处理 CDN 的回源。在早期版本中,MooseFS 没有主节点的备份功能,因此我们开发了一个 ShadowMaster 作为元数据的热备节点,并编写了一些分析 MooseFS 元数据的工具,以解决一些运维问题。作为一个存储设施,MooseFS 整体比较稳定,并且没有出现重大的问题。

Apache Mesos

Mesos 是一个开源的集群管理器,与YARN 有所不同,它提供公平分配资源的框架,并支持资源隔离,例如 CPU 或内存。Mesos 早在 2010 年就被 Twitter 采用, IBM 在 2013 年开始使用。

Dpark

由于公司全员使用 Python/ target=_blank class=infotextkey>Python,因此使用了 Python 版的 Spark,即 Dpark,它扩展了RDD API,并提供了 DStream。

公司内部还开发了一些小工具,例如 drun 和 mrun,可以通过 Dpark 将任意 Bash 脚本或数据任务提交到 Mesos 集群,并支持 MPI 相关的任务提交。Dgrep 是用于快速查询日志的小工具,JuiceFS 也提供了类似的工具。虽然 Dpark 本身可以容器化,但公司主要的数据任务是在物理服务器上运行的。支持容器化可以让场内任务更好地利用线上业务的模型代码。

02 平台演进的思考

在 2019 年,公司决定将基础设施转移到云端并实现计算和存储分离,以提高平台的灵活性。由于以前的计算任务在物理机上运行,随着时间的推移,出现了越来越多的依赖冲突问题,维护难度不断增加。

同时,公司希望内部平台能够与当前的大数据生态系统进行交互,而不仅仅是处理文本日志或无结构化、半结构化的数据。此外,公司还希望提高数据查询效率,现有平台上存储的数据都是行存储,查询效率很低。最终,公司决定重新设计一个平台来解决这些问题。

平台演进时,我们没有非常强的兼容性需求。只要成本收益合理,我们就可以考虑将整个平台替换掉。这就像是环法自行车比赛中,如果车有问题就会考虑换车,而不是只换轮子。在更换平台时,我们如果发现现有平台的任务无法直接替换,可以先保留它们。在切换过程中,我们有以下主要需求:

  • • Python 是最优先考虑的开发语言。
  • • 必须保留 FUSE 接口,不能直接切换到 HDFS 或者 S3。
  • • 尽可能统一基础设施,已经选用了部分 Kubernetes,就放弃了 Mesos 或其他备选项。
  • • 新平台的学习成本应尽可能低,让数据组和算法组的同事能够以最低的成本切换到新的计算平台上。
03 云上构建数据平台

目前的云上数据平台几乎是全部替换了,Gentoo Linux 的开发环境变成了 Debian based contAIner 的环境, MooseFS 是换用了现在的 JuiceFS,资源管理使用了 Kubernetrs,计算任务的开发框架使用了 Spark,整体进行了彻底替换的,其他的设施是在逐渐缩容的过程,还会共存一段时间。

(豆瓣数据平台架构)

JuiceFS 作为统一存储数据平台

为了更好地满足不同的 I/O 需求和安全性考虑,我们会为不同的使用场景创建不同的 JuiceFS 卷,并进行不同的配置。JuiceFS 相对于之前的 MooseFS,创建文件系统更加简单,实现了按需创建。除了 SQL 数据平台外,我们的使用场景基本上都是由 JuiceFS 提供的服务。

在 JuiceFS 中,数据有几种类型:在线读写、在线读取离线写入、在线写入离线读取、离线读写。

所有的读写类型都在 JuiceFS 上进行,比如日志汇聚到卷中,Spark 可能会读取并进行 ETL,然后将数据写入数据湖。此外,从 Kafka 数据源读取的数据也会通过 Spark 进行处理并写入数据湖。

Spark 的 Check Point 直接存储在另一个 JuiceFS 卷中,而数据湖的数据则直接提供给算法组的同学进行模型训练,并将训练结果通过 JuiceFS 写回。我们的运维团队则通过各种脚本或工具来管理 JuiceFS 上的文件生命周期,包括是否对其进行归档处理等。因此,整个数据在 JuiceFS 中的流转过程大致如上图所示。

新数据平台组件介绍 Debian based container

首先,运维团队选择了 Debian based container 作为基础镜像,我们就直接使用了。我们的计算平台的镜像很大,为了解决任务启动速度的问题,团队在每个节点上预拉取了镜像。

JuiceFS

切换到 JuiceFS 存储系统时,用户感受不到变化,JuiceFS 非常稳定。 JuiceFS 比 MooseFS 更好的一点是,它拥有 HDFS 的 SDK,方便了团队将来切换到 Spark 等工具。团队在 Kubernetes 上使用了 JuiceFS CSI,可以直接使用 JuiceFS 作为 Persist Volume,用起来十分方便。JuiceFS 团队沟通高效,解决问题迅速。例如,当 stream 的 checkpoint 频率太高时,JuiceFS 团队早早通知并迅速解决。

Kubernentes

我们早在 1.10 版本的时候就开始试用 Kubernetes。后来豆瓣对外的服务集群在 1.12 版本开始逐步迁移到 Kubernetes,基本上是在现有机器上完成了原地的替换。计算集群则是在上云后开始搭建的,基于1.14 版本。我们在版本升级方面可能比其他公司更为激进,目前我们的 Kubernetes 版本已经升级到了1.26 版。

我们选择 Kubernetes 作为计算平台的原因之一是它有比较统一的组件。此外,通过 scheduling framework 或者 Volcano,我们可以影响它的调度,这是我们比较希望拥有的一个特性。

我们还可以利用社区的 Helm 非常快速地部署一些需要的东西,比如 Airflow、Datahub 和 Milvus 等服务,这些服务都是通过 Helm 部署到我们的离线 Kubernetes 集群中提供的。

Spark

在最开始测试 Spark 时,我们像使用 Dpark 一样将任务运行在 Mesos 集群上。之后我们选定了 Kubernetes,使用 google Cloud Platform 上的 spark-on-k8s-operator 将 Spark 任务部署到 Kubernetes 集群中,并部署了两个 Streaming 任务,但并未进行大规模的部署。

随后,我们确定了使用 Kubernetes 和 Airflow,计划自己实现一个 Airflow Operator,在 Kubernetes 中直接提交 Spark 任务,并使用 Spark 的 Cluster Mode 将任务提交到 Kubernetes 集群中。

对于开发环境,我们使用 JupyterLab 进行开发。厂内有一个 Python 库对 Spark Session 进行了一些小的预定义配置,以确保 Spark 任务能够直接提交到 Kubernetes 集群上。

目前,我们使用 Kubernetes Deployment 直接部署 Streaming 任务,这是一个很简单的状态,未来可能会有一些改进的地方。另外,我们正在准备试用 Kyuubi & Spark Connect 项目,希望能够为线上任务提供更好的读写离线数据的体验。

我们的版本升级非常激进,但确实从社区中获益匪浅。我们解决了日常计算任务中许多常见的优化场景。我们激进升级的原因是希望能够尽可能多地利用社区的资源,提供新特性给开发者。但我们也遇到了问题,例如 Spark 3.2 的 parquet zstd 压缩存在内存泄漏。为了规避这个问题,我们提前引入了未发布的补丁。

现在,我们使用两种方式来读写 JuiceFS 数据:FUSE 和 HDFS。FUSE 主要用于 ETL 任务,例如读写日志和 CSV 文件。我们也会将 Hive 表转存为 CSV 文件下载供未切换到 Spark 的任务进行计算。其他的数据,则直接通过预先配置好的 HDFS(如 Hive Table 和 Iceberg Table)进行读写,这大大简化了我们的工作。

在数据湖的选择上,我们一开始考虑了 Delta Lake,但由于它不支持 Merge on Read,在目前的使用场景存在写放大,我们放弃了它。取而代之,我们选择了 Iceberg,并将其用于 MySQL CDC 处理。我们将数据直接存储在 JuiceFS 上进行读写,并且目前没有遇到任何性能上的问题。未来,如果我们需要扩大规模使用,可能需要与 JuiceFS 的团队沟通一下,看看有哪些优化措施。

04 收获与展望

我们切换到新的计算平台之后,获得了很多原来没有的功能。例如,我们现在可以使用基于 SQL 的大量任务,这些任务的性能比以前好得多,各种报表的实时性也更好了。

与 Mesos 的情况不同,Spark 声明了多少资源就使用多少资源,这与以前的 Dpark 相比有很大的差异,因为以前大家都是公平分享,相互之间会有影响。现在,每个任务的执行时间都比较可预测,任务评估也比较容易预测,整个新平台对于业务数据的读取也有更好的时效性。

以前的历史包袱是相当沉重的,现在我们已经赶上了社区的步伐。去年年末的各种统计和排名都已经迁移到了新的计算平台上,并且运行非常稳定。

我们正在优先考虑采取一些成本下降措施,以实现整个计算集群的动态扩缩容。我们正积极努力实现此目标,并希望提供更加稳定的 SQL 接口。为此,我们计划采用支持 Multi-tenant 的 SQL 服务器,并尝试引入 Spark 3.4 的最新特性。

长远来看,我们希望通过 Spark Remote Shuffle Service 进一步实现存算分离,以便更有效地利用资源。也许未来我们会开发一个“Spark as a Service”,提供给开发者使用。总之,我们正在追赶社区的步伐,并不断努力提升我们的技术水平。



Tags:数据存储   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
云计算:数据存储与处理的革命性技术
当我们谈论“云计算”时,我们实际上在讨论的是一种基于互联网的新型计算模式。云计算允许用户通过网络访问并使用存储在数据中心(也称为“云”)的共享计算资源。这些资源可以包...【详细内容】
2024-03-04  Search: 数据存储  点击:(18)  评论:(0)  加入收藏
Redis集群架构模式概述,引领我们穿越在数据存储的未知之旅
Redis,不仅是数据存储,更是架构的艺术。从主从到哨兵、再到Cluster,每个模式都有着独特的优势。而代理模式,则是应对大规模场景的得力助手。这是一场探险,Redis引领我们穿越在数...【详细内容】
2023-12-08  Search: 数据存储  点击:(134)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  Search: 数据存储  点击:(143)  评论:(0)  加入收藏
MongoDB性能调优:打造高效的数据存储平台
MongoDB是一种非常流行的NoSQL数据库,可以用于构建高效的数据存储平台。为了确保MongoDB的性能最大化,以下是一些建议的性能调优措施:1、使用适当的硬件:选择高性能的硬件设备,例...【详细内容】
2023-11-14  Search: 数据存储  点击:(201)  评论:(0)  加入收藏
云计算对数据存储与处理方式的影响
云计算是一种基于互联网的计算模式,它通过将数据存储和处理任务迁移到远程的数据中心,为用户提供按需使用的计算资源和服务。云计算的出现改变了数据存储与处理的方式,极大地推...【详细内容】
2023-09-28  Search: 数据存储  点击:(65)  评论:(0)  加入收藏
分布式数据库架构:高可用、高性能的数据存储
在现代信息时代,数据是企业发展的核心。为了支持海量数据的存储、高并发访问以及保证数据的可靠性,分布式数据库架构应运而生。分布式数据库架构是一种将数据存储在多个物理节...【详细内容】
2023-08-15  Search: 数据存储  点击:(220)  评论:(0)  加入收藏
Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储
HTTP协议是无状态协议,每次同一浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现同一会话内数据共享.深入理解Cookie与Session:实现用户跟...【详细内容】
2023-08-02  Search: 数据存储  点击:(277)  评论:(0)  加入收藏
从本地到云端:豆瓣如何使用JuiceFS实现统一的数据存储
豆瓣成立于 2005 年,是中国最早的社交网站之一。在 2009 到 2019 的十年间,豆瓣数据平台经历了几轮变迁,形成了 DPark + Mesos + MooseFS 的架构。由机房全面上云的过程中,原有...【详细内容】
2023-06-25  Search: 数据存储  点击:(164)  评论:(0)  加入收藏
一文详解Mongodb数据库,适合大数据存储
在网络交互的过程中,不仅会有数据的传递,也会有新数据的产生。比如我们目前的网站登录注册项目,在用户注册后,我们只是把数据添加到了服务器的内存中,但是程序一旦关闭或者重启,内...【详细内容】
2023-02-13  Search: 数据存储  点击:(350)  评论:(0)  加入收藏
区块链开源存储引擎“泓”问世 支持长安链PB级数据存储
中新网北京11月14日电 (记者 陈杭)记者14日从北京微芯区块链与边缘计算研究院获悉,该研究院长安链团队成功研发海量存储引擎Huge“泓”。该引擎可支持拍字节(PB)级数据存储,是...【详细内容】
2022-11-15  Search: 数据存储  点击:(205)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(4)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(13)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(27)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条