简介:Vineyard是一个分布式引擎,为云端大数据分析场景中的端到端工作流提供内存数据共享-原生环境。我们很高兴宣布Vineyard于2021年4月27日被云原生基金会(CNCF)TOC接纳为沙盒项目。葡萄园队来源|阿里云原生公众号Vineyard是一个分布式引擎,旨在为云原生大数据分析场景中的端到端工作流提供内存数据共享。4月27日,被云原生基金会(CNCF)TOC接纳为Sandbox项目。Vineyard项目开源地址:https://github.com/alibaba/v6d项目介绍在现有的大数据分析场景中,用于端到端任务,不同的子任务通常使用诸如HDFS、S3、OSS等分布式文件系统或对象存储系统来共享任务之间的中间数据。这种方法在运行效率和研发效率方面存在很多问题。一个风控作业工作流程示例如下图所示:在工作流程中,为了在不同任务之间共享中间数据,前一个任务将结果写入文件系统。完成后,后者读取文件作为输入。这个过程带来了额外的序列化和反序列化、内存复制、以及网络和IO开销,我们从历史任务中观察到,超过60%的任务将超过40%的执行时间花在了这上面。对于生产环境,为了高效解决某个特定范式的问题,往往会引入新的系统(如分布式图计算),但这样的系统往往难以直接与工作流中的其他系统无缝对接,需要大量反复研发IO,数据格式转换适配。使用外部文件系统共享数据会给工作流带来额外的中断,因为往往只有当一个任务将所有结果写完后,下一个任务才能开始读取和计算,这使得跨任务的流水线的并行性无法应用.现有的分布式文件系统在共享中间数据时,尤其是在云原生环境下,没有很好地处理分布式数据的位置,造成网络开销的浪费,从而降低了端到端的执行效率。为了解决现有大数据分析工作流中存在的上述问题,我们设计并实现了分布式内存数据共享引擎Vineyard。Vineyard从以下三个角度解决了上述问题:为了让端到端工作流中任务间的数据共享更高效,Vineyard通过内存映射支持系统间的零拷贝数据共享,省去了额外的IO高架。为了简化新计算引擎接入现有系统所需的适配和开发,Vineyard对常见的数据类型,如Tensor、DataFrame、Graph等,提供开箱即用的抽象,让不同的计算引擎可以共享中间结果,不再需要额外的序列化和反序列化。同时,Vineyard以插件的形式实现IO、数据迁移、快照等可复用组件,使其可以按需灵活注册到计算引擎中,减少与计算无关的开发成本引擎本身。Vineyard提供了一系列算子来实现更高效、更灵活的数据共享。例如Pipeline算子实现了跨任务的流水线并行,使得后续任务可以在前一个任务产生输出的同时进行计算,提高了整体的端到端效率。Vineyard与Kubernetes集成。通过SchedulerPlugin,任务的调度可以知道所需数据的位置。在Kubernetes中,可以将单个任务的Pod尽可能调度到与Pod需要的输入数据相匹配的机器上,以减少工作量。小数据迁移所需的网络开销提高了端到端性能。在初步的对比实验中,相比使用HDFS共享中间数据,对于评估任务,Vineyard可以显着减少为交换中间结果引入的额外开销,整个工作流的端到端时间提升了1.34倍。核心功能接下来我们将从Vineyard核心的设计与实现,以及Vineyard如何助力云原生环境下的大数据分析任务两个方面介绍Vineyard的核心功能。1.分布式内存数据共享Vineyard将内存中的数据表示为Object。对象可以是本地的或全局的。以分布式执行引擎Mars和Dask为例,一个DataFrame往往被拆分成许多Chunk,以利用多台机器的计算能力。每台机器上有多个Chunk,这些Chunks是Vineyard中的LocalObjects,这些Chunks共同组成了一个全局视图,即GlobalDataFrame。这个GlobalDataFrame可以直接共享给其他计算引擎,比如GraphScope,作为图数据的输入。通过这些数据类型的抽象,中间结果可以在Vineyard上的不同计算引擎之间无缝共享,直接将一个任务的输出作为下一个任务的输出。具体来说,如何在Vineyard中表达特定类型的Object以便它可以轻松适应不同的计算引擎?这是由于Vineyard在Object的表示中提供的灵活性。在Vineyard中,一个对象包括两部分,元数据和一组Blob。Blob存储实际数据,而Metadata用于解释这些blob的语义。例如,对于Tensor,Blob是一个连续的内存,存储了Tensor中的所有元素,Metadata记录了Tensor的类型、形状以及行优先顺序或列优先顺序等属性。在Python中,这个Object可以解释为NumpyNDArray,而在C++中,这个Object可以解释为xtensor中的张量。在这两种不同编程语言的SDK中,共享这个Tensor不会带来额外的IO、复制、序列化/反序列化、类型转换的开销。同时Vineyard中的Metadata是可嵌套的,这让我们可以轻松描述任何复杂的数据类型作为Vineyard中的对象,而不限制计算引擎的表现力。以GlobalDataFrame为例,见下图Metadata的结构。2.云原生环境下数据与任务的协同调度对于真正部署的大数据分析流水线,任务间的数据共享是远远不够的。在云环境下,一个端到端管道中包含的多个子任务在Kubernetes调度时只考虑所需的资源约束,不能保证两个连续任务的共址,中间结果在两个任务之间共享仍然是数据迁移引入的网络开销。如下图,在TaskB运行时,由于两个Task的Pod没有对齐,需要将数据切片A3和A4迁移到Pod所在的Vineyard实例。对此,Vineyard通过CRD将集群中的数据(VineyardObjects)表示为可观察的资源,并基于Kubernetes的SchedulerFramework设计并实现了一个考虑数据局部性的调度器插件。上一个任务TaskA完成后,scheduler插件可以从result对象的Metadata中知道所有fragment的位置。当启动下一个任务时,调度器会将数据发送到数据所在的节点(图中的节点1、节点2)更高的优先级可以让任务B尽可能的调度到对应的节点,从而节省数据迁移和提高端到端性能带来的额外开销。QuickStartVineyard集成了Helm,方便用户安装部署:helmrepoaddvineyardhttps://vineyard.oss-ap-southeast-1.aliyuncs.com/charts/helminstallvineyardvineyard/vineyard安装完成后,系统会Deploy一个VineyardDaemonSet,并暴露一个UNIXdomainsocket,用于与应用程序任务Pod共享内存和IPC通信。另外,您还可以参考Vineyard的演示视频:https://www.youtube.com/watch?v=vPbF1l5nwwQ&list=PLj6h78yzYM2NoiNaLVZxr-ERc1ifKP7n6&t=585未来展望葡萄园已经作为分布式科学计算引擎Mars和一站式图计算系统GraphScope的存储引擎,葡萄园对大数据分析任务的助力离不开与云原生社区的紧密互动。未来,Vineyard将进一步完善与Kubeflow、Fluid等其他社区项目的集成,助力更多云上大数据分析任务。Vineyard将继续与社区同行,支持和关注回馈社区,致力于推动云原生技术在大数据分析领域的生态建设和应用。欢迎大家关注葡萄园项目,加入葡萄园社区,参与项目的共建和实施!2021阿里云开发者大会火热开赛!如何在数字时代更好地利用云能力?什么是新的、便捷的开发模式?开发人员如何更高效地构建应用程序?科技赋能社会,科技推动变革,拓展开发者的能量边界。一切因云而不同。立即点击报名参加,2021阿里云开发者大会给你答案。版权声明:本文内容由阿里云实名注册用户投稿,版权归原作者所有。阿里云开发者社区不拥有自己的版权,也不承担相应的法律责任。具体规则请参考《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如发现本社区涉嫌抄袭内容,请填写侵权投诉表进行举报,一经查实,本社区将立即删除涉嫌侵权内容。
