一种ETL流程在Spark集群中运行的方法和装置
【技术领域】
本发明涉及数据库技术领域,特别是涉及一种ETL流程在Spark集群中运行的方法和装置。
【背景技术】
ETL(英文全称为:Extract-Transform-Load)软件从源数据源处抽取数据到ETL服务器,在ETL服务器内部对数据做转换,最后将转换后的数据加载到目的数据源。按照迁移过程ETL将ETL功能组件分为数据读取类组件、数据转换类组件和数据装载类组件,数据读取组件负责从数据源处抽取数据到ETL内部缓存,数据转换组件负责对抽取到ETL的数据做转换操作,数据装载类组件负责将转换后的数据装载到目的数据源。
ETL软件将ETL功能组件组合来完成特定的数据迁移任务,ETL功能组件组合在一起称为流程,ETL服务器执行流程达到数据迁移的任务。一个流程里能包含一个或多个读取组件,每个读取组件后可以接一个或多个转换组件或装载组件,每个转换组件又可以接一个或多个转换或装载组件。ETL功能组件实现基本的单一功能,流程组合不同的ETL功能组件,实现丰富和功能强大的数据迁移任务。一个典型和完整的流程组合示意图1如下所示:
传统的ETL(如DMETL)在执行流程时,每一个ETL功能组件会生成一个或多个线程,上游ETL功能组件通过数据缓存队列向下游ETL功能组件发送数据,ETL功能组件的每一个输出连接都有一个缓存队列。上游组件的工作线程将数据加入缓存队列,下游组件的工作线程从缓存队列里获取数据。读取组件从数据源抽取数据后放入缓存队列,转换组件从上游组件的输出缓存队列里获取数据做转换操作后放入自己的输出缓存队列,装载组件从上游组件的输出缓存队列里取出数据后装载到目的数据源。
用户通过ETL流程设计器设计迁移流程,配置每个ETL功能组件的特定属性,保存到后台元数据库。流程被执行时,ETL服务器从元数据库获取流程的配置信息,为每个ETL功能组件生成工作线程,工作线程执行具体的数据读取、转换和装载工作。
以上是传统ETL的基本执行过程。
Spark集群是目前流行的数据处理和分析平台,基于弹性分布式数据集(Resilient Distributed Dataset,简写为:RDD)的变换完成预定的数据处理和分析任务,现在的目标是将ETL流程在Spark集群上运行。
Spark平台提供了一组API接口,用户通过API接口编写Spark应用程序(SparkApplication)实现定制的数据处理任务,Spark应用程序是一个由main()方法作为执行入口的程序,被Spark提交工具提交到Spark集群上执行。Spark是通过执行弹性分布式数据集(RDD)的一系列变换完成数据处理和分析任务的,Spark有两种类型的RDD变换操作:Transformation和Action,二者的区别在于代码执行到Transformation操作并不做实际的数据处理工作,只是RDD变换的记录路径,执行到Action操作时才真正开始做数据处理工作,从最初的RDD生成,沿着RDD的变换路径一直到Action操作,执行完毕后出输出处理结果。
ETL流程本质上是存储于元数据库里的一组ETL功能组件的组合,如何将ETL功能组件及其组合信息转变成Spark应用程序是将传统ETL流程在Spark集群上执行的关键。元数据库里存储的流程信息主要包括ETL功能组件的类型、ETL功能组件之间的有向连接信息,增加一个虚拟的开始节点,虚拟开始节点指向每个读取ETL功能组件节点,形成一张有向非循环图,图中的每个节点拥有配置属性。
ETL流程在Spark集群上执行,最朴素直观的做法是从虚拟开始节点开始,将这张图转变成Spark应用源码程序文件,结合Spark提供的API接口,每个读取ETL功能组件视为一个初始生成RDD的Transformation操作集合,每个转换ETL功能组件视为在前连接组件RDD上的Transformation操作集合,每个装载ETL功能组件视为RDD上的一个Action操作,按ETL功能组件的连接顺序生成一个源码程序文件,然后将源码文件编译、打包后提交给Spark集群执行。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是,背景技术中介绍的朴素直观的做法中,一是执行效率问题,流程每次被执行都会先生成一个Spark应用程序源码文件,再编译、打包、提交,会增加这样一个过程;二是难度大,功能组件种类繁多,可以组合出的有向非循环图也多,将任意这类图转变成Spark应用程序的源码文件难度比较大,对设计复杂的图几乎不可能实现源码文件转换。
本发明采用如下技术方案:
第一方面,本发明提供了一种ETL流程在Spark集群中运行的方法,使用一个有向非循环图结构表示ETL流程在Spark集群上运行过程中的所有RDD之间的依赖关系,基于有向非循环图实现一Spark应用程序,将Spark应用程序提交到Spark集群,从而实现在Spark集群上运行ETL流程目的,实现时用户已经通过ETL流程设计器设计迁移流程,配置每个ETL功能组件的特定属性,并保存到后台元数据库,方法包括:
从所述元数据库里获取被执行流程的元数据信息,包括ETL功能组件、组件属性信息、连接和连接属性信息;
在Spark应用程序里建立一个有向图结构SparkGraph对象,所述SparkGraph对象由多个SparkNode对象构成,并且,所述SparkNode对象之间由SparkEdge对象关联,具体的:
对应元数据库里每个ETL功能组件创建一个SparkNode对象,SparkNode对象的类型由ETL功能组件属性信息中的组件类型信息确定;所述类型信息包括读取类型、转换类型和装载类型,其中,读取类型和转换类型组件的功能对应Spark集群API接口的一个Transformation操作集合,装载类型组件的功能对应Spark集群API接口的一个Action操作;
对各SparkNode对象之间的连接创建一SparkEdge对象,SparkEdge对象表示图的一个有向边,其中源节点和目的节点从元数据库的连接属性信息里获得,并在SparkGraph对象建立连接;
在SparkGraph对象中创建一个虚拟开始节点,虚拟开始节点指向每一个读取类型的SparkNode对象;创建一个虚拟结束节点,对于位于末端的SparkNode对象,设置其指向虚拟结束节点;
根据所述有向图结构SparkGraph对象运行时,具体包括:
虚拟开始节点作为有向图结构SparkGraph对象运行的入口,调用由SparkEdge对象关联起来的一条或者多条流程分支中的SparkNode对象,并且,在抵达流程分支的装载类型的SparkNode对象之前,仅加载各SparkNode对象中记录的生成规则,并在抵达流程分支的装载类型的SparkNode对象时,根据加载后的生成规则,集中完成源数据的提取、转换和装载动作。
优选的,所述集中完成源数据的提取、转换和装载动作,具体包括:
生成各SparkNode对象的实例,并将源数据作为虚拟开始节点后第一个SparkNode对象实例的输入参数;
在流程中SparkNode1对象实例的输出数据,根据SparkEdge1对象所记载的所述SparkNode1对象与SparkNode2对象的关联关系,将所述输出数据作为SparkNode2对象实例的输入数据;
根据所述SparkNode1对象和SparkEdge1对象的数据传输方式,完成有向图结构SparkGraph对象中其它SparkNodei对象中的数据处理过程;其中i为>=2的自然数。
优选的,所述在Spark应用程序里建立一个有向图结构SparkGraph对象,还包括:
对于SparkNodei对象,确认其输出端连接着的SparkEdge对象的数量N;
并根据所述SparkNodei对象的数量N,为所述SparkNodei对象设置N-1次内挂特性的persist()操作计数;
其中,所述内挂特性的persist()操作计数用于在所述SparkNodei对象所对应的任意一条由SparkEdge对象和SparkNode对象构成的流程处理抵达结束节点,触发缓存释放时,相应的内挂特性的persist()操作计数减一;
所述SparkNodei对象直到其内挂特性的persist()操作计数的N-1次计数用完,才进行SparkNodei对象的缓存释放。
优选的,对于每一个SparkEdge对象中的persist()操作还包括外挂特性的persist()操作计数,具体的:
在任意一条流程抵达该支路上的装载类型的SparkNode对象时,在根据加载后的生成规则,集中完成源数据的提取、转换和装载动作同时,还会将自身流程所涉及的SparkNode对象标识进行公告;
其它流程在抵达相应支路上的装载类型的SparkNode对象时,会在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象,若公告栏中存在与自身流程所待建立的SparkNode对象一致的,则在被发布到公告栏的相应SparkNode对象的外挂特性的persist()操作计数上加一,并在自身流程具体执行时复用被发布到公告栏的相应支路上的SparkNode对象;
其中,若SparkNode对象中的persist()操作包含内挂特性的计数和/或外挂特性的计数,则只有当所述内挂特性的计数和/或外挂特性的计数均清零后,释放相应SparkNode对象。
优选的,所述公告栏在公告相应的SparkNode对象同时,还会将相应流程支路的所处理源数据所属类别作为SparkNode对象的关联特性进行公告;则所述会在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象之前,进行源数据所属类别的匹配,若匹配结果相同,才进行相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象的操作;若匹配结果不同,则跳过所述在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象的操作。
优选的,若一个SparkNode对象有多个输出,在SparkNode对象中的增加persist()操作,还用于在第一次Action()引发的具体操作走到该节点执行完毕后将计算得到的RDD缓存,以便下一分支直接从该RDD开始执行;其中,所述第一次Action()位于装载类型的SparkNode对象中。
优选的,所述触发缓存释放时,相应的内挂特性的persist()操作计数减一,具体包括:
一个分支的装载类型的SparkNode对象中Action()操作执行完毕后,装载类型的SparkNode对象调用doUnpersistStrategy()方法释放该分支执行过程中缓存的RDD,则相应的内挂特性的persist()操作计数减一。
第二方面,本发明还提供了一种ETL流程在Spark集群中运行的装置,用于实现第一方面所述的ETL流程在Spark集群中运行的方法,所述装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行第一方面所述的ETL流程在Spark集群中运行的方法。
第三方面,本发明还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,用于完成第一方面所述的ETL流程在Spark集群中运行的方法。
本发明供了一种将传统ETL流程在Spark集群上执行的实现方案。在Spark应用程序里引入图结构蕴含RDD之间变换的血缘关系,方便的实现了ETL流程在Spark集群上的执行,并且,利用Spark集群的并行执行特性,提高了对大数据迁移转换的ETL流程执行速度。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的现有技术中的一种ETL流程架构示意图;
图2是本发明实施例提供的一种ETL流程在Spark集群中运行的方法流程示意图;
图3是本发明实施例提供的一种ETL流程在Spark集群中运行时的SparkGraph对象生成方法流程示意图;
图4是本发明实施例提供的一种ETL流程在Spark集群中运行时数据处理过程示意图;
图5是本发明实施例提供的一种ETL流程在Spark集群中增加pesist操作流程示意图;
图6是本发明实施例提供的一种ETL流程在Spark集群中运行的架构示意图;
图7是本发明实施例提供的一种ETL流程在Spark集群中运行的装置结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
本发明的基本思路是在Spark应用程序里维护一个有向非循环图的结构,图里的节点对于ETL流程中的功能组件,节点之间的有向连线对应ETL流程中的数据流向,在Spark里表示RDD数据集的变换顺序,实质是用图结构隐含了RDD变换之间的血缘关系。
数据读取组件和转换组件对应Spark里的一个Transformation操作,数据装载组件对应Spark里的一个Action操作。Spark应用程序运行到装载组件的action()方法时才开始正式从外界加载数据到内存生成初始RDD,然后是转换组件,最后执行真实的装载操作。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
本发明实施例1提供了一种ETL流程在Spark集群中运行的方法,使用一个有向非循环图结构表示ETL流程在Spark集群上运行过程中的所有RDD之间的依赖关系,基于有向非循环图实现一Spark应用程序,将Spark应用程序提交到Spark集群,从而实现在Spark集群上运行ETL流程目的,实现时用户已经通过ETL流程设计器设计迁移流程,配置每个ETL功能组件的特定属性,并保存到后台元数据库,如图2所示,方法包括:
在步骤201中,从所述元数据库里获取被执行流程的元数据信息,包括ETL功能组件、组件属性信息、连接和连接属性信息。
在步骤202中,在Spark应用程序里建立一个有向图结构SparkGraph对象,所述SparkGraph对象由多个SparkNode对象构成,并且,所述SparkNode对象之间由SparkEdge对象关联,其中,SparkGraph对象定义run()方法,表示正式启动ETL流程的执行;SparkNode对象定义run()方法、persist()方法和unpersist()方法,run()方法表示执行RDD操作、按需执行persist()、并随之调用后续直接连接组件的run()方法,如果SparkNode后续直接连接点数大于1,则调用SparkNode.persist(),缓存将来Action操作触发执行会生成的RDD,用于其它图分支的执行,unpersist()方法释放缓存的RDD。如图3所示,具体的:
在步骤2021中,对应元数据库里每个ETL功能组件创建一个SparkNode对象,SparkNode对象的类型由ETL功能组件属性信息中的组件类型信息确定;所述类型信息包括读取类型、转换类型和装载类型,其中,读取类型和转换类型组件的功能对应Spark集群API接口的一个Transformation操作集合,装载类型组件的功能对应Spark集群API接口的一个Action操作。
在步骤2022中,对各SparkNode对象之间的连接创建一SparkEdge对象,SparkEdge对象表示图的一个有向边,其中源节点和目的节点从元数据库的连接属性信息里获得,并在SparkGraph对象建立连接。
其中,SparkEdge对象连接两个SparkNode节点,表示RDD的生成依赖关系,目的SparkNode的RDD生成依赖源SparkNode(读取类组件除外),生成规则蕴含在SparkNode功能组件自身和对其配置的元数据。SparkGraph对象蕴含了ETL流程在Spark集群上运行过程中所有RDDs生成依赖信息
在步骤2023中,在SparkGraph对象中创建一个虚拟开始Begin节点,虚拟开始节点指向每一个读取类型的SparkNode对象;创建一个虚拟结束End节点,对于位于末端的SparkNode对象,设置其指向虚拟结束节点。
其中,虚拟开始组件后接读取类型的组件,读取类型的组件后可接转换类型的组件或装载类型的组件,装载类型的组件可接转换类型的组件和其它装载类组件,每个组件后可接多个其它组件。
根据所述有向图结构SparkGraph对象运行时,具体包括:
在步骤203中,虚拟开始节点作为有向图结构SparkGraph对象运行的入口,调用由SparkEdge对象关联起来的一条或者多条流程分支中的SparkNode对象,并且,在抵达流程分支的装载类型的SparkNode对象之前,仅加载各SparkNode对象中记录的生成规则,并在抵达流程分支的装载类型的SparkNode对象时,根据加载后的生成规则,集中完成源数据的提取、转换和装载动作。
本发明实施例供了一种将传统ETL流程在Spark集群上执行的实现方案。在Spark应用程序里引入图结构蕴含RDD之间变换的血缘关系,方便的实现了ETL流程在Spark集群上的执行,并且,利用Spark集群的并行执行特性,提高了对大数据迁移转换的ETL流程执行速度。
在本发明实施例的一种具体实现方式中Spark应用程序利用元数据信息生成SparkGraph对象后,调用SparkGraph.run()方法正式启动在Spark集群上运行ETL流程,SparkGraph.run()获取虚拟开始节点的所有直接连接节点,对节点依次调用SparkNode.run()方法;SparkNode.run()方法首先执行对应的Transformation或Action操作,然后获取后续直接连接的所有节点,若直接连接的节点数量大于1,则执行persist()操作,缓存将要生产的RDD,再依次调用直接连接节点的SparkNode.run()方法,SparkNode.run()在图上的后接节点调用形成一个对图的深度遍历过程,直到调用到虚拟结束节点EndNode,EndNode.run()方法沿着分支反向调用上游组件的unpersist()方法,释放图执行分支上缓存的RDD或做释放标记。
在本发明实施例具体实现方式中,对于所述集中完成源数据的提取、转换和装载动作,如图4所示,具体包括:
在步骤2031中,生成各SparkNode对象的实例,并将源数据作为虚拟开始节点后第一个SparkNode对象实例的输入参数。
在步骤2032中,在流程中SparkNode1对象实例的输出数据,根据SparkEdge1对象所记载的所述SparkNode1对象与SparkNode2对象的关联关系,将所述输出数据作为SparkNode2对象实例的输入数据。
在步骤2033中,根据所述SparkNode1对象和SparkEdge1对象的数据传输方式,完成有向图结构SparkGraph对象中其它SparkNodei对象中的数据处理过程;其中i为>=2的自然数。
结合本发明实施例,对于所述在Spark应用程序里建立一个有向图结构SparkGraph对象,还存在一种优选的实现方案,如图5所示,包括:
在步骤301中,对于SparkNodei对象,确认其输出端连接着的SparkEdge对象的数量N。
在步骤302中,根据所述SparkNodei对象的数量N,为所述SparkNodei对象设置N-1次内挂特性的persist()操作计数。
其中,所述内挂特性的persist()操作计数用于在所述SparkNodei对象所对应的任意一条由SparkEdge对象和SparkNode对象构成的流程处理抵达结束节点,触发缓存释放时,相应的内挂特性的persist()操作计数减一。
在步骤303中,所述SparkNodei对象直到其内挂特性的persist()操作计数的N-1次计数用完,才进行SparkNodei对象的缓存释放。
所述触发缓存释放时,相应的内挂特性的persist()操作计数减一,具体包括:
一个分支的装载类型的SparkNode对象中Action()操作执行完毕后,装载类型的SparkNode对象调用doUnpersistStrategy()方法释放该分支执行过程中缓存的RDD,则相应的内挂特性的persist()操作计数减一。
其中,对于每一个SparkEdge对象中的persist()操作还包括外挂特性的persist()操作计数,具体的:
在任意一条流程抵达该支路上的装载类型的SparkNode对象时,在根据加载后的生成规则,集中完成源数据的提取、转换和装载动作同时,还会将自身流程所涉及的SparkNode对象标识进行公告。
其它流程在抵达相应支路上的装载类型的SparkNode对象时,会在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象,若公告栏中存在与自身流程所待建立的SparkNode对象一致的,则在被发布到公告栏的相应SparkNode对象的外挂特性的persist()操作计数上加一,并在自身流程具体执行时复用被发布到公告栏的相应支路上的SparkNode对象;
其中,若SparkNode对象中的persist()操作包含内挂特性的计数和/或外挂特性的计数,则只有当所述内挂特性的计数和/或外挂特性的计数均清零后,释放相应SparkNode对象。
在本发明实施例中,所述公告栏在公告相应的SparkNode对象同时,还会将相应流程支路的所处理源数据所属类别作为SparkNode对象的关联特性进行公告;则所述会在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象之前,进行源数据所属类别的匹配,若匹配结果相同,才进行相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象的操作;若匹配结果不同,则跳过所述在相应公告栏中查找是否存在已经被其他流程支路生成的SparkNode对象的操作。
结合本发明实施例,还存在一种扩展方案实现方式,若一个SparkNode对象有多个输出,在SparkNode对象中的增加persist()操作,还用于在第一次Action()引发的具体操作走到该节点执行完毕后将计算得到的RDD缓存,以便下一分支直接从该RDD开始执行;其中,所述第一次Action()位于装载类型的SparkNode对象中。
在本发明实施例中,利用有向非循环图的深度遍历或广度遍历实现自动编程问题,Spark应用程序主要使用Spark提供的API接口,组合不同的API接口,用户为API接口设置不同的控制参数,进而完成具体的Spark集群任务,本方案将这种做法局限在ETL流程,其实可以扩展开来,表达类似于“根据自定义规则自动编写Spark应用程序”的任务,进一步将“Spark API”进一步抽象化,针对其它的API,也可以实现类型的功能。
实施例2:
用如图6所示架构图,说明通过本发明实施例1所实现的ETL流程在Spark集群中的执行过程,包括以下步骤:
在步骤401中,所有的对应ETL的读取组件和转换组件,被转化为对应Spark架构中的Transformatio()操作,ETL中的装载组件对应的Spark架构中Action()操作。
在步骤402中,从虚拟开始节点Begin()开始,首先调用图6中的“读取组件1”(即实施例1中的SparkNode对象)的run()方法,run()方法会调用该组件特定的generateRDD()方法,得到初始RDD1的生成规则,因“读取组件1”有两个输出,所述两个输出分别对应连接转换组件1和转换组件2,所以需要为所述“读取组件1”增加一次persist()操作,表示该组件生成RDD1后需要缓存到内存,但此时因为没有抵达相应流程支路的Action()操作,因此还没有实际生成RDD1,接着执行到“转换组件1”组件,该组件用于对应的RDDTransformation操作规则生成RDD2,再接着到“装载组件1”,装载组件调用action()方法,此时才触发Spark框架正式开始执行数据处理(之前只记录相应的“读取组件1”和“转换组件1”的规则),因为“装载组件1”调用RDD2的装载Action方法Load(),RDD2依赖于RDD1(图结构中通过SparkEdge对象记录了这种连接的血缘关系),Spark框架首先生成RDD1,然后调用内部特性的persist()将RDD1缓存在内存,接着RDD2实际生成,因为RDD2仅仅是转换作用,而且其只有一个输出,因此,但不会缓存该RDD2数据集,最后RDD2.Load()方法将数据装载到目的,装载完毕后,执行到End虚拟节点,End虚拟节点启动释放缓存的RDD,“装载组件1”调用doUnpersistStrategy()方法释放上游节点中的缓存RDD,这是个递归调用过程,“装载组件1”会首先释放“转换组件1”的缓存,但“转换组件1”实际操作过程中由于自身是转换类型,因此没有缓存,不需要执行释放,则直接跳转到“转换组件1”调用自己的上游组件“读取组件1”释放缓存的RDD1,此时因为内部特性的persist()计数为1,不会真正释放RDD1,而是会做相应内部特性的persist()计数的自减,因为RDD1的另一个分支还没执行,该分支执行完毕;接着会执行“读取组件1”的第二个输出分支,得到生成RDD3的转换规则,然后执行到“装载组件2”触发Spark框架开始执行,装载完毕后到虚拟End节点,启动该分支计算过程中的RDD缓存释放,反向调用组件,直到“读取组件1”生成的RDD1缓存,此时会释放RDD1。
在步骤403中,其它分支参照步骤402完成,直到整个流程执行完毕。
实施例3:
如图7所示,是本发明实施例的ETL流程在Spark集群中运行的装置的架构示意图。本实施例的ETL流程在Spark集群中运行的装置包括一个或多个处理器21以及存储器22。其中,图7中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图7中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的ETL流程在Spark集群中运行的方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行ETL流程在Spark集群中运行的方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的ETL流程在Spark集群中运行的方法,例如,执行以上描述的图1-图5所示的各个步骤。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。