数据及代码版本管理系统及方法
【专利摘要】本发明提供一种数据和代码版本管理系统及方法。其中,所述系统包括:数据管理模块,代码管理模块,执行引擎模块及系统核心模块,其中,数据管理模块存储有至少一个数据集;代码管理模块存储有至少一个执行代码,以及接收用户推送的代码予以存储或依据用户推送的代码发送一代码处理请求;执行引擎模块配置有至少一种执行后端引擎,依据接收的执行命令调用一执行后端引擎,运行一执行代码以对所述数据管理模块中的至少一数据集执行操作;系统核心模块接收到用户提交的数据处理请求时,处理数据管理模块中的数据集,创建数据集的数据工作流,并记录形成的数据版本信息和代码版本信息。本发明有效解决了数据和代码的版本管理效率低或混乱等问题。
【专利说明】
数据及代码版本管理系统及方法
技术领域
[0001]本发明涉及数据分析领域,特别是涉及一种数据和代码版本管理系统及方法。
【背景技术】
[0002]近几年,人们收集了大量的数据。同时,数据科学家也成为各大公司炙手可热的工作。但是,现在缺乏足够的工具帮助数据科学家分析数据流。随着数据科学的任务越来越复杂,许多数据分析师开始改造代码版本工具,比如说Git。但是,数据科学的任务并不是Git可以完全处理的。
[0003]首先,数据科学是以数据为中心的。一个数据集可以经过清洗、标记和预处理等几个操作。这样数据集就产生了多个版本。数据科学家需要记录这些版本以及随时修改数据。一种常见但并不推荐的方法就是保存多个副本,并将些副本分别命名为data, csv,data-vers1nl.csv,data-final-vers1n.csv,data-last_vers1n.csv。这种命名方式经常使人们感到很混乱。而因为版本或者数据集弄错经常会导致一些错误。
[0004]第二,一个机器学习模型通常包含很多参数,而训练这些参数是数据科学中很常见的任务。这些参数比如学习速率、初始值、正则化等等经常让人们感觉迷茫。所以,后来人们也就忘了这些参数的意义和重要性。
[0005]第三,当数据集越来越大,数据科学家经常需要搭建一个分布式平台,并且在其之上反复重复这些实验。他们还可能使用一些第三方的软件包。但是不幸的是,在不同的软件/硬件环境中安装和配置这些软件包通常是很乏味的。
[0006]最后,数据科学家之间共享数据集和经验是很困难的事。当然他们可以共享他们的代码和结果,但是这并不利于他们深刻理解他们的数据集以及充分利用别人的代码和结果O
[0007]MIT的DataHub项目支持数据集版本控制,却并不能操控整个数据集分析与开发过程。所以该项目更多的是一个数据库管理工具而不是软件开发工具。另一方面,Harvard的Dataverse则是一个数据发布和分享平台,但缺少数据的版本控制和分析功能。
【发明内容】
[0008]鉴于以上所述现有技术的缺点,本发明的目的在于提供一种数据和代码版本管理系统及方法,用于解决现有技术中数据和代码的版本管理效率低或混乱等问题。
[0009]为实现上述目的及其他相关目的,本申请的第一方面在于提供一种数据版本管理系统,包括:数据管理模块,代码管理模块,执行引擎模块,以及系统核心模块,其中,所述数据管理模块存储有至少一个数据集;所述代码管理模块存储有至少一个执行代码,所述执行代码用于对所述至少一个数据集进行操作;所述执行引擎模块配置有至少一种执行后端引擎,依据接收的执行命令调用一执行后端引擎,运行一执行代码以对所述数据管理模块中的至少一数据集执行操作;所述系统核心模块接收到用户提交的数据处理请求时,处理所述数据管理模块中的数据集,创建所述数据集的数据工作流,并记录形成的数据版本?目息O
[0010]于本申请的一实施例中,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。
[0011]于本申请的一实施例中,所述系统核心模块接收到用户提交的数据处理请求为提交一个新数据集时,所述系统核心模块提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0012]于本申请的一实施例中,所述系统核心模块接收到用户提交的数据处理请求为修改所述数据管理模块中存储的一个数据集时,所述系统核心模块依据所述数据处理请求将一执行代码复制至所述执行引擎模块中,并发送一执行命令给所述执行引擎模块令其运行所述执行代码以形成一新数据集,所述系统核心模块提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0013]本申请的另一方面提供一种数据版本管理方法,所述方法包括以下步骤:预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎;以及;接收到用户提交的数据处理请求时,调用一执行后端引擎运行所述至少一执行代码以对所述至少一数据集执行处理,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0014]于本申请的一实施例中,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。
[0015]于本申请的一实施例中,所述的接收到用户提交的数据处理请求为提交一个新数据集时,提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,并记录形成的数据版本信息。
[0016]于本申请的一实施例中,所述的接收到用户提交的数据处理请求为修改所述数据管理模块中存储的一个数据集时,依据所述数据处理请求将一执行代码复制至所述执行引擎中,并发送一执行命令给所述执行引擎令其运行所述执行代码以形成一新数据集,提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的数据版本信息。
[0017]本申请的再一方面在于提供一种代码版本管理系统,包括:数据管理模块,代码管理模块,执行引擎模块,以及系统核心模块,其中所述数据管理模块存储有至少一个数据集;所述代码管理模块存储有至少一个执行代码,所述执行代码用于对所述数据管理模块存储的至少一个数据集进行操作;所述代码管理模块还用于接收用户推送的代码予以存储或依据用户推送的代码发送一代码处理请求;所述执行引擎模块配置有至少一种执行后端引擎,用于接收到执行命令时,依据一执行命令调用所述执行后端引擎,运行一执行代码以对所述数据管理模块中的一数据集执行操作;所述系统核心模块用于记录用户推送的代码并形成代码版本信息,以及接收到所述代码管理模块的代码处理请求时,发送一执行命令给所述执行引擎模块,令其运行所述代码管理模块中的执行代码,并在所述执行代码以对所述数据管理模块中的一数据集执行操作后记录形成的代码版本信息。
[0018]于本申请的一实施例中,所述系统核心模块还用于依据用户提交的数据处理请求将一执行代码复制至所述执行引擎模块中,并发送一执行命令给所述执行引擎模块令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。
[0019]于本申请的一实施例中,所述系统核心模块依据所述数据处理请求复制至所述执行引擎模块的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。
[0020]本申请的又一方面在于提供一种代码版本管理方法,包括以下步骤:预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎;以及;接收用户推送的代码予以存储,并记录形成的代码版本信息;或者依据用户推送的代码发送一代码处理请求,发送一执行命令给所述执行后端引擎令其运行预存的执行代码,并在所述执行代码以对预存的所述一数据集执行操作后记录形成的代码版本信息。
[0021]于本申请的一实施例中,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。
[0022]于本申请的一实施例中,代码版本管理方法还包括步骤,依据用户提交的数据处理请求将一执行代码复制至所述执行后端引擎中,并发送一执行命令令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。
[0023]于本申请的一实施例中,所述的依据所述数据处理请求复制至所述执行后端引擎中的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。
[0024]于本申请的一实施例中,代码版本管理方法还包括配置有多种用户UI的步骤,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。
[0025]如上所述,本发明的数据和代码版本管理系统及方法,具有以下有益效果:本发明通过为数据集和代码提供各自的版本管理,并为各数据集和代码提供有向无环的工作流及构建二者的关联关系,有效解决了数据和代码的版本管理效率低或混乱等问题;另外,采用UI设计,能够为用户比对、分析各历史数据集提供了便捷的途径;另外,各单元分布在不同服务器上,能够便于减轻各服务器上的运行压力。
【附图说明】
[0026]图1显示为本发明的数据版本管理系统的结构示意图。
[0027]图2显示为本发明的数据版本管理方法的流程图。
[0028]图3显示为本发明的代码版本管理系统的结构示意图。
[0029]图4显示为本发明的代码版本管理方法的流程图。
[0030]图5显示为本发明一具体实施例中数据工作流的组成示意图。
元件标号说明
[0031]I数据版本管理系统
[0032]11数据管理模块
[0033]12代码管理模块
[0034]13执行引擎模块
[0035]14系统核心模块
[0036]2代码版本管理系统
[0037]21数据管理模块
[0038]22代码管理模块
[0039]23执行引擎模块
[0040]24系统核心模块[0041 ]Sll ?S12、S21 ?S22步骤
【具体实施方式】
[0042]以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的【具体实施方式】加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
[0043]需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目及形状绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0044]实施例一
[0045]请参阅图1,显示为本发明的数据版本管理系统的结构示意图,如图所示,本申请的第一方面在于提供一种数据版本管理系统,所述数据版本管理体系可以配置在单台服务器、服务器集群、基于云计算架构的服务器、或分布式服务器中。其中,所述服务器集群指将很多服务器集中起来一起进行数据版本管理,所述服务器集群可以利用多个计算机进行并行计算,以提高运算速度。所述基于云计算架构的服务器通过虚拟化技术将各服务器存储池化,使得数据版本管理系统中各模块所在服务器共享计算资源。所述分布式服务器是将所述数据版本管理系统中的数据和程序分散在多个服务器上进行协调运行。
[0046]所述数据版本管理系统中的各模块可根据实际设计需要,配置在上述任一种服务器中。具体地,所述数据版本管理系统I包括:数据管理模块11,代码管理模块12,执行引擎模块13,以及系统核心模块14。
[0047]所述数据管理模块11存储有至少一个数据集。其中,所述数据集为被版本管理的数据的集合。所述数据包括但不限于:文本数据、和/或多媒体数据等。在一具体的实施例中,所述文本数据举例为代码数据、系统日志等。所述多媒体数据举例为图片数据、视频数据等。若所述数据管理模块11保存多个数据集,则各数据集之间可以是无关联的、或者有关联的。例如,数据集Al、A2、和A3中,数据集A3是由数据集Al和A2衍生出的。数据集A3通过索引、或关联字段与数据集Al和A2进行关联。
[0048]所述数据集中还可以包含用于索引、或描述数据的元数据。其中,所述数据集中的各数据及对应的元数据可藉由一数据ID相关联。具体地,所述元数据(Metadata)又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。所述的元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
[0049]一种可选方案是,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。在此,所述第一存储单元和第二存储单元可配置在同一数据库服务器内。也可以根据实际需要配置在不同的服务器内。例如在一可选的实施例中,所述第一存储单元配置于Hadoop分布式文件系统(大数据分布式文件系统)中;第二存储单元配置于NoSQL数据库(非关系型的数据库)中。
[°°50] 其中,所述分布式文件系统(Distributed File System)设计基于客户机/服务器模式,具体是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。所述NoSQL数据库例如为键值(Key-Value)存储数据库,列存储数据库,文档型数据库,图形(Graph)数据库或MongoDB数据库等。
[0051]在本申请中,利用分布式文件系统可以高效的扫描数据集,但是随机访问则低效的。为了解决这个问题,本申请提供的方案是,存储每张图片的标识和注解,例如文件名、大小、内容描述,这些内容被存储在NoSQL数据库中以加快查询速度,也就是根据数据ID来连接原始数据和元数据。
[0052]本申请的数据版本管理系统记录了数据的每个域,比如,一个新数据为一个新名字和版本号的集合。在本申请具体采用的实施例中使用的是MongoDB数据库来存储元数据,但并不局限与此,在其他的实施方式中,还可能将会迀移到列存储数据库,键值存储数据库,文档型数据库,或者图形(Graph)数据库中以提高效率。
[0053]所述代码管理模块12存储有至少一个执行代码,所述执行代码用于对所述至少一个数据集进行操作。其中,当所述执行代码被调用时,执行对数据集、及数据集中的数据进行增删改等操作。例如,所述执行代码包括但不限于:增加一新数据集的执行代码、删除数据集的执行代码、在预设数据集中的数据中增加标签/字符等的执行代码、在预设数据集中的数据中删除标签/字符等的执行代码、在预设数据集中的数据中替换标签/字符等的执行代码。
[0054]在一个可选用是实施例中,所述的执行代码存储在例如Gitlab中,并且使用GitLab的API与之交互。所述的Gitlab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。所述的Gitlab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,所述的Gitlab非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。所述的Gitlab还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
[0055]所述执行引擎模块13配置有至少一种执行后端引擎,依据接收的执行命令调用一执行后端引擎,运行一执行代码以对所述数据管理模块11中的至少一数据集执行操作。在此,所述执行后端引擎针对各执行代码的编程语言而设。所述执行后端引擎包括单机引擎及分布式引擎。
[0056]所述单机引擎例如为单机上的Python,所述的Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU General Public License)协议,其在执行时首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。
[0057]所述分布式引擎例如为集群上的Spark,所述Spark是一个快速且通用的计算集群框架,它的内核使用Scala语言编写,它提供了 Scala、Java和Python编程语言high-1 eve IAPI,使用这些API能够非常容易地开发并行处理的应用程序。
[0058]在具体的实施例中,配置所述的执行后端引擎是必需,因为这样不但方便为用户搭建好分布式集群的环境;还可以能够自动地将代码和结果数据集连接起来。也就是说,在本申请的数据版本管理系统中执行代码可以得到任意的中间结果,只要用户保留了原始数据和代码。
[0059]所述系统核心模块14接收到用户提交的数据处理请求时,处理所述数据管理模块11中的数据集,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0060]其中,所述数据工作流(DataWork Flow,DWF)用于标记在版本管理期间数据集和/或数据集中的数据的有向的无环的版本节点。对于新数据集来说,所述数据工作流对应标记版本节点为根节点。对于包含版本更新的数据集/数据来说,所述数据工作流为表示数据集中的两数据之间、和/或两数据集之间的衍生关系。所述衍生关系包括一数据集的执行历史记录和版本。其中,所述执行历史记录包括但不限于:变化前和变化后的数据集中数据的指向关系(即父子节点关系)、变化前后所调用的执行代码、执行时间等。简而言之,所述数据工作流的概念作为本申请的数据版本管理系统中的数据集逻辑关系。所述数据集依据此形成了依赖关系。所述数据工作流是本申请的数据版本管理系统中重现数据的核心功會K。
[0061]在一个所述数据工作流中,一个节点表示表示了数据集的一个特定版本。一条连接两个节点的有向边表示一个数据集是有另一个数据集衍生而来。边上的标记表示的则是一次实验的代码版本。请参阅图5,图5所示的一个数据工作流的示例,S卩,一个数据工作流是一个有向无环图。图片5表示了常见的一对一和多对一结构两种数据工作流结构。
[0062]在上述的一对一结构中,一个数据集由另一个数据集衍生而来。举例来说,用户可以基于一个已有的数据集创建一个新的数据集,并在新的数据集上打上一些新的标签并将其共享给其他用户。而上述的多对一结构表示一个数据集可以由两个或更多的数据集衍生而来。像一些合并两个数据表之类的操作都是如此。
[0063]在本申请的数据版本管理系统中在实现上述数据工作流结构的时候引入父子节点关系这一属性用来记录这个数据集是从哪个数据集衍生而来的。同时,本申请的数据版本管理系统还可以实现比较父子数据集之间的区别的功能。这些功能帮助用户能更容易的发现自己代码的修改导致了什么结果。因此,所述的数据工作流的结构图不但可以理顺数据集之间的关系,还可以帮助管理用户的执行记录,包括根据版本号来产生结果。
[0064]所述系统核心模块14根据变化前的数据集及数据的标记信息(如ID值)和数据工作流,得到并记录形成对应变化后的数据版本信息。其中,所述数据版本信息包括但不限于数据集名称、数据ID、代码ID、形成时间、及运行日志中的至少一种。
[0065]在此,所述系统核心模块14可以通过网络/提交接口获取用户提交的数据处理请求,并根据所获取的数据处理请求向所述执行引擎模块13发送对应的执行命令和从代码管理模块12中选定的执行代码,以供所述执行引擎模块13调用对应的执行后端引擎来运行所选择的执行代码,以便进行数据集的版本管理。
[0066]比如在一具体的实施过程中,每当用户向Gitlab服务器提交执行代码(Push),Gitlab服务器就会通过一个Web hook通知所述系统核心模块14。所述系统核心模块14会将用户请求推入自己的队列,同时从队首选取请求来进行处理。所述系统核心模块14会将该请求的执行代码拷贝到所述执行引擎模块13,然后所述执行引擎模块13会使用用户提供的参数和输入来运行执行代码。该任务结束之后,所述系统核心模块14会记录下这次请求的信息,包括这次Push在Gitlab服务器上的commit ID,用户指定的参数以及任何具体与实验相关的信息。有些情况下,实验会产生新的数据集。这样所述系统核心模块14也会记录这些数据集之间的关系,即前述的数据工作流。
[0067]当用户提交处理的数据请求为多种情况,以下将分别予以阐述:
[0068]在一种情况下,当所述数据处理请求为提交一个新数据集时,所述系统核心模块14可以直接将新数据集保存在第一存储单元中,创建所述新数据集的数据工作流,并记录形成的数据版本信息。或者,所述系统核心模块14按照该数据处理请求从代码管理模块12中选取对应的执行代码,以及向执行引擎模块13发送对应的提交新数据集的执行命令。所述执行引擎模块13根据所接收的执行命令执行所选取的执行代码,并将所获取的新数据集的数据存储于第一存储单元中。与此同时,所述系统核心模块14还创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0069]在一种可选方案中,所述新数据集包括数据和元数据。所述系统核心模块14在选取执行代码时,选取能够对应保存数据和元数据的执行代码,并执行所选取的执行代码,从新数据集中分别提取数据和元数据,再将所提取的数据存储于第一存储单元中,将所提取的元数据存储于第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,创建所述数据集的数据工作流,并记录形成的数据版本信息。在此,所述数据工作流中包含作为根节点的数据和对应的元数据。所记录的数据版本信息包括:数据集名称、数据ID、元数据ID、数据ID和元数据ID的对应关系、执行添加该数据集的代码ID、形成时间、及运行日志。
[0070]在另一种情况下,当用户提交的数据处理请求为修改所述数据管理模块11中存储的一个数据集时,所述系统核心模块14依据所述数据处理请求将一执行代码复制至所述执行引擎模块13中,并发送一执行命令给所述执行引擎模块13令其运行所述执行代码以形成一新数据集。再将所形成的新数据集保存在第一存储单元中,同时创建该新数据集相对修改前的数据集的数据工作流,并记录形成的数据版本信息。
[0071]一种可选方式是,所述系统核心模块14提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0072]更为优选的方式是,所述系统核心模块14依据所述数据处理请求复制至所述执行引擎模块13的执行代码为用户提交的新执行代码或者调用的所述代码管理模块12中存储的执行代码。
[0073]具体地,用户还可以预先根据自身需求提交新的执行代码,并手动、或通过所述系统核心模块14调整新的执行代码与执行引擎模块13中的执行后端引擎之间的对应关系。由此,当用户提交的数据处理请求为修改所述数据管理模块11中存储的一个数据集时,所述系统核心模块14依据所述数据处理请求,确定将该新的执行代码复制到所述执行引擎模块13中,并由对应的执行后端引擎执行相应的执行代码,以保存新的数据集,并创建新的数据集相对于修改前的数据集的数据工作流,并记录形成的数据版本信息。
[0074]当用户需要对不同版本之间的数据集进行分析和计算时,本实施例中一种优选方式为,所述数据版本管理系统I还包括:用户接口模块(未予以图示)。所述用户接口模块配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。
[0075]具体地,用户经常需要分析一些数据集并且计算一些参数,比如自然语言处理中的准确率或者股票市场回测中的每日投资回报。在创建了数据集的数据工作流及数据版本信息之后,所述用户接口模块可为用户提供基于数据工作流而关联的各数据集中的数据。所显示的数据可以帮助用户对比一对历史分析结果、展示代码和/或参数上的不同。针对多种用户的多种UI设计可以帮助每一个用户得到最好的算法和参数。
[0076]综上所述,本申请提供的数据版本管理系统可以实现在一个整合的系统里管理数据的版本,并在系统中运行用户代码;同时可以保留用户的代码和数据,并能对两次版本进行比较,发现不同;另外,本发明的数据版本管理系统将数据和元数据分开存储,使得可以更快捷的过滤数据;再者,本发明通过为数据集和代码提供各自的版本管理,并为各数据集和代码提供有向无环的工作流及构建二者的关联关系,有效解决了数据和代码的版本管理效率低或混乱等问题;另外,采用多种UI设计,能够为用户比对、分析各历史数据集提供了便捷的途径;另外,各单元分布在不同服务器上,能够便于减轻各服务器上的运行压力。
[0077]实施例二
[0078]请参阅图2,显示为本发明的数据版本管理方法的流程图,如图所示,本申请的第二方面在于提供一种数据版本管理方法。所述数据版本管理方法主要有数据版本管理系统来执行。其中,所述数据版本管理系统可以配置在单台服务器、服务器集群、基于云计算架构的服务器、或分布式服务器中。其中,所述服务器集群指将很多服务器集中起来一起进行数据版本管理,所述服务器集群可以利用多个计算机进行并行计算,以提高运算速度。所述基于云计算架构的服务器通过虚拟化技术将各服务器存储池化,使得数据版本管理系统中各模块所在服务器共享计算资源。所述分布式服务器是将所述数据版本管理系统中的数据和程序分散在多个服务器上进行协调运行。
[0079]所述数据版本管理系统中的各模块可根据实际设计需要,配置在上述任一种服务器中。所述数据版本管理系统按照如下各步骤执行所述方法。
[0080]在步骤Sll中,预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎。
[0081]在此,所述数据集为被版本管理的数据的集合。所述数据包括但不限于:文本数据、和/或多媒体数据等。在一具体的实施例中,所述文本数据举例为代码数据、系统日志等。所述多媒体数据举例为图片数据、视频数据等。若所述数据管理模块保存多个数据集,则各数据集之间可以是无关联的、或者有关联的。例如,数据集A1、A2、和A3中,数据集A3是由数据集Al和A2衍生出的。数据集A3通过索引、或关联字段与数据集Al和A2进行关联。
[0082]所述数据集中还可以包含用于索引、或描述数据的元数据。其中,所述数据集中的各数据及对应的元数据可藉由一数据ID相关联。具体地,所述元数据(Metadata)又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。所述的元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
[0083]一种可选方案是,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。在此,所述第一存储单元和第二存储单元可配置在同一数据库服务器内。也可以根据实际需要配置在不同的服务器内。例如在一可选的实施例中,所述第一存储单元配置于Hadoop分布式文件系统(大数据分布式文件系统)中;第二存储单元配置于NoSQL数据库(非关系型的数据库)中。
[0084]其中,所述分布式文件系统(Distributed File System)设计基于客户机/服务器模式,具体是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。所述NoSQL数据库例如为键值(Key-Value)存储数据库,列存储数据库,文档型数据库,图形(Graph)数据库或MongoDB数据库等。
[0085]在本申请中,利用分布式文件系统可以高效的扫描数据集,但是随机访问则低效的。为了解决这个问题,本申请提供的方案是,存储每张图片的标识和注解,例如文件名、大小、内容描述,这些内容被存储在NoSQL数据库中以加快查询速度,也就是根据数据ID来连接原始数据和元数据。
[0086]本申请的数据版本管理系统记录了数据的每个域,比如,一个新数据为一个新名字和版本号的集合。在本申请具体采用的实施例中使用的是MongoDB数据库来存储元数据,但并不局限与此,在其他的实施方式中,还可能将会迀移到列存储数据库,键值存储数据库,文档型数据库,或者图形(Graph)数据库中以提高效率。
[0087]在此,所述执行代码用于对所述至少一个数据集进行操作。其中,当所述执行代码被调用时,执行对数据集、及数据集中的数据进行增删改等操作。例如,所述执行代码包括但不限于:增加一新数据集的执行代码、删除数据集的执行代码、在预设数据集中的数据中增加标签/字符等的执行代码、在预设数据集中的数据中删除标签/字符等的执行代码、在预设数据集中的数据中替换标签/字符等的执行代码。
[0088]在一个可选用是实施例中,所述的执行代码存储在例如Gitlab中,并且使用GitLab的API与之交互。所述的Gitlab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。所述的Gitlab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,所述的Gitlab非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。所述的Gitlab还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。在此,所述执行后端引擎针对各执行代码的编程语言而设。所述执行后端引擎包括单机引擎及分布式引擎。
[0089]所述单机引擎例如为单机上的Python,所述的Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU General Public License)协议,其在执行时首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。
[0090]所述分布式引擎例如为集群上的Spark,所述Spark是一个快速且通用的计算集群框架,它的内核使用Scala语言编写,它提供了 Scala、Java和Python编程语言high-1 eve IAPI,使用这些API能够非常容易地开发并行处理的应用程序。
[0091]在具体的实施例中,配置所述的执行后端引擎是必需,因为这样不但方便为用户搭建好分布式集群的环境;还可以能够自动地将代码和结果数据集连接起来。也就是说,在本申请的数据版本管理系统中执行代码可以得到任意的中间结果,只要用户保留了原始数据和代码。
[0092]在步骤S12中,接收到用户提交的数据处理请求时,调用一执行后端引擎运行所述至少一执行代码以对所述至少一数据集执行处理,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0093]具体地,所述数据版本管理系统接收到用户提交的数据处理请求时,处理所述数据管理模块中的数据集,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0094]其中,所述数据工作流(DataWork Flow,DWF)用于标记在版本管理期间数据集和/或数据集中的数据的有向的无环的版本节点。对于新数据集来说,所述数据工作流对应标记版本节点为根节点。对于包含版本更新的数据集/数据来说,所述数据工作流为表示数据集中的两数据之间、和/或两数据集之间的衍生关系。
[0095]所述衍生关系包括一数据集的执行历史记录和版本。其中,所述执行历史记录包括但不限于:变化前和变化后的数据集中数据的指向关系(即父子节点关系)、变化前后所调用的执行代码、执行时间等。简而言之,所述数据工作流的概念作为本申请的数据版本管理系统中的数据集逻辑关系。所述数据集依据此形成了依赖关系。所述数据工作流是本申请的数据版本管理系统中重现数据的核心功能。
[0096]在一个所述数据工作流中,一个节点表示表示了数据集的一个特定版本。一条连接两个节点的有向边表示一个数据集是有另一个数据集衍生而来。边上的标记表示的则是一次实验的代码版本。请参阅图5,图5所示的一个数据工作流的示例,S卩,一个数据工作流是一个有向无环图。图片5表示了常见的一对一和多对一结构两种数据工作流结构。
[0097]在上述的一对一结构中,一个数据集由另一个数据集衍生而来。举例来说,用户可以基于一个已有的数据集创建一个新的数据集,并在新的数据集上打上一些新的标签并将其共享给其他用户。而上述的多对一结构表示一个数据集可以由两个或更多的数据集衍生而来。像一些合并两个数据表之类的操作都是如此。
[0098]在本申请的数据版本管理系统中在实现上述数据工作流结构的时候引入父子节点关系这一属性用来记录这个数据集是从哪个数据集衍生而来的。同时,本申请的数据版本管理系统还可以实现比较父子数据集之间的区别的功能。这些功能帮助用户能更容易的发现自己代码的修改导致了什么结果。因此,所述的数据工作流的结构图不但可以理顺数据集之间的关系,还可以帮助管理用户的执行记录,包括根据版本号来产生结果。
[0099]所述数据版本管理系统根据变化前的数据集及数据的标记信息(如ID值)和数据工作流,得到并记录形成对应变化后的数据版本信息。其中,所述数据版本信息包括但不限于数据集名称、数据ID、代码ID、形成时间、及运行日志中的至少一种。
[0100]在此,所述数据版本管理系统可以通过网络/提交接口获取用户提交的数据处理请求,并根据所获取的数据处理请求向所述执行引擎模块发送对应的执行命令和从代码管理模块中选定的执行代码,以供所述执行引擎模块调用对应的执行后端引擎来运行所选择的执行代码,以便进行数据集的版本管理。
[0101]比如在一具体的实施过程中,每当用户向Gitlab服务器提交执行代码(Push),Gitlab服务器就会通过一个Web hook通知所述系统核心模块14。所述系统核心模块14会将用户请求推入自己的队列,同时从队首选取请求来进行处理。所述系统核心模块14会将该请求的执行代码拷贝到所述执行引擎模块13,然后所述执行引擎模块13会使用用户提供的参数和输入来运行执行代码。该任务结束之后,所述系统核心模块14会记录下这次请求的信息,包括这次Push在Gitlab服务器上的commit ID,用户指定的参数以及任何具体与实验相关的信息。有些情况下,实验会产生新的数据集。这样所述系统核心模块14也会记录这些数据集之间的关系,即前述的数据工作流。
[0102]当用户提交处理的数据请求为多种情况,以下将分别予以阐述:
[0103]在一种情况下,当所述数据处理请求为提交一个新数据集时,所数据版本管理系统可以直接将新数据集保存在第一存储单元中,创建所述新数据集的数据工作流,并记录形成的数据版本信息。或者,所述数据版本管理系统按照该数据处理请求选取对应的执行代码,以将所获取的新数据集的数据存储于第一存储单元中。与此同时,所述数据版本管理系统还创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0104]在一种可选方案中,所述新数据集包括数据和元数据。所述数据版本管理系统在选取执行代码时,选取能够对应保存数据和元数据的执行代码,并执行所选取的执行代码,从新数据集中分别提取数据和元数据,再将所提取的数据存储于第一存储单元中,将所提取的元数据存储于第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,创建所述数据集的数据工作流,并记录形成的数据版本信息。在此,所述数据工作流中包含作为根节点的数据和对应的元数据。所记录的数据版本信息包括:数据集名称、数据ID、元数据ID、数据ID和元数据ID的对应关系、执行添加该数据集的代码ID、形成时间、及运行日
V 1、1、O
[0105]在另一种情况下,当用户提交的数据处理请求为修改已存储的一个数据集时,所述数据版本管理系统依据所述数据处理请求将一执行代码复制至相应的执行后端引擎中,并发送一执行命令给所述执行后端引擎令其运行所述执行代码以形成一新数据集。再将所形成的新数据集保存在第一存储单元中,同时创建该新数据集相对修改前的数据集的数据工作流,并记录形成的数据版本信息。
[0106]—种可选方式是,所述数据版本管理系统提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,创建所述数据集的数据工作流,并记录形成的数据版本信息。
[0107]更为优选的方式是,所述数据版本管理系统依据所述数据处理请求复制至所述执行后端引擎的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。
[0108]具体地,用户还可以预先根据自身需求提交新的执行代码,并通过所述数据版本管理系统调整新的执行代码与各执行后端引擎之间的对应关系。由此,当用户提交的数据处理请求为修改已存储的一个数据集时,所述数据版本管理系统依据所述数据处理请求,确定将该新的执行代码复制到对应执行后端引擎中,并由对应的执行后端引擎执行相应的执行代码,以保存新的数据集,并创建新的数据集相对于修改前的数据集的数据工作流,并记录形成的数据版本信息。
[0109]当用户需要对不同版本之间的数据集进行分析和计算时,本实施例中一种优选方式为,所述数据版本管理方法还包括配置有多种用户UI的步骤,在该步骤中,配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。
[0110]具体地,用户经常需要分析一些数据集并且计算一些参数,比如自然语言处理中的准确率或者股票市场回测中的每日投资回报。在创建了数据集的数据工作流及数据版本信息之后,所述数据版本管理系统可为用户提供基于数据工作流而关联的各数据集中的数据。所显示的数据可以帮助用户对比一对历史分析结果、展示代码和/或参数上的不同。针对多种用户的多种UI设计可以帮助每一个用户得到最好的算法和参数。
[0111]综上所述,本申请提供的数据版本管理系统可以实现在一个整合的系统里管理数据的版本,并在系统中运行用户代码;同时可以保留用户的代码和数据,并能对两次版本进行比较,发现不同;另外,本发明的数据版本管理系统将数据和元数据分开存储,使得可以更快捷的过滤数据;再者,本发明通过为数据集和代码提供各自的版本管理,并为各数据集和代码提供有向无环的工作流及构建二者的关联关系,有效解决了数据和代码的版本管理效率低或混乱等问题;另外,采用多种UI设计,能够为用户比对、分析各历史数据集提供了便捷的途径;另外,各单元分布在不同服务器上,能够便于减轻各服务器上的运行压力。
[0112]实施例三
[0113]请参阅图3,显示为本发明的代码版本管理系统的结构示意图,如图所示,本申请的第三方面在于提供一种代码版本管理系统,所述代码版本管理系统可以配置在单台服务器、服务器集群、基于云计算架构的服务器、或分布式服务器中。其中,所述服务器集群指将很多服务器集中起来一起进行数据版本管理,所述服务器集群可以利用多个计算机进行并行计算,以提高运算速度。所述基于云计算架构的服务器通过虚拟化技术将各服务器存储池化,使得代码版本管理系统中各模块所在服务器共享计算资源。所述分布式服务器是将所述代码版本管理系统中的数据和程序分散在多个服务器上进行协调运行。
[0114]所述代码版本管理系统中的各模块可根据实际设计需要,配置在上述任一种服务器中。具体地,所述代码版本管理系统2包括:数据管理模块21、代码管理模块22、执行引擎模块23和系统核心模块24。
[0115]所述数据管理模块21存储有至少一个数据集。
[0116]其中,所述数据集为被版本管理的数据的集合。所述数据包括但不限于:文本数据、和/或多媒体数据等。在一具体的实施例中,所述文本数据举例为代码数据、系统日志等。所述多媒体数据举例为图片数据、视频数据等。若所述数据管理模块21保存多个数据集,则各数据集之间可以是无关联的、或者有关联的。例如,数据集A1、A2、和A3中,数据集A3是由数据集Al和A2衍生出的。数据集A3通过索引、或关联字段与数据集Al和A2进行关联。
[0117]所述数据集中还可以包含用于索引、或描述数据的元数据。其中,所述数据集中的各数据及对应的元数据可藉由一数据ID相关联。具体地,所述元数据(Metadata)又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。所述的元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
[0118]—种可选方案是,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。在此,所述第一存储单元和第二存储单元可配置在同一数据库服务器内。也可以根据实际需要配置在不同的服务器内。例如在一可选的实施例中,所述第一存储单元配置于Hadoop分布式文件系统(大数据分布式文件系统)中;第二存储单元配置于NoSQL数据库(非关系型的数据库)中。
[ΟΙ19] 其中,所述分布式文件系统(Distributed File System)设计基于客户机/服务器模式,具体是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。所述NoSQL数据库例如为键值(Key-Value)存储数据库,列存储数据库,文档型数据库,图形(Graph)数据库或MongoDB数据库等。
[0120]在本申请中,利用分布式文件系统可以高效的扫描数据集,但是随机访问则低效的。为了解决这个问题,本申请提供的方案是,存储每张图片的标识和注解,例如文件名、大小、内容描述,这些内容被存储在NoSQL数据库中以加快查询速度,也就是根据数据ID来连接原始数据和元数据。
[0121]本申请的代码版本管理系统记录了数据的每个域,比如,一个新数据为一个新名字和版本号的集合。在本申请具体采用的实施例中使用的是MongoDB数据库来存储元数据,但并不局限与此,在其他的实施方式中,还可能将会迀移到列存储数据库,键值存储数据库,文档型数据库,或者图形(Graph)数据库中以提高效率。
[0122]所述代码管理模块22存储有至少一个执行代码,所述执行代码用于对所述数据管理模块21存储的至少一个数据集进行操作。
[0123]其中,当所述执行代码被调用时,执行对数据集、及数据集中的数据进行增删改等操作。例如,所述执行代码包括但不限于:增加一新数据集的执行代码、删除数据集的执行代码、在预设数据集中的数据中增加标签/字符等的执行代码、在预设数据集中的数据中删除标签/字符等的执行代码、在预设数据集中的数据中替换标签/字符等的执行代码。
[0124]在一个可选用是实施例中,所述的执行代码存储在例如Gitlab中,并且使用GitLab的API与之交互。所述的Gitlab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。所述的Gitlab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,所述的Gitlab非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。所述的Gitlab还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
[0125]除此之外,所述代码管理模块22还用于接收用户推送的代码予以存储或依据用户推送的代码发送一代码处理请求。
[0126]在其中一种情形下,所述代码管理模块22用于接收用户推送的代码予以存储。
[0127]具体地,用户使用用户终端向所述代码管理模块22上传代码,则所述代码管理模块22将所接收的代码予以保存。其中,所述代码是用户根据所述代码版本管理系统2所提供的API新建/改编的执行代码。例如,用户改进了所述代码管理模块22中的一执行代码,并通过后续详细描述的系统核心模块24,将改进后的执行代码上传至所述代码管理模块22,则所述代码管理模块22将所接收的代码予以更新并保存。
[0128]在另一种情形下,所述代码管理模块22用于依据用户推送的代码发送一代码处理请求。
[0129]在此,用户推送的代码无需预先在系统核心模块24中进行与执行引擎模块23的配置,则当用户选择预先推送的执行代码来在管理数据集时,所述代码管理模块22向系统核心模块24发送一代码处理请求,以告知系统核心模块24所对应的执行后端引擎。
[0130]所述执行引擎模块23,配置有至少一种执行后端引擎,用于接收到执行命令时,依据一执行命令调用所述执行后端引擎,运行一执行代码以对所述数据管理模块21中的一数据集执行操作。
[0131]在此,所述执行后端引擎针对各执行代码的编程语言而设。所述执行后端引擎包括单机引擎及分布式引擎。
[0132]所述单机引擎例如为单机上的Python,所述的Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU General Public License)协议,其在执行时首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。
[0133]所述分布式引擎例如为集群上的Spark,所述Spark是一个快速且通用的计算集群框架,它的内核使用Scala语言编写,它提供了 Scala、Java和Python编程语言high-1 eve IAPI,使用这些API能够非常容易地开发并行处理的应用程序。
[0134]在具体的实施例中,配置所述的执行后端引擎是必需,因为这样不但方便为用户搭建好分布式集群的环境;还可以能够自动地将代码和结果数据集连接起来。也就是说,在本申请的代码版本管理系统中执行代码可以得到任意的中间结果,只要用户保留了原始数据和代码。
[0135]所述系统核心模块24用于记录用户推送的代码并形成代码版本信息;以及接收到所述代码管理模块22的代码处理请求时,发送一执行命令给所述执行引擎模块23,令其运行所述代码管理模块22中的执行代码,并在所述执行代码以对所述数据管理模块21中的一数据集执行操作后记录形成的代码版本信息。
[0136]在此,对于所述系统核心模块24的功能,予以分别描述。在其中一种方式中,当用户推送代码时,所述系统核心模块24将所接收的代码传递给代码管理模块22,以便保存,同时形成对应所述代码的代码版本信息。其中,与上述各实施例中的数据版本信息类似,所述代码版本信息包括但不限于以下至少一种:代码名称、代码ID、形成时间、指定参数、及运行日志。所述系统核心模块24可参考利用数据集工作流来管理数据集的方式,对所述代码进行版本管理。例如,用户改进了已存储的一执行代码,则所述代码版本管理系统2将所接收的代码予以更新并保存。与此同时,所述代码管理系统还记录修改前后两执行代码之间的对应关系,以形成代码工作流;并在修改前的执行代码版本信息的基础上,确定并记录修改后的代码版本信息。在另一种方式中,当用户选用推送的代码来管理数据集时,所述系统核心模块24基于所述代码管理模块22的代码处理请求,发送一执行命令给所述执行引擎模块23,令其运行所述代码管理模块22中的执行代码,并在所述执行代码以对所述数据管理模块21中的一数据集执行操作后记录形成的代码版本信息。例如,用户通过输入参数、代码版本信息等来选择预先推送的代码管理数据集中的数据变更,则所述系统核心模块24将所接收的参数、代码版本信息等提供给代码管理模块22。所述代码管理模块22根据上述信息确定所要执行的执行代码,并向所述系统核心模块24发送相应的代码处理请求。所述系统核心模块24根据所述代码处理请求向执行引擎模块23发送执行命令。则所述执行引擎模块23根据所述执行命令选择相应的执行后端引擎来执行所指定的执行代码,并在所述执行代码以对所述数据管理模块21中的一数据集执行操作后,记录形成的代码版本信息。其中,所述代码版本信息、数据工作流、和数据版本信息中的至少一种中还记录所执行的代码与数据集之间的对应关系。
[0137]在一具体的实施过程中,每当用户向Gitlab服务器提交的执行代码,Gitlab服务器就会通过一个Web hook通知所述系统核心模块24。所述系统核心模块24会将用户请求推入自己的队列,同时从队首选取请求来进行处理。所述系统核心模块24会将该请求的执行代码拷贝到所述执行引擎模块23,并向所述执行引擎模块23发送代码处理请求,以告知所选用的执行后端引擎。然后所述执行引擎模块23会使用用户提供的参数和输入来运行执行代码。该任务结束之后,所述系统核心模块24会记录下这次请求的信息,包括这次Push在Gitlab服务器上的commit ID、执行代码版本信息、用户指定的参数以及任何具体与实验相关的信息。有些情况下,实验会产生新的数据集。这样所述系统核心模块24也会记录这些数据集之间的关系,即前述各实施例中所述的数据工作流。
[0138]需要说明的是,所述系统核心模块24依据所述数据处理请求复制至所述执行引擎模块23的执行代码除了用户提交的新执行代码之外,还可以是调用的所述代码管理模块22中存储的执行代码。例如,用户指定代码管理模块22中的执行代码来处理相应的数据集,而非利用代码管理模块22中默认的执行代码。
[0139]在一种可选方案中,所述系统核心模块24还用于依据用户提交的数据处理请求将一执行代码复制至所述执行引擎模块23中,并发送一执行命令给所述执行引擎模块23令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。
[0140]其中,所述数据处理请求包括但不限于:提交一个新数据集、或修改所述数据管理模块21中存储的一个数据集。
[0141]具体地,在上述数据版本管理系统形成数据工作流和数据版本信息的基础上,以及在本实施例中的系统核心模块24在将一执行代码复制至所述执行引擎模块23中,并发送一执行命令给所述执行引擎模块23令其运行所述执行代码以形成一新数据集的基础上,还对所执行的执行代码ID与新数据集相关联,并记录形成的代码版本信息。如此,当用户需要对多个关联数据集的执行历史记录进行分析时,可得到对应各数据集的执行代码的相关信息。为用户提供更多的用于数据集分析、统计的中间信息。
[0142]作为一种优选方案,所述代码版本管理系统2还包括用户接口模块,配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。
[0143]具体地,用户经常需要分析一些数据集并且计算一些参数,比如自然语言处理中的准确率或者股票市场回测中的每日投资回报。在创建了数据集的数据工作流及数据版本信息之后,所述用户接口模块可为用户提供基于数据工作流而关联的各数据集中的数据、执行代码等。所显示的数据可以帮助用户对比一对历史分析结果、展示代码和/或参数上的不同。针对多种用户的多种UI设计可以帮助每一个用户得到最好的算法和参数。
[0144]综上所述,本申请提供的代码版本管理系统可以实现在一个整合的系统里管理代码的版本,并在系统中运行用户代码;同时可以保留用户的代码和数据,并能对两次版本进行比较,发现不同;另外,本发明的代码版本管理系统将数据和元数据分开存储,使得可以更快捷的过滤数据;再者,本发明通过为数据集和代码提供各自的版本管理,并为各数据集和代码提供有向无环的工作流及构建二者的关联关系,有效解决了数据和代码的版本管理效率低或混乱等问题;另外,采用多种UI设计,能够为用户比对、分析各历史数据集提供了便捷的途径;另外,各单元分布在不同服务器上,能够便于减轻各服务器上的运行压力。
[0145]实施例四
[0146]请参阅图4,显示为本发明的代码版本管理方法的流程图,如图所示,本申请的第四方面在于提供一种代码版本管理方法。所述代码版本管理方法主要由代码版本管理系统来执行。其中,所述代码版本管理系统可以配置在单台服务器、服务器集群、基于云计算架构的服务器、或分布式服务器中。其中,所述服务器集群指将很多服务器集中起来一起进行数据版本管理,所述服务器集群可以利用多个计算机进行并行计算,以提高运算速度。所述基于云计算架构的服务器通过虚拟化技术将各服务器存储池化,使得代码版本管理系统中各模块所在服务器共享计算资源。所述分布式服务器是将所述代码版本管理系统中的数据和程序分散在多个服务器上进行协调运行。
[0147]所述代码版本管理系统中的各模块可根据实际设计需要,配置在上述任一种服务器中。具体地,所述代码版本管理系统通过执行如下步骤来执行所述方法。
[0148]在步骤S21中,预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎。
[0149]其中,所述数据集为被版本管理的数据的集合。所述数据包括但不限于:文本数据、和/或多媒体数据等。在一具体的实施例中,所述文本数据举例为代码数据、系统日志等。所述多媒体数据举例为图片数据、视频数据等。若所述数据管理模块21保存多个数据集,则各数据集之间可以是无关联的、或者有关联的。例如,数据集A1、A2、和A3中,数据集A3是由数据集Al和A2衍生出的。数据集A3通过索引、或关联字段与数据集Al和A2进行关联。
[0150]所述数据集中还可以包含用于索引、或描述数据的元数据。其中,所述数据集中的各数据及对应的元数据可藉由一数据ID相关联。具体地,所述元数据(Metadata)又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。所述的元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
[0151]—种可选方案是,所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。在此,所述第一存储单元和第二存储单元可配置在同一数据库服务器内。也可以根据实际需要配置在不同的服务器内。例如在一可选的实施例中,所述第一存储单元配置于Hadoop分布式文件系统(大数据分布式文件系统)中;第二存储单元配置于NoSQL数据库(非关系型的数据库)中。
[Ο152] 其中,所述分布式文件系统(Distributed File System)设计基于客户机/服务器模式,具体是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。所述NoSQL数据库例如为键值(Key-Value)存储数据库,列存储数据库,文档型数据库,图形(Graph)数据库或MongoDB数据库等。
[0153]在本申请中,利用分布式文件系统可以高效的扫描数据集,但是随机访问则低效的。为了解决这个问题,本申请提供的方案是,存储每张图片的标识和注解,例如文件名、大小、内容描述,这些内容被存储在NoSQL数据库中以加快查询速度,也就是根据数据ID来连接原始数据和元数据。
[0154]本申请的代码版本管理系统记录了数据的每个域,比如,一个新数据为一个新名字和版本号的集合。在本申请具体采用的实施例中使用的是MongoDB数据库来存储元数据,但并不局限与此,在其他的实施方式中,还可能将会迀移到列存储数据库,键值存储数据库,文档型数据库,或者图形(Graph)数据库中以提高效率。
[0155]所述执行代码用于描述对数据集、及数据集中的数据进行增删改等操作。例如,所述执行代码包括但不限于:增加一新数据集的执行代码、删除数据集的执行代码、在预设数据集中的数据中增加标签/字符等的执行代码、在预设数据集中的数据中删除标签/字符等的执行代码、在预设数据集中的数据中替换标签/字符等的执行代码。
[0156]在一个可选用是实施例中,所述的执行代码存储在例如Gitlab中,并且使用GitLab的API与之交互。所述的Gitlab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。所述的Gitlab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,所述的Gitlab非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。所述的Gitlab还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
[0157]在此,所述执行后端引擎针对各执行代码的编程语言而设。所述执行后端引擎包括单机引擎及分布式引擎。
[0158]所述单机引擎例如为单机上的Python,所述的Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU General Public License)协议,其在执行时首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。
[0?59]所述分布式引擎例如为集群上的Spark,所述Spark是一个快速且通用的计算集群框架,它的内核使用Scala语言编写,它提供了 Scala、Java和Python编程语言high-1 eve IAPI,使用这些API能够非常容易地开发并行处理的应用程序。
[0160]在具体的实施例中,配置所述的执行后端引擎是必需,因为这样不但方便为用户搭建好分布式集群的环境;还可以能够自动地将代码和结果数据集连接起来。也就是说,在本申请的代码版本管理系统中执行代码可以得到任意的中间结果,只要用户保留了原始数据和代码。
[0161]在步骤S22中,接收用户推送的代码予以存储,并记录形成的代码版本信息;或者依据用户推送的代码发送一代码处理请求,发送一执行命令给所述执行后端引擎令其运行预存的执行代码,并在所述执行代码以对预存的所述一数据集执行操作后记录形成的代码版本信息。
[0162]其中,所述代码版本管理系统接收用户推送的代码予以存储,并记录形成的代码版本信息的方式具体如下:
[0163]用户使用用户终端向所述代码版本管理系统上传代码,则所述代码管理模块将所接收的代码予以保存,同时形成对应所述代码的代码版本信息。其中,所述代码可以是用户根据所述代码版本管理系统所提供的API新建/改编的执行代码。另外,与前述各实施例中的数据版本信息类似,所述代码版本信息包括但不限于以下至少一种:代码名称、代码ID、形成时间、指定参数、及运行日志。所述代码版本管理系统可参考利用数据集工作流来管理数据集的方式,对所述代码进行版本管理。
[0164]例如,用户改进了已存储的一执行代码,则所述代码版本管理系统将所接收的代码予以更新并保存。与此同时,所述代码管理系统还记录修改前后两执行代码之间的对应关系,以形成代码工作流;并在修改前的执行代码版本信息的基础上,确定并记录修改后的代码版本信息。
[0165]或者,所述代码版本管理系统依据用户推送的代码发送一代码处理请求,发送一执行命令给所述执行后端引擎令其运行预存的执行代码,并在所述执行代码以对预存的所述一数据集执行操作后记录形成的代码版本信息。
[0166]具体地,用户推送的代码无需预先与对应的执行后端引擎进行配置,而是当用户选择预先推送的执行代码来在管理数据集时,所述代码版本管理系统生成一包含对应执行后端引擎的代码处理请求,并启动对应的执行后端引擎,令其运行所推送的执行代码,并在执行所述执行代码以对一数据集执行操作后,记录形成的代码版本信息。
[0167]例如,用户通过输入参数、代码版本信息等来选择预先推送的代码,以管理数据集中的数据变更。所述代码版本管理系统基于所接收的参数、代码版本信息等确定所要执行的执行代码,并生成对应的代码处理请求。所述系统核心模块根据所述代码处理请求向对应的执行后端引擎发送执行命令。则所述执行后端引擎根据所述执行命令执行所指定的执行代码,并在所述执行代码以对所述数据管理模块中的一数据集执行操作后,记录形成的代码版本信息。其中,所述代码版本信息、数据工作流、和数据版本信息中的至少一种中还记录所执行的代码与数据集之间的对应关系。
[0168]在一具体的实施过程中,每当用户向Gitlab服务器提交的执行代码,Gitlab服务器就会通过一个Web hook通知所述代码版本管理系统。所述代码版本管理系统会将用户请求推入自己的队列,同时从队首选取请求来进行处理;并将该请求的执行代码拷贝到对应的执行后端引擎,以告知所选用的执行后端引擎。然后所述执行后端引擎会使用用户提供的参数和输入来运行执行代码。该任务结束之后,所述代码版本管理系统会记录下这次请求的信息,包括这次Push在GitIab服务器上的commit ID、执行代码版本信息、用户指定的参数以及任何具体与实验相关的信息。有些情况下,实验会产生新的数据集。这样所述代码版本管理系统也会记录这些数据集之间的关系,即前述各实施例中所述的数据工作流。
[0169]需要说明的是,所述代码版本管理系统依据所述数据处理请求复制至相应执行后端引擎的执行代码除了用户提交的新执行代码之外,还可以是调用的已存储的执行代码。例如,用户指定已存储的执行代码来处理相应的数据集,而非利用代码管理模块中默认的执行代码。
[0170]在一种可选方案中,所述代码版本管理系统依据用户提交的数据处理请求将一执行代码复制至所述执行后端引擎中,并发送一执行命令给所述执行后端引擎令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。
[0171]其中,所述数据处理请求包括但不限于:提交一个新数据集、或修改所述数据管理模块中存储的一个数据集。
[0172]具体地,在上述数据版本管理系统形成数据工作流和数据版本信息的基础上,以及在所述代码版本管理系统在将一执行代码复制至所述执行后端引擎中,并发送一执行命令给所述执行后端引擎,令其运行所述执行代码以形成一新数据集的基础上,所述代码版本管理系统还对所执行的执行代码ID与新数据集相关联,并记录形成的代码版本信息。如此,当用户需要对多个关联数据集的执行历史记录进行分析时,可得到对应各数据集的执行代码的相关信息。为用户提供更多的用于数据集分析、统计的中间信息。
[0173]作为一种优选方案,所述代码版本管理方法还包括:配置有多种用户UI的步骤。在这一步骤中,配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。
[0174]具体地,用户经常需要分析一些数据集并且计算一些参数,比如自然语言处理中的准确率或者股票市场回测中的每日投资回报。在创建了数据集的数据工作流及数据版本信息之后,所述代码版本管理系统可为用户提供基于数据工作流而关联的各数据集中的数据、执行代码等。所显示的数据可以帮助用户对比一对历史分析结果、展示代码和/或参数上的不同。针对多种用户的多种UI设计可以帮助每一个用户得到最好的算法和参数。
[0175]需要说明的是,本发明中各实施例所述的数据版本管理系统和代码版本管理系统中的各模块可根据命名协调共用,使得两个版本管理系统能够同时管理数据集和执行代码、各自的版本。
[0176]综上所述,本申请提供的代码版本管理系统可以实现在一个整合的系统里管理代码的版本,并在系统中运行用户代码;同时可以保留用户的代码和数据,并能对两次版本进行比较,发现不同;另外,本发明通过为数据集和代码提供各自的版本管理,并为各数据集和代码提供有向无环的工作流及构建二者的关联关系,有效解决了数据和代码的版本管理效率低或混乱等问题;另外,采用UI设计,能够为用户比对、分析各历史数据集提供了便捷的途径;另外,各单元分布在不同服务器上,能够便于减轻各服务器上的运行压力。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0177]上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
【主权项】
1.一种数据版本管理系统,其特征在于,包括: 数据管理模块,存储有至少一个数据集; 代码管理模块,存储有至少一个执行代码,所述执行代码用于对所述至少一个数据集进行操作; 执行引擎模块,配置有至少一种执行后端引擎,依据接收的执行命令调用一执行后端引擎,运行一执行代码以对所述数据管理模块中的至少一数据集执行操作; 系统核心模块,接收到用户提交的数据处理请求时,处理所述数据管理模块中的数据集,创建所述数据集的数据工作流,并记录形成的数据版本信息。2.根据权利要求1所述的数据版本管理系统,其特征在于:所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。3.根据权利要求2所述的数据版本管理系统,其特征在于:所述系统核心模块接收到用户提交的数据处理请求为提交一个新数据集时,所述系统核心模块提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,创建所述数据集的数据工作流,并记录形成的数据版本信息。4.根据权利要求2所述的数据版本管理系统,其特征在于:所述系统核心模块接收到用户提交的数据处理请求为修改所述数据管理模块中存储的一个数据集时,所述系统核心模块依据所述数据处理请求将一执行代码复制至所述执行引擎模块中,并发送一执行命令给所述执行引擎模块令其运行所述执行代码以形成一新数据集,所述系统核心模块提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,创建所述数据集的数据工作流,并记录形成的数据版本信息。5.根据权利要求4所述的数据版本管理系统,其特征在于:所述系统核心模块依据所述数据处理请求复制至所述执行引擎模块的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。6.根据权利要求2、3或4所述的数据版本管理系统,其特征在于:所述第一存储单元配置于Hadoop分布式文件系统中;第二存储单元配置于NoSQL数据库中。7.根据权利要求1、2、3或4所述的数据版本管理系统,其特征在于:所述数据工作流为表示至少两个数据集之间的衍生关系,所述衍生关系包括一数据集的执行历史记录和版本。8.根据权利要求1、2、3或4所述的数据版本管理系统,其特征在于:还包括用户接口模块,配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。9.根据权利要求1、2、3或4所述的数据版本管理系统,其特征在于:所述数据版本信息包括数据集名称、数据ID、代码ID、形成时间、及运行日志中的至少一种。10.根据权利要求1、2、3或4所述的数据版本管理系统,其特征在于:所述执行后端引擎包括单机引擎及分布式引擎。11.一种数据版本管理方法,其特征在于,所述方法包括以下步骤: 预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎;以及; 接收到用户提交的数据处理请求时,调用一执行后端引擎运行所述至少一执行代码以对所述至少一数据集执行处理,创建所述数据集的数据工作流,并记录形成的数据版本信息。12.根据权利要求11所述的数据版本管理方法,其特征在于:所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。13.根据权利要求12所述的数据版本管理方法,其特征在于:所述的接收到用户提交的数据处理请求为提交一个新数据集时,提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,并记录形成的数据版本信息。14.根据权利要求12所述的数据版本管理方法,其特征在于:所述的接收到用户提交的数据处理请求为修改已存储的一个数据集时,依据所述数据处理请求将一执行代码复制至相应的执行后端引擎中,并发送一执行命令给所述执行后端引擎令其运行所述执行代码以形成一新数据集,提取所述新数据集的数据并存储于所述第一存储单元,提取所述新数据集的元数据并存储于所述第二存储单元,且形成一新数据ID关联所述新数据集的数据及元数据,以及形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的数据版本?目息O15.根据权利要求14所述的数据版本管理方法,其特征在于:所述的依据所述数据处理请求复制至所述执行后端引擎中的执行代码为用户提交的新执行代码或者调用的预存的执行代码。16.根据权利要求12、13或14所述的数据版本管理方法,其特征在于:所述第一存储单元配置于Hadoop分布式文件系统中;第二存储单元配置于NoSQL数据库中。17.根据权利要求10、11、12或13所述的数据版本管理方法,其特征在于:所述数据工作流为表示至少两个数据集之间的衍生关系,所述衍生关系包括一数据集的执行历史记录和版本。18.根据权利要求11、12、13或14所述的数据版本管理方法,其特征在于:还包括配置有多种用户UI的步骤,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。19.根据权利要求11、12、13或14所述的数据版本管理系统,其特征在于:所述数据版本信息包括数据集名称、数据ID、代码ID、形成时间、及运行日志中的至少一种。20.根据权利要求11、12、13或14所述的数据版本管理系统,其特征在于:所述执行后端引擎包括单机引擎及分布式引擎。21.一种代码版本管理系统,其特征在于,包括: 数据管理模块,存储有至少一个数据集; 代码管理模块,存储有至少一个执行代码,所述执行代码用于对所述数据管理模块存储的至少一个数据集进行操作;所述代码管理模块还用于接收用户推送的代码予以存储或依据用户推送的代码发送一代码处理请求; 执行引擎模块,配置有至少一种执行后端引擎,用于接收到执行命令时,依据一执行命令调用所述执行后端引擎,运行一执行代码以对所述数据管理模块中的一数据集执行操作; 系统核心模块,用于记录用户推送的代码并形成代码版本信息,以及接收到所述代码管理模块的代码处理请求时,发送一执行命令给所述执行引擎模块,令其运行所述代码管理模块中的执行代码,并在所述执行代码以对所述数据管理模块中的一数据集执行操作后记录形成的代码版本信息。22.根据权利要求21所述的代码版本管理系统,其特征在于:所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。23.根据权利要求21所述的代码版本管理系统,其特征在于:所述系统核心模块还用于依据用户提交的数据处理请求将一执行代码复制至所述执行引擎模块中,并发送一执行命令给所述执行引擎模块令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。24.根据权利要求21所述的代码版本管理系统,其特征在于:所述系统核心模块依据所述数据处理请求复制至所述执行引擎模块的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。25.根据权利要求21、22、23、或24所述的代码版本管理系统,其特征在于:还包括用户接口模块,配置有多种用户UI,用以分别接收不同用户提交的请求或向不同用户反馈请求?目息O26.根据权利要求21、22、23、或24所述的代码版本管理系统,其特征在于:所述代码版本信息包括代码名称、代码ID、形成时间、指定参数、及运行日志中的至少一种。27.根据权利要求21、22、23、或24所述的代码版本管理系统,其特征在于:所述执行后端引擎包括单机引擎及分布式引擎。28.一种代码版本管理方法,其特征在于,包括以下步骤: 预存至少一个数据集以及用于对所述至少一个数据集进行操作的至少一个执行代码,并配置至少一种用于运行所述执行代码的执行后端引擎;以及; 接收用户推送的代码予以存储,并记录形成的代码版本信息;或者依据用户推送的代码发送一代码处理请求,发送一执行命令给所述执行后端引擎令其运行预存的执行代码,并在所述执行代码以对预存的所述一数据集执行操作后记录形成的代码版本信息。29.根据权利要求28所述的代码版本管理方法,其特征在于:所述数据集的数据存储于一第一存储单元,所述数据集的元数据存储于一第二存储单元,且所述数据集的数据及元数据藉由一数据ID相关联。30.根据权利要求28所述的代码版本管理方法,其特征在于:还包括步骤,依据用户提交的数据处理请求将一执行代码复制至所述执行后端引擎中,并发送一执行命令令其运行所述执行代码以形成一新数据集,并形成一代码ID将所述执行代码与所述新数据集相关联,并记录形成的代码版本信息。31.根据权利要求28所述的代码版本管理方法,其特征在于:所述的依据所述数据处理请求复制至所述执行后端引擎中的执行代码为用户提交的新执行代码或者调用的所述代码管理模块中存储的执行代码。32.根据权利要求28、29、30、或31所述的代码版本管理方法,其特征在于:还包括配置有多种用户UI的步骤,用以分别接收不同用户提交的请求或向不同用户反馈请求信息。33.根据权利要求28、29、30、或31所述的代码版本管理方法,其特征在于:所述代码版本信息包括代码名称、代码ID、形成时间、指定参数、及运行日志中的至少一种。34.根据权利要求28、29、30、或31所述的代码版本管理方法,其特征在于:所述执行后端引擎包括单机引擎及分布式引擎。
【文档编号】G06F17/30GK105956087SQ201610282533
【公开日】2016年9月21日
【申请日】2016年4月29日
【发明人】徐葳, 徐方舟, 张炀
【申请人】清华大学