一种Python-Web环境中多用户共享使用Spark集群的实现方法和系统与流程

文档序号:19188283发布日期:2019-11-20 01:45阅读:417来源:国知局
一种Python-Web环境中多用户共享使用Spark集群的实现方法和系统与流程

本发明属于软件设计与应用技术领域,涉及一种应用技术实现方式,尤其涉及一种python开发环境中多用户通过web交互式使用spark集群的应用技术实现方法和系统。



背景技术:

apachespark作为当前最为流行的开源大数据计算框架,广泛应用于数据处理和分析应用。其使用方式一般有两种:一是通过spark-submit脚本提交打包成jar包的用户逻辑代码;二是用户可以通过spark-shell与spark交互式地进行数据处理。这两种方式虽然足够灵活,但在某些实际应用中并不适用,比如当web用户希望通过web请求与spark集群交互时。这种情况将面临多web用户共享使用同一个spark集群的问题。

spark的“应用间调度”特性可以支撑多用户共享使用同一个spark集群。“静态资源分配”是最简单的一种资源(内存、cpu核)分配方式,每个spark应用可以使用的资源受静态配置决定。“动态资源分配”则可以在应用间动态进行资源调度,即当一个spark应用需要更多计算资源时,它可以请求并利用未被占用的资源;另一方面,一个spark应用应释放所占用的但并未使用的多余资源。

apachelivy通过rest接口实现与spark集群的交互。一定程度上可以解决上述问题。用户可以使用rest接口或rpc客户端库提交经序列化的spark代码段、同步或异步检索结果并管理spark上下文(sparkcontext)。其实现了spark上下文可以被多个用户,多个spark任务共享使用。因其对提交的代码进行序列化处理,对于复杂的spark任务分析代码,livy在调试方面面临困难。且livy项目目前还处于孵化期,许多功能有待增加和完善。



技术实现要素:

本发明提出了一种技术架构,旨在说明如何利用spark原生的“应用间调度”特性以及python对于异步、协程、多进程等的实现来解决python开发环境中多web用户共享使用spark集群的问题。

多web用户共享使用spark集群意味着多用户可同时通过web交互的方式向spark集群提交任务计算请求。每个用户的每次任务计算请求将触发生成一个spark应用即一个spark上下文的实例。

因此,本发明涉及的技术架构包含下述具体问题的解决:

(1)需要引入多进程来支撑多个spark上下文,以便同时支持多用户的任务计算请求,方便独立管理单个任务生命周期。然而,可并发的进程数量相较于用户请求数量将小得多。因此,需要解决如何利用有限数量的spark上下文来服务所有用户的请求。

(2)一个spark计算任务通常至少需要秒级时间,用户阻塞等待任务计算结果显然不符合web实时交互式使用方式,因此需要将任务计算结果或状态异步返回以便实时响应用户的请求。

(3)对于一些耗时较长的任务,应给予用户是否终止该任务的权限。因此需要解决如何让web用户终止正在运行的spark任务。

本发明解决上述问题采用的实现方式是:

对于问题(1):

需要对用户的任务计算请求进行缓存,本发明采用异步队列来实现(异步是指cpu不阻塞等待i/o(读写)操作结果),并利用关系型数据库对任务进行持久化存储。服务任务基于简单的先进先出(fifo,firstinfirstout)机制,同时限制一个用户可同时运行的任务数以免spark集群被某一用户的长耗时计算任务占用。考虑到python的gil特性(globalinterpreterlock),有限的spark上下文的维护即多进程的维护采用协程进行。本发明利用了tornado框架作为web服务器(tornado为使用python语言编写的轻量级web服务器,支持异步网络i/o),并使用了其关于异步队列及协程的实现。

初始时,会启动一定数目的子进程(每个子进程对应一个spark上下文,与spark集群连接,用以提交用户的计算请求);每个子进程与主进程中的一个协程通过异步消息队列通信。主进程中的协程消耗异步任务队列中的任务,通过异步消息队列将该任务告知相应的子进程,子进程将任务提交至spark集群并阻塞等待任务计算结果,若出错则返回错误信息。

进程池中子进程数目减少时(用户终止任务时,相应的子进程被杀死),会启动一个新的子进程,同时,i/o事件循环(i/oeventloop,一个监听i/o事件包括读写等并针对事件进行相应处理的循环,实现包括select,epoll,kqueue等)加入一个新的协程来守护该子进程。

对于问题(2):

用户提交任务后会得到该任务的唯一id。可通过该id查询任务的状态和执行结果。用户与web服务器之间采用websocket进行通信。采用关系型数据库来存储用户的任务计算请求,每个请求为一条记录,包括任务的唯一id,提交者,提交时间,状态,结束时间等信息。每次任务状态更新均写入关系型数据库。任务初始状态为“等待”状态;协程在提交任务至进程后,更新任务状态为“运行”状态;协程在获取进程返回的结果后,更新任务状态为“完成”状态。对于耗时较少的计算任务,服务器可实时将计算结果推送给用户。对于耗时较长的计算任务,可通过查询关系型数据库来获得任务状态。子进程会阻塞等待spark的任务计算结果,但主进程将在协程之间调度,即在子进程池中寻找空闲的子进程以便服务其他请求,若没有空闲子进程则等待。

对于问题(3):

处理用户终止任务请求的流程如下:web服务器接收用户停止任务的请求,对于正在运行的任务,主进程停止相应的子进程,启动一个新的子进程,并由一个新的协程守护,而当前的协程则返回,结束生命周期;对于已经执行完或还在等待的任务,web服务器给出相应的错误描述告知用户终止任务请求不合理。

具体来说,本发明采用的技术方案如下:

一种python-web环境中多用户共享使用spark集群的实现方法,包括以下步骤:

web服务器接收用户端提交的任务计算请求,将任务存入异步任务队列中;

web服务器的主进程中的协程,将所述异步任务队列中的任务通过异步消息队列告知相应的子进程,每个子进程对应一个spark上下文;

子进程将任务提交至spark集群以进行任务计算。

进一步地,所述web服务器为采用tornado框架的web服务器。

进一步地,根据任务请求的时间顺序采用先到先服务的策略,在此基础上限制同一用户最多能够运行的任务数以保证spark集群能够被多个不同用户共享。

进一步地,子进程将任务提交至spark集群后,阻塞等待spark集群的任务计算结果,主进程在协程之间调度,即在子进程池中寻找空闲的子进程以便服务其他用户端的请求,若没有空闲子进程则等待。

进一步地,采用关系型数据库存储用户端的任务计算请求,每个任务计算请求为一条记录,包括任务的唯一id、提交者、提交时间、状态、结束时间;每次任务状态更新均写入关系型数据库;用户端提交任务后,从所述关系型数据库获得任务的唯一id,通过该id查询任务的状态和执行结果。

进一步地,所述每次任务状态更新均写入关系型数据库,包括:

任务初始状态为“等待”状态;

协程在提交任务至子进程后,更新任务状态为“运行”状态;

子进程将任务计算结果或错误信息返回给协程后,协程更新任务状态为“完成”或“错误”。

进一步地,对于处于“运行”状态的任务,用户能够选择终止该任务的运行,终止任务后相应的子进程被杀死,spark上下文丢失,相应的spark应用结束即不再占用spark集群的资源。

进一步地,处理用户终止任务请求的步骤包括:

web服务器接收用户端终止任务的请求;

对于正在运行的任务,主进程停止相应的子进程,启动一个新的子进程,并由一个新的协程守护,而当前的协程则返回,结束生命周期;

对于已经执行完或还在等待的任务,web服务器给出相应的错误描述告知用户端终止任务请求不合理。

一种用于实现python-web环境中多用户共享使用spark集群的web服务器,其包括:

接收任务请求模块,用于接收用户端提交的任务计算请求,将任务存入异步任务队列中;

调度任务请求模块,用于根据任务请求的时间顺序采用先到先服务的策略,在此基础上限制同一用户最多可运行的任务数以保证spark集群可以被多个不同用户共享;

处理任务请求模块,用于通过主进程中的协程,将所述异步任务队列中的任务通过异步消息队列告知相应的子进程,每个子进程对应一个spark上下文;

提交任务模块,用于通过子进程将任务提交至spark集群以进行任务计算。

一种python-web环境中多用户共享使用spark集群的实现系统,包括用户端,与所述用户端建立通信连接的上面所述的web服务器,以及与所述web服务器建立通信连接的spark集群。

与现有技术相比,本发明的有益效果是:

1)本发明引入多进程来支撑多个spark上下文,能够利用有限数量的spark上下文来服务和支持多用户的任务计算请求;

2)本发明利用协程而不是线程来守护子进程,协程之间自主调度。线程消耗系统资源,操作系统一般对可启动的线程数有限制。对于大规模的spark集群,如果通过多线程的方式将引入过多负担。spark计算任务通常需要数十秒至数分钟,web应用等待spark集群计算结果可以认为是占用i/o资源。因此采用异步i/o来实现更为合适。

3)本发明能够将任务计算结果或状态异步返回以便实时响应用户的请求,满足了web实时交互式使用的需求;

4)本发明利用了spark任务间调度的特性。对于一些耗时较长的任务,给予用户是否终止该任务的权限,能够让web用户终止正在运行的spark任务。

5)本发明采用先到先服务的机制来服务用户请求,同时在此基础上限制同一用户最多可运行的任务数,以此来保证用户间的相对公平。

附图说明

图1是本发明的技术方案的架构图。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。

本发明的具体实施方式如图1所示,包括用户、ui(web网站页面及相应功能,由djangoweb框架实现)、web服务器(webserver)和spark集群(sparkcluster)。用户端与web服务器之间采用websocket协议进行通信。图1中zmq即zeromq,是一个基于消息队列的多线程网络库,用于实现异步网络通信。

以下以处理用户的一个任务计算请求为例详细叙述本发明涉及的实现方式。

系统初启动后,异步任务队列(taskqueue)为空,一定数目的子进程(process)启动,与spark集群建立连接,同样数目的协程(coroutine)加入i/o事件循环,协程与子进程通过zmq进行通信。

(1)接收任务请求

web服务器接收用户请求,将其转化为任务对象,放入异步任务队列中,同时在关系型数据(图1中的mysql)中进行持久化存储。用户获得该任务的唯一id。

(2)处理任务请求

多个协程消耗异步任务队列中的任务,若所有协程均在异步等待任务计算结果(异步等待子进程的消息),则队列中的任务只能等待被消耗,此时当前任务处于“等待”状态。当某个协程得到当前子进程的异步消息,将循环开始消耗队列中的任务,交于当前子进程执行,此时任务处于“运行”状态。从任务队列中获取任务的步骤如下所述:

首先初始化两个全局队列,一个异步队列q1用于缓存用户任务提交请求,一个同步双向队列q2用于缓存检查过的任务。

①若q2不为空,则从q2中取一个任务,若该任务满足要求(即提交该任务的用户当前处于运行状态的任务数num_running_tasks<max_tasks_per_user,其中max_tasks_per_user表示设定的每个用户最多可同时运行的任务数),则返回该任务并恢复q2中剩余任务的顺序;若该任务不满足要求则循环此步骤直至q2为空并恢复q2中任务顺序。

②若q2为空,则从q1中取一个任务,q1为空则异步等待;否则若该任务满足要求,则返回该任务;若不满足要求,则将任务压入q2。循环此步骤直至q1为空。

实现上述过程的伪代码如下:

子进程通过spark上下文(sparkcontext)与spark集群连接,提交spark任务后,同步等待(即阻塞等待)计算结果。其同步等待将导致相应的协程i/o事件循环去调度其他的协程。子进程结束同步等待后将任务计算结果或错误信息返回协程,协程更新任务状态为“完成”或“错误”。

(3)任务状态或计算结果异步查看

用户提交计算请求后即可通过查询关系型数据库来查看任务的当前状态。任务“完成”状态时,可查看任务计算结果。

(4)终止任务

对于处于“运行”状态的任务,用户可以选择终止该任务的运行。终止任务后,相应的子进程被杀死,spark上下文丢失,相应的spark应用结束即不再占用spark集群的资源。为维护一定数量的spark上下文,子进程被杀死后会随即启动一个新的子进程并交由一个新的协程守护,而当前的协程将返回退出i/o事件循环。

本发明的技术方案中未详细描述的部分可以采用现有技术实现。

本发明除以上实施例以外,可以利用python语言关于异步的一些实现,例如asyncio(包括协程、i/o事件循环等接口)、aiohttp包(包括异步http服务器api,websocket等接口)进行本发明方案具体步骤的实现。相较于利用tornado已经封装好的接口,利用各种工具包构建本发明方案所需的模块要花费更多精力。

本发明另一实施例提供一种用于实现python-web环境中多用户共享使用spark集群的web服务器,其包括:

接收任务请求模块,用于接收用户端提交的任务计算请求,将任务存入异步任务队列中;

调度任务请求模块,用于根据任务请求的时间顺序采用先到先服务的策略,在此基础上限制同一用户最多可运行的任务数以保证spark集群可以被多个不同用户共享;

处理任务请求模块,用于通过主进程中的协程,将所述异步任务队列中的任务通过异步消息队列告知相应的子进程,每个子进程对应一个spark上下文;

提交任务模块,用于通过子进程将任务提交至spark集群以进行任务计算。

所述web服务器采用关系型数据库存储用户端的任务计算请求,每个任务计算请求为一条记录,包括任务的唯一id、提交者、提交时间、状态、结束时间;每次任务状态更新均写入关系型数据库。

本发明另一实施例一种python-web环境中多用户共享使用spark集群的实现系统,包括用户端,与所述用户端建立通信连接的上面所述的web服务器,以及与所述web服务器建立通信连接的spark集群。

以上实施方式仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的原理和范围,本发明的保护范围应以权利要求书所述为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1