本申请涉及大数据技术领域,特别是涉及基于spark内核的任务执行方法、系统、计算机设备。
背景技术:
随着大数据云时代的到来,各行各业对数据的应用的需求越来越多,在数据应用中,对多元异构数据的同步和计算是数据应用的基础,如何在不同数据源间进行高效同步和快速开发etl成为行业面临的主要问题。
现有技术中一般通过编写mapreduce代码或spark代码进行etl开发。但是存在以下缺点:
1、不支持实时数据同步;
2、不支持集群部署,受限于单台服务器性能,速度慢,易发生内存溢出等;
3、不支持配置多任务;
4、任务失败无通知机制;
5、进行etl计算速度慢;
6、需要通过编写代码、打包项目部署,开发效率低,难度高。
目前针对相关技术中开发效率低的问题,尚未提出有效的解决方案。
技术实现要素:
本申请实施例提供了一种基于spark内核的任务执行方法、系统、计算机设备,通过设置配置文件降低了开发门槛,提高开发效率,降低维护成本,提升etl速度,提高系统的鲁棒性。
第一方面,本申请实施例提供了一种基于spark内核的任务执行方法,包括以下步骤:
任务流生成步骤,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配步骤,akka根据所述任务流分配任务;
任务执行步骤,一调度器根据所述分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至所述sparkdriver节点。
在其中一些实施例中,所述任务流生成步骤具体包括:
通过编写spark和akka代码,读取并解析所述配置文件生成dag图。
在其中一些实施例中,所述任务分配步骤具体包括:
遍历所述dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有所述父节点任务则等待所述父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过actor模型将该所述任务分发给executor进行执行。
在其中一些实施例中,所述任务执行步骤具体包括:
通过所述actor模型将所述执行结果发送至所述sparkdriver节点,所述sparkdriver节点接收并记录其状态;
当所述任务执行失败时,进行重试,当重试次数超过预设次数则判定所述任务失败并退出程序,输出报警信息;
当所述任务执行成功时,继续执行子节点任务,直至所述任务全部完成。
在其中一些实施例中,所述配置文件使用json格式定义数据源、同步数据格式和指定数据转换逻辑。
第二方面,本申请实施例提供了一种基于spark内核的任务执行系统,应用上述第一方面所述的基于spark内核的任务执行方法,包括:
任务流生成模块,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配模块,akka根据所述任务流分配任务;
任务执行模块,一调度器根据所述分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至所述sparkdriver节点。
在其中一些实施例中,所述任务流生成模块通过编写spark和akka代码,读取并解析所述配置文件生成dag图。
在其中一些实施例中,所述任务分配模块遍历所述dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有所述父节点任务则等待所述父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过actor模型将该所述任务分发给executor进行执行。
在其中一些实施例中,所述任务执行模块包括:
状态记录单元,通过所述actor模型将所述执行结果发送至所述sparkdriver节点,所述sparkdriver节点接收并记录其状态;
状态判断单元,当所述任务执行失败时,进行重试,当重试次数超过预设次数后则判定任务失败并退出程序,输出报警信息;当所述任务执行成功时,继续执行子节点任务,直至所述任务全部完成。
第三方面,本申请实施例提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面所述的基于spark内核的任务执行方法。
相比于相关技术,本申请实施例提供的基于spark内核的任务执行方法,通过将akka和spark的结合达到对etl的任务流并行执行以及对该任务流中每个任务并行执行,从而提高执行效率;以及通过配置文件的方式省去编写代码的成本,提高开发效率。
本申请的一个或多个实施例的细节在以下附图和描述中提出,以使本申请的其他特征、目的和优点更加简明易懂。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例的基于spark内核的任务执行方法的流程图;
图2是根据本申请实施例的任务执行方法的优选流程图;
图3是根据本申请优选实施例的任务执行步骤的流程图;
图4是根据本申请实施例的一种基于spark内核的任务执行系统的结构框图;
图5为根据本申请实施例的计算机设备的硬件结构示意图。
附图说明:
1、任务流生成模块;2、任务分配模块;3、任务执行模块;
31、状态记录单元;32、状态判断单元;81、处理器;
82、存储器;83、通信接口;80、总线。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。
在本申请中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本申请所描述的实施例在不冲突的情况下,可以与其它实施例相结合。
除非另作定义,本申请所涉及的技术术语或者科学术语应当为本申请所属技术领域内具有一般技能的人士所理解的通常意义。本申请所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本申请所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本申请所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。本申请所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。
apachespark是专为大规模数据处理而设计的快速通用的分布式查询和处理引擎。它提供mapreduce的灵活性和可扩展性,但速度明显更高:当数据存储在内存中时,它比apachehadoop快100倍,访问磁盘时高达10倍。apachespark允许用户读取、转换、聚合数据,还可以轻松地训练和部署复杂的统计模型。java、scala、python、r和sql都可以访问sparkapi。
akka是java虚拟机平台上构建高并发、分布式和容错应用的工具包和运行时。akka用scala语言编写,同时提供了scala和java的开发接口。akka处理并发的方法基于actor模型,actor之间通信的唯一机制就是消息传递。
akka的actor模型是akka中一款轻量级的消息通信模型。
dag数据结构跟踪基本块中值和变量的计算和赋值;块中使用的来自别处的值表示为叶子结点;值上的操作表示为内部结点;新值的赋值表示为将目标变量或临时变量的名字附加到表示赋值的结点上。
本实施例提供了一种基于spark内核的任务执行方法。图1是根据本申请实施例的基于spark内核的任务执行方法的流程图,如图1所示,该流程包括如下步骤:
任务流生成步骤s1,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配步骤s2,akka根据任务流分配任务;
任务执行步骤s3,一调度器根据分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至sparkdriver节点。
在实际的应用中,基于spark内核,采用akka的actor模型作为分布式通信方式,spark和akka都天然具有分布式架构,通过编写spark和akka代码,完成读取配置文件,解析生成dag图,分发任务,以及记录和判断任务状态等功能。同时还设置有input和output模块,上述input和output模块需支持mysql、hdfs、clickhouse、hbase、hive,postgresql等多种数据源的读取和写入功能。
通过上述步骤,该方法完全基于spark内核开发,spark是基于内存计算,akka和spark的结合达到对etl的任务流并行执行以及对该任务流中每个任务并行执行,可以大大提高计算效率和执行效率;同时使用配置文件进行数据源同步配置和管理任务依赖,通过编写sql进行计算,降低了开发门槛和难度;可以根据不同的需求进行不同的配置文件开发,不需要对代码进行修改和打包编译,部署简单,维护方便;不存在各组件之间进行数据传输降低了数据丢失的可能。
在其中一些实施例中,任务流生成步骤具体包括:
通过编写spark和akka代码,读取并解析配置文件生成dag图。
在本实施例中,可根据配置文件,先生成任务对应的dag图中的各叶子节点,以通过dag图的各叶子节点将该配置文件对应任务拆分为若干简单的子任务,来执行该任务请求对应的任务。另外,由于已经确定出该dag图的叶子节点,所以还可根据该配置文件进一步确定该dag图的节点总数,以便后续通过执行任务生成下游节点时,可以确定何时该任务执行完毕(如,当生成了该dag图的全部节点)。
具体的,可先根据配置文件,确定对应的任务需要输入的数据,再根据确定出的数据生成所述dag图中的各叶子节点。或者,当该配置文件中已经携带了执行任务所需的数据时,服务器也可直接根据携带的数据,生成dag图中的各叶子节点。当然,上述两种生成叶子节点的方法可以单独或者组合使用,本说明书不做限定。
在其中一些实施例中,任务分配步骤具体包括:
遍历dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有父节点任务则等待父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过actor模型将该任务分发给executor进行执行。
以上述机制逐批发送要执行的具体任务,而每个任务的执行都是通过spark核心引擎并行执行,根据该方案,每个任务是并行执行,且任务之间也可并行执行,大大提高了执行效率。
在其中一些实施例中,任务执行步骤具体包括:
通过actor模型将执行结果发送至sparkdriver节点,sparkdriver节点接收并记录其状态;
当所述任务执行失败时,进行重试,当所述重试次数超过预设次数则判定所述任务失败并退出程序,输出报警信息;
当任务执行成功时,继续执行子节点任务,直至任务全部完成。
在本实施例中,spark任务可基于yarn集群动态分配资源,易扩展,同步速度快;当任务失败时,可根据配置文件进行企业微信、钉钉和邮件报警,以供检测人员进行调整。
在其中一些实施例中,配置文件使用json格式定义数据源、同步数据格式和指定数据转换逻辑。
下面通过优选实施例对本申请实施例进行描述和说明。
图2是根据本申请实施例的任务执行方法的优选流程图,如图2所示,该任务执行方法包括如下步骤:
s201,配置文件
文件脚本配置格式使用json格式,用户可通过编写json格式的文件脚本定义etl过程,包括定义数据源,同步数据格式,指定数据转换逻辑。
s202,读取配置文件并生成dag图;
任务启动,通过编写spark和akka代码,该服务中的driver读取和解析配置文件内容,根据解析配置文件内容生成对应的dag图(有向无环图),
s203,分发任务
遍历dag图中的每一个任务,判断其状态,如果没有执行,并判断是否有父节点任务,若有父节点任务则等待父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过akka的actor模型机制分配要执行的任务,spark的调度器收到actor模型的消息后,将该任务分发给相应的executor执行,
s204,记录和判断任务状态
executor执行任务并将执行后的任务状态通过akka发送给sparkdriver,sparkdriver接收到后,记录其状态;如果失败进行重试,超过重试次数则认为任务失败退出程序,并发送报警邮件等;如果成功则继续判断执行子节点任务,直至任务全部完成。
通过上述步骤,通过脚本配置(无需编写代码),利用spark核心引擎进行高效的etl,现有的mapreduce开发或是spark开发也可以实现etl的过程,,但是没有采用本方法便捷高效。
图3是根据本申请优选实施例的任务执行步骤的流程图,如图3所示,任务1、2、3为并行执行的任务,任务4作为任务1、2的子任务,任务5作为任务3的子任务,任务6作为任务4的子任务,该任务执行步骤包括如下步骤:
driver并行执行任务1、2、3,待任务1、2均完成后,执行任务4,待任务4完成后,执行任务6;待任务3完成后,执行任务5,待任务5和任务6均完成后,driver任务完成。
需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本实施例还提供了一种基于spark内核的任务执行系统,该系统用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”、“单元”、“子单元”等可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图4是根据本申请实施例的一种基于spark内核的任务执行系统的结构框图,如图4所示,该系统包括:
任务流生成模块1,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配模块2,akka根据任务流分配任务;
任务执行模块3,一调度器根据分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至sparkdriver节点。
在实际的应用中,配置文件使用json格式定义数据源、同步数据格式和指定数据转换逻辑。
在其中一些实施例中,任务流生成模块1通过编写spark和akka代码,读取并解析配置文件生成dag图。
在其中一些实施例中,任务分配模块2遍历dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有父节点任务则等待父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过akka的actor模型将该任务分发给executor进行执行。
在其中一些实施例中,任务执行模块3包括:
状态记录单元31,通过actor模型将执行结果发送至driver节点,driver节点接收并记录其状态;
状态判断单元32,当任务执行失败时,进行重试,当重试次数超过预设次数后则认为任务失败并退出程序,输出报警信息;当任务执行成功时,继续执行子节点任务,直至任务全部完成。
需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
另外,结合图1描述的本申请实施例基于spark内核的任务执行方法可以由计算机设备来实现。图5为根据本申请实施例的计算机设备的硬件结构示意图。
计算机设备可以包括处理器81以及存储有计算机程序指令的存储器82。
具体地,上述处理器81可以包括中央处理器(cpu),或者特定集成电路(applicationspecificintegratedcircuit,简称为asic),或者可以被配置成实施本申请实施例的一个或多个集成电路。
其中,存储器82可以包括用于数据或指令的大容量存储器。举例来说而非限制,存储器82可包括硬盘驱动器(harddiskdrive,简称为hdd)、软盘驱动器、固态驱动器(solidstatedrive,简称为ssd)、闪存、光盘、磁光盘、磁带或通用串行总线(universalserialbus,简称为usb)驱动器或者两个或更多个以上这些的组合。在合适的情况下,存储器82可包括可移除或不可移除(或固定)的介质。在合适的情况下,存储器82可在数据处理装置的内部或外部。在特定实施例中,存储器82是非易失性(non-volatile)存储器。在特定实施例中,存储器82包括只读存储器(read-onlymemory,简称为rom)和随机存取存储器(randomaccessmemory,简称为ram)。在合适的情况下,该rom可以是掩模编程的rom、可编程rom(programmableread-onlymemory,简称为prom)、可擦除prom(erasableprogrammableread-onlymemory,简称为eprom)、电可擦除prom(electricallyerasableprogrammableread-onlymemory,简称为eeprom)、电可改写rom(electricallyalterableread-onlymemory,简称为earom)或闪存(flash)或者两个或更多个以上这些的组合。在合适的情况下,该ram可以是静态随机存取存储器(staticrandom-accessmemory,简称为sram)或动态随机存取存储器(dynamicrandomaccessmemory,简称为dram),其中,dram可以是快速页模式动态随机存取存储器(fastpagemodedynamicrandomaccessmemory,简称为fpmdram)、扩展数据输出动态随机存取存储器(extendeddateoutdynamicrandomaccessmemory,简称为edodram)、同步动态随机存取内存(synchronousdynamicrandom-accessmemory,简称sdram)等。
存储器82可以用来存储或者缓存需要处理和/或通信使用的各种数据文件,以及处理器81所执行的可能的计算机程序指令。
处理器81通过读取并执行存储器82中存储的计算机程序指令,以实现上述实施例中的任意一种任务执行方法。
在其中一些实施例中,计算机设备还可包括通信接口83和总线80。其中,如图5所示,处理器81、存储器82、通信接口83通过总线80连接并完成相互间的通信。
通信接口83用于实现本申请实施例中各模块、装置、单元和/或设备之间的通信。通信端口83还可以实现与其他部件例如:外接设备、图像/数据采集设备、数据库、外部存储以及图像/数据处理工作站等之间进行数据通信。
总线80包括硬件、软件或两者,将计算机设备的部件彼此耦接在一起。总线80包括但不限于以下至少之一:数据总线(databus)、地址总线(addressbus)、控制总线(controlbus)、扩展总线(expansionbus)、局部总线(localbus)。举例来说而非限制,总线80可包括图形加速接口(acceleratedgraphicsport,简称为agp)或其他图形总线、增强工业标准架构(extendedindustrystandardarchitecture,简称为eisa)总线、前端总线(frontsidebus,简称为fsb)、超传输(hypertransport,简称为ht)互连、工业标准架构(industrystandardarchitecture,简称为isa)总线、无线带宽(infiniband)互连、低引脚数(lowpincount,简称为lpc)总线、存储器总线、微信道架构(microchannelarchitecture,简称为mca)总线、外围组件互连(peripheralcomponentinterconnect,简称为pci)总线、pci-express(pci-x)总线、串行高级技术附件(serialadvancedtechnologyattachment,简称为sata)总线、视频电子标准协会局部(videoelectronicsstandardsassociationlocalbus,简称为vlb)总线或其他合适的总线或者两个或更多个以上这些的组合。在合适的情况下,总线80可包括一个或多个总线。尽管本申请实施例描述和示出了特定的总线,但本申请考虑任何合适的总线或互连。
该计算机设备可以基于获取到的任务分配信息,实现结合图1描述的任务执行方法。
另外,结合上述实施例中的任务执行方法,本申请实施例可提供一种计算机可读存储介质来实现。该计算机可读存储介质上存储有计算机程序指令;该计算机程序指令被处理器执行时实现上述实施例中的任意一种任务执行方法。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
1.一种基于spark内核的任务执行方法,其特征在于,包括以下步骤:
任务流生成步骤,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配步骤,akka根据所述任务流分配任务;
任务执行步骤,一调度器根据所述分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至所述sparkdriver节点。
2.根据权利要求1所述的基于spark内核的任务执行方法,其特征在于,所述任务流生成步骤具体包括:
通过编写spark和akka代码,读取并解析所述配置文件生成dag图。
3.根据权利要求2所述的基于spark内核的任务执行方法,其特征在于,所述任务分配步骤具体包括:
遍历所述dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有所述父节点任务则等待所述父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过actor模型将该所述任务分发给executor进行执行。
4.根据权利要求3所述的基于spark内核的任务执行方法,其特征在于,所述任务执行步骤具体包括:
通过所述actor模型将所述执行结果发送至所述sparkdriver节点,所述sparkdriver节点接收并记录其状态;
当所述任务执行失败时,进行重试,当重试次数超过预设次数则判定所述任务失败并退出程序,输出报警信息;
当所述任务执行成功时,继续执行子节点任务,直至所述任务全部完成。
5.根据权利要求1所述的基于spark内核的任务执行方法,其特征在于,所述配置文件使用json格式定义数据源、同步数据格式和指定数据转换逻辑。
6.一种基于spark内核的任务执行系统,应用上述权利要求1-5任意一项所述的基于spark内核的任务执行方法,其特征在于,包括:
任务流生成模块,sparkdriver节点读取并根据一配置文件生成任务流;
任务分配模块,akka根据所述任务流分配任务;
任务执行模块,一调度器根据所述分配任务的信息将任务分发至对应的执行节点,并将执行结果发送至所述sparkdriver节点。
7.根据权利要求6所述的基于spark内核的任务执行系统,其特征在于,所述任务流生成模块通过编写spark和akka代码,读取并解析所述配置文件生成dag图。
8.根据权利要求6所述的基于spark内核的任务执行系统,其特征在于,所述任务分配模块遍历所述dag图的每一个任务并判断其状态,如果没有执行,则判断是否存在父节点任务,若有所述父节点任务则等待所述父节点任务执行成功,若无父节点任务或父节点任务全部已执行成功,则通过actor模型将该所述任务分发给executor进行执行。
9.根据权利要求7所述的基于spark内核的任务执行系统,其特征在于,所述任务执行模块包括:
状态记录单元,通过所述actor模型将所述执行结果发送至所述sparkdriver节点,所述sparkdriver节点接收并记录其状态;
状态判断单元,当所述任务执行失败时,进行重试,当重试次数超过预设次数后则判定任务失败并退出程序,输出报警信息;当所述任务执行成功时,继续执行子节点任务,直至所述任务全部完成。
10.一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至5中任一项所述的基于spark内核的任务执行方法。
技术总结