基于SparkSQL的数据处理方法及装置、存储介质及计算设备与流程

文档序号:16999645发布日期:2019-03-02 01:40阅读:167来源:国知局
基于Spark SQL的数据处理方法及装置、存储介质及计算设备与流程

本发明的实施方式涉及数据处理领域,更具体地,本发明的实施方式涉及一种基于sparksql的数据处理方法及装置、存储介质及计算设备。



背景技术:

大数据技术是目前较为热门的一项技术,指对规模巨大的数据进行查询、分析等处理的技术。随着大数据时代的来临,与大数据相关的数据仓库、数据安全、数据分析、数据挖掘等应用已逐渐成为it行业的研究热点。

例如,诞生于加州大学伯利克分校amplab的apachespark是一个基于内存计算的大数据计算框架。其中,spark是mapreduce(mr)的替代方案,目的在于提供更高效的数据处理能力,且其能够兼容hdfs分布式存储层,兼容apachehive元数据仓库,可融入hadoop的生态系统,以弥补缺失mapreduce的不足。通常,spark程序为主从(master/slave)结构,驱动器(driver)作为master(指主动发起请求的一方)负责其计算最小单位任务(task)的调度,而执行器(executor)负者task的运算。但是,mapreduce不能满足大部分大数据场景下的即席查询。

又如,sparksql作为sqlonhadoop技术的其中一种,其作用是将sql查询语句经其自带的查询优化器翻译成spark底层计算逻辑,以提供高效的sql查询能力。基于sparksql对诸如apachehive等的标的产品实现计算逻辑,相比于mapreduce而言能够提高处理性能。



技术实现要素:

但是,上述大数据计算框架无法通过在一台服务器上运行单个应用实例来为多个租户提供服务,也即,不具备多租户(multitenancy/tenant)功能。

例如,如图1a所示的hiveserver2(以下简称技术一)提供了一种基于hive查询引擎的sqlonhadoop多租户方案,该多租户方案对于每一个来自用户的客户端(client)请求,hiveserver2都为该请求创建一个会话(session),并分配一个执行上下文环境,对应于一轮mr任务。在该多租户方案中,计算层启动的执行环境与client个数一一对应,无法重用影响效率,未能实现在一台服务器上运行单个应用实例来为多个租户提供服务的目的,故而不具有真正的多租户功能。

再如,如图1b所示的sparkthriftserver(以下简称技术二)提供了一种基于sparksql查询引擎的sqlonhadoop方案,由于单个sparkthriftserver不具备多租户特性,为了能让用户访问其所对应的存储在hdfs的数据,必须为其启动单独的服务器(server),即用户user2无法实现通过user1的server来访问自己资源的目的。因此,该方案也不具备多租户特性,并且,该方案通过为特定用户预置一个server的方式而增加了系统维护的复杂度,降低了服务器资源的并发能力和资源利用率。

因此在现有技术中,往往是上述技术一和技术二混合部署的模式,但两者无法实现无缝兼容,这是非常令人烦恼的过程。

为此,非常需要一种改进的基于sparksql的数据处理方法,以使其通过在一台服务器上运行单个应用实例即可为多个租户提供服务。

在本上下文中,本发明的实施方式期望提供一种基于sparksql的数据处理方法及装置、存储介质及计算设备。

在本发明实施方式的第一方面中,提供了一种基于sparksql的数据处理方法,包括:响应于会话的发起,根据发起所述会话的代理用户的用户名,在预设关系集中查找所述用户名对应的spark上下文变量实例;若未查找到所述用户名对应的所述spark上下文变量实例,则新建与所述用户名对应的spark上下文变量,并对所述spark上下文变量进行实例化,以形成所述用户名对应的spark上下文变量实例,并在所述预设关系集中添加所述用户名至少与对应的spark上下文变量实例之间的对应关系;以及根据发起所述会话的代理用户的用户名对应的spark上下文变量实例,创建对应的运行时环境来执行对应的数据处理。

在本发明的一个实施例中,所述预设关系集包括:从由一个或多个代理用户的用户名构成的第一集合到由一个或多个spark上下文变量实例构成的第二集合之间的一一映射关系。

在本发明的另一个实施例中,所述预设关系集包括:从由一个或多个代理用户的用户名构成的第一集合到第三集合之间的一一映射关系;其中,所述第三集合包括一个或多个元素,所述第三集合的每个元素包括一个spark上下文变量实例以及与该spark上下文变量实例相应的连接数。

在本发明的又一个实施例中,所述一一映射关系是基于线程安全的hashmap构建的。

在本发明的再一个实施例中,所述该用户名至少与对应的spark上下文变量实例之间的对应关系包括:该用户名与对应的spark上下文变量实例之间的对应关系。

在本发明的再一个实施例中,所述该用户名至少与对应的spark上下文变量实例之间的对应关系包括:该用户名与对应的spark上下文变量实例及该spark上下文变量实例相应的连接数之间的对应关系。

在本发明的再一个实施例中,该方法还包括:若查找到发起所述会话的代理用户的用户名对应的spark上下文变量实例,将所述预设关系集中与该spark上下文变量实例相应的连接数更新为当前连接数加1所得的值。

在本发明的再一个实施例中,该方法还包括:当所述会话关闭时,将发起所述会话的代理用户对应的spark上下文变量实例相应的连接数更新为当前连接数减1所得的值。

在本发明的再一个实施例中,该方法还包括:周期性地、或响应于所述会话的关闭,根据lru原理对spark上下文变量实例所占用的资源进行回收。

在本发明的再一个实施例中,所述根据lru原理对spark上下文变量实例所占用的资源进行回收的步骤包括:判断所述预设关系集中是否存在其中spark上下文变量实例相应的连接数为0的对应关系,当存在所述连接数0的对应关系时,在所述预设关系集中删除该连接数0的对应关系,并释放该连接数0的对应关系对应的spark上下文变量所占用的资源。

在本发明的再一个实施例中,由同一代理用户在不同客户端发起的会话共享同一个spark上下文变量实例。

在本发明的再一个实施例中,所述执行对应的数据处理包括执行对应的数据查询处理。

在本发明的再一个实施例中,所述创建对应的运行时环境的步骤包括:创建driverrpc通信环境。

在本发明的再一个实施例中,所述创建对应的运行时环境的步骤包括:向资源管理器提交资源请求,以通过资源管理器在发起所述会话的代理用户对应队列中获取相应的计算资源,并启动与该计算资源绑定的执行器。

在本发明的再一个实施例中,在查找发起所述会话的代理用户的用户名对应的spark上下文变量实例的步骤之前,还包括:若发起所述会话的代理用户的认证信息无效,结束所述会话的处理。

在本发明的再一个实施例中,在查找发起所述会话的代理用户的用户名对应的spark上下文变量实例的步骤之前,还包括:若发起所述会话的代理用户不是启动所述服务器的进程用户的授信者,结束对所述会话的处理。

在本发明实施方式的第二方面中,提供了一种存储有程序的存储介质,所述程序被处理器执行时实现上述基于sparksql的数据处理方法。

在本发明实施方式的第三方面中,提供了一种基于sparksql的数据处理装置,包括:查找单元,适于响应于会话的发起,根据发起所述会话的代理用户的用户名,在预设关系集中查找所述用户名对应的spark上下文变量实例;处理单元,适于若未查找到所述用户名对应的所述spark上下文变量实例,则新建与所述用户名对应的spark上下文变量,并对所述spark上下文变量进行实例化,以形成所述用户名对应的spark上下文变量实例,并在所述预设关系集中添加所述用户名至少与对应的spark上下文变量实例之间的对应关系;以及执行单元,适于根据发起所述会话的代理用户的用户名对应的spark上下文变量实例,创建对应的运行时环境来执行对应的数据处理。

在本发明的一个实施例中,所述预设关系集包括:从由一个或多个代理用户的用户名构成的第一集合到由一个或多个spark上下文变量实例构成的第二集合之间的一一映射关系。

在本发明的另一个实施例中,所述预设关系集包括:从由一个或多个代理用户的用户名构成的第一集合到第三集合之间的一一映射关系;其中,所述第三集合包括一个或多个元素,所述第三集合的每个元素包括一个spark上下文变量实例以及与该spark上下文变量实例相应的连接数。

在本发明的又一个实施例中,所述一一映射关系是基于线程安全的hashmap构建的。

在本发明的再一个实施例中,所述该用户名至少与对应的spark上下文变量实例之间的对应关系包括:该用户名与对应的spark上下文变量实例之间的对应关系。

在本发明的再一个实施例中,所述该用户名至少与对应的spark上下文变量实例之间的对应关系包括:该用户名与对应的spark上下文变量实例及该spark上下文变量实例相应的连接数之间的对应关系。

在本发明的再一个实施例中,所述处理单元还适于:若查找到发起所述会话的代理用户的用户名对应的spark上下文变量实例,将所述预设关系集中与该spark上下文变量实例相应的连接数更新为当前连接数加1所得的值。

在本发明的再一个实施例中,所述处理单元还适于:当所述会话关闭时,将发起所述会话的代理用户对应的spark上下文变量实例相应的连接数更新为当前连接数减1所得的值。

在本发明的再一个实施例中,所述处理单元还适于:周期性地、或响应于所述会话的关闭,根据lru原理对spark上下文变量实例所占用的资源进行回收。

在本发明的再一个实施例中,所述处理单元适于:判断所述预设关系集中是否存在其中spark上下文变量实例相应的连接数为0的对应关系,当存在所述连接数0的对应关系时,在所述预设关系集中删除该连接数0的对应关系,并释放该连接数0的对应关系对应的spark上下文变量所占用的资源。

在本发明的再一个实施例中,所述查找单元适于使得同一代理用户在不同客户端发起的会话共享同一个spark上下文变量实例。

在本发明的再一个实施例中,所述执行单元所执行的对应的数据处理包括对应的数据查询处理。

在本发明的再一个实施例中,所述执行单元所创建的对应的运行时环境:对应的driverrpc通信环境。

在本发明的再一个实施例中,所述执行单元适于通过如下处理来创建对应的运行时环境:向资源管理器提交资源请求,以通过资源管理器在发起所述会话的代理用户对应队列中获取相应的计算资源,并启动与该计算资源绑定的执行器。

在本发明的再一个实施例中,所述查找单元还适于在查找单元查找发起所述会话的代理用户的用户名对应的spark上下文变量实例之前,判定发起所述会话的代理用户的认证信息是否有效,若该认证信息无效,结束所述会话的处理。

在本发明的再一个实施例中,所述查找单元还适于在查找发起所述会话的代理用户的用户名对应的spark上下文变量实例的步骤之前,判定发起所述会话的代理用户是否是启动所述服务器的进程用户的授信者,若发起所述会话的代理用户不是启动所述服务器的进程用户的授信者,结束对所述会话的处理。

在本发明实施方式的第四方面中,提供了一种计算设备,包括上述存储介质。

根据本发明实施方式的基于sparksql的数据处理方法及装置、存储介质及计算设备,其能够通过在一台服务器上运行单个应用实例来为多个租户提供服务,实现多租户功能。

附图说明

通过参考附图阅读下文的详细描述,本发明示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本发明的若干实施方式,其中:

图1a是示出现有hiveserver2方案的示例性示意图;

图1b是示出现有sparkthriftserver方案的示例性示意图;

图1c是示出现有原生spark程序的框架结构示意图;

图1d是示出根据本发明实施方式的基于sparksql的数据处理方法及装置的框架结构示意图;

图2是示意性地示出根据本发明实施方式的基于sparksql的数据处理方法的一个示例性处理的流程图;

图3a是示意性地示出现有spark程序的工作原理的uml时序图;

图3b是示意性地示出根据本发明实施例的基于sparksql的数据处理方法的一个优选应用示例的工作原理的uml时序图;

图4是示意性地示出根据本发明实施方式的基于sparksql的数据处理装置的一个示例的结构框图;

图5是示意性地示出根据本发明一实施例的计算机的结构示意图;

图6是示意性地示出根据本发明一实施例的计算机可读存储介质的示意图。

在附图中,相同或对应的标号表示相同或对应的部分。

具体实施方式

下面将参考若干示例性实施方式来描述本发明的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

本领域技术人员知道,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。

根据本发明的实施方式,提出了一种基于sparksql的数据处理方法及装置、存储介质及计算设备。

需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。

下面参考本发明的若干代表性实施方式,详细阐释本发明的原理和精神。

发明概述

本发明人发现,apachespark自带的thriftserver模块简单继承了apachehive的hiveserver2模块,但除了在功能上相似及性能上有所提升之外,由于spark整体架构的局限,却阉割了不少具有实际意义的功能,比如多租户特性以及高可用特性等。然而,在企业级场景下往往需要资源的共享与数据的隔离,没有多租户特性就无法满足该实际需求。同时,对于一个常驻服务,若没有高可用特性的话,服务的鲁棒性便会大大降低。本发明在改造spark内核使其执行多实例的基础上,实现一个高可用的提供多租户服务的thriftserver系统,实现资源的共享和用户数据的隔离。

图1c示出了一个原生spark程序的架构。如图1所示,驱动器程序(driverprogram)为spark程序的master,原始架构设计中,spark上下文变量(sparkcontext)实例化后会创建其对应的运行时环境,包括创建driverrpc通信环境和向资源管理器(yarn)提交资源请求等,当在driver进程中再次实例化一个sparkcontext时,该环境会被重新创建一次,由于该环境以全局唯一变量的形式存在,因此后者会覆盖前者的所有环境,导致前者的环境实际不可用。

由此可知,一方面,由于spark内核架构限制,一个spark程序的driver进程只能对应一个sparkcontext实例,该实例会向资源管理器(hadoopyarn)某一个特定队列中请求相应的计算资源启动对应个数executor。这些资源由某一用户所有,不能由其他用户共享,只能访问该用户的数据,其他用户无法使用该资源访问其对应的数据;另一方面,由于thriftserver本质上是一个spark程序,启动该程序时会对应启动相应的sparkcontext及所对应的资源,由于权限等问题,这个程序不能为不同的用户提供服务,只能为不同的用户去启动这样一个服务,这种架构显然是不切实际的。

本发明针对以上问题提供了一种基于sparksql的数据处理方法及装置、存储介质及计算设备,如图1d所示,其通过修改spark内核架构来实现sparkcontext多实例特性,使得driver进程中可实例化多个互不干扰的sparkcontext,并且这些sparkcontext的运行环境以用户为粒度相互隔离,每个sparkcontext向资源管理器去用户对应队列中获取相应的计算资源,并启动与其绑定的executor计算资源。

此外,如图1d所示,基于“sparkcontext多实例实现multisparkthriftserver”的方法,可首先将server与sparkcontext解耦,server启动时启动服务本身,而不启动sparkcontext及其对应的计算集群;其次,当有相应的用户发起会话时,server例如可检查该用户是否有对应的初始化完毕的sparkcontext实例,如果有则复用,如果没有则新建;当用户关闭会话时,例如可由server根据lru原理对sparkcontext进行统一回收,保证性能与资源占用之间的平衡。

由此可知,本发明实施方式提供的技术方案由于能够基于hadoop伪装机制,即以进程用户伪装(doas)代理用户执行sparkcontext的实例化过程,这样一来,该sparkcontext对应的运行时集群就以代理用户来执行所有后续操作。此外,实现<用户,运行时环境>(即<user,env>),即代理用户与运行时环境的一一映射,将用户对应的sparkcontext实例相应的运行环境变量存储到该映射中。

其中,进程用户例如指启动进程的用户,或者kerberos环境下的登录(login)用户。代理用户例如可以是客户端实例中携带的用户信息或者通过配置项指定的用户名称;在执行过程中,进程用户以该用户(代理用户)的身份在进程中执行相关功能。

在介绍了本发明的基本原理之后,下面具体介绍本发明的各种非限制性实施方式。

示例性方法

下面,参考图2来描述根据本发明示例性实施方式的基于sparksql的数据处理方法。

图2示意性地示出了根据本公开实施例的基于sparksql的数据处理方法的一种示例性的处理流程200。

如图2所示,处理流程200开始后,首先执行步骤s210。

s210、响应于会话的发起,根据发起会话的代理用户的用户名,在预设关系集中查找该代理用户的用户名所对应的sparkcontext实例。

作为示例,代理用户的用户名例如包括但不限于注册账号、昵称、手机号、邮箱号或其他联系方式中的任一种。

作为示例,预设关系集在初始时可以是空集,也可以包含有预先存储的映射关系。

作为示例,本发明实施方式中的预设关系集例如可以包括从第一集合到第二集合的一一映射关系。其中,第一集合例如由一个或多个代理用户的用户名构成,而第二集合例如由一个或多个sparkcontext实例构成的第二集合之间的一一映射关系。换句话说,在该示例中,预设关系集例如可以包括多个对应关系,每个对应关系即一个代理用户的用户名与其对应的sparkcontext实例之间的对应关系。

作为示例,本发明实施方式中的预设关系集例如也可以包括:从由一个或多个代理用户的用户名构成的第一集合到第三集合之间的一一映射关系;其中,第三集合包括一个或多个元素,第三集合的每个元素包括一个sparkcontext实例以及与该sparkcontext实例相应的连接数。换句话说,在该示例中,预设关系集例如可以包括多个对应关系,每个对应关系即一个代理用户的用户名与其对应的sparkcontext实例、该sparkcontext实例所连接的连接数(即连接的所有代理用户数量)之间的对应关系。

应当理解的是,可以根据需要在预设关系集中增添新的对应关系,即增添一个新的代理用户的用户名与其对应的sparkcontext实例之间的对应关系,也可以根据需要对其中已包含的对应关系进行删减或修改。

其中,上述从第一集合到第二集合的一一映射关系以及/或上述从第一集合到第三集合的一一映射关系例如是基于线程安全的hashmap构建的。

作为示例,在查找发起会话的代理用户的用户名对应的sparkcontext实例的步骤之前,还可以包括:若发起会话的代理用户的认证信息无效,结束对该会话的处理(以下简称认证信息判定处理)。

例如,在处理流程200开始后,当有代理用户发起会话时,首先判断发起该会话的代理用户的认证信息是否有效:若有效,则可以根据发起该会话的代理用户的用户名,在预设关系集中查找该用户名对应的spark上下文变量实例;若无效,则结束对本次会话的处理,等待下一次会话的发起。

作为示例,在查找发起会话的代理用户的用户名对应的sparkcontext实例的步骤之前,还可以包括:若发起会话的代理用户不是启动服务器的进程用户的授信者,结束对该会话的处理(以下简称授信判定处理)。

例如,在处理流程200开始后,当有代理用户发起会话时,首先判断发起该会话的代理用户是否为启动服务器的进程用户的授信者:若是,则可以根据发起该会话的代理用户的用户名,在预设关系集中查找该用户名对应的spark上下文变量实例;否则,则结束对本次会话的处理,等待下一次会话的发起。

在另一个示例中,在查找发起会话的代理用户的用户名对应的sparkcontext实例的步骤之前,可以同时包括上述认证信息判定处理以及授信判定处理,其中,认证信息判定处理和授信判定处理的先后执行顺序没有限定,可以先进行认证信息判定处理、后进行授信判定处理,反之亦可。

例如,在处理流程200开始后,当有代理用户发起会话时,首先判断发起该会话的代理用户的认证信息是否有效:若该认证信息有效,则继续判定发起该会话的代理用户是否为启动服务器的进程用户的授信者,当该代理用户是启动服务器的进程用户的授信者时,根据发起该会话的代理用户的用户名在预设关系集中查找该用户名对应的spark上下文变量实例,当该代理用户不是启动服务器的进程用户的授信者时结束对本次会话的处理;若该认证信息无效,则结束对本次会话的处理。

步骤s220、若步骤s210中未查找到发起该会话的代理用户的用户名对应的sparkcontext实例,则新建与该用户名对应的sparkcontext,并对sparkcontext进行实例化,以形成该用户名对应的sparkcontext实例,并在预设关系集中添加该用户名至少与对应的sparkcontext实例之间的对应关系。

作为示例,该用户名至少与对应的sparkcontext实例之间的对应关系例如包括:该用户名与对应的sparkcontext实例之间的对应关系。

作为示例,该用户名至少与对应的sparkcontext实例之间的对应关系例如也可以包括:该用户名与对应的sparkcontext实例及该sparkcontext实例相应的连接数之间的对应关系。

作为示例,若步骤s210中查找到发起该会话的代理用户的用户名对应的sparkcontext实例,则可以跳过步骤s220直接执行步骤s230的处理。

s230、根据发起会话的代理用户的用户名对应的sparkcontext实例,创建对应的运行时环境来执行对应的数据处理。

作为示例,执行对应的数据处理例如包括执行对应的数据查询处理等。

作为示例,创建对应的运行时环境的步骤可以包括:创建driverrpc通信环境。

作为示例,创建对应的运行时环境的步骤也可以包括:向资源管理器提交资源请求,以通过资源管理器在发起会话的代理用户对应队列中获取相应的计算资源,并启动与该计算资源绑定的执行器。

作为示例,在处理流程200中,还可以包括如下步骤:若查找到发起会话的代理用户的用户名对应的sparkcontext实例,则将预设关系集中与该sparkcontext实例相应的连接数更新为当前连接数加1所得的值。

例如,若查找到发起会话的代理用户的用户名对应的sparkcontext实例,假设与该sparkcontext实例相应的当前连接数为n1,则更新后的连接数为n1+1。

作为示例,在处理流程200中,还可以包括如下步骤:当该会话关闭时,将发起会话的代理用户对应的sparkcontext实例相应的连接数更新为当前连接数减1所得的值。

例如,当该会话关闭时,假设与该sparkcontext实例相应的当前连接数为n2,则更新后的连接数为n2-1。

作为示例,在处理流程200中,还可以包括如下步骤:周期性地、或响应于会话的关闭,根据lru原理对sparkcontext实例所占用的资源进行回收。

例如,可以按照如下方式来实现“根据lru原理对sparkcontext实例所占用的资源进行回收”的步骤:判断预设关系集中是否存在其中sparkcontext实例相应的连接数为0的对应关系,当存在连接数0的对应关系时,在预设关系集中删除该连接数0的对应关系,并释放该连接数0的对应关系对应的sparkcontext所占用的资源。

作为示例,由同一代理用户在不同客户端发起的会话共享同一个sparkcontext实例。

例如,代理用户ua在客户端p1上发起一个会话s1,假设代理用户ua对应的sparkcontext实例为sca;在会话s1持续期间,代理用户ua又在客户端p2上发起另一个会话s2,则会话s2和会话s1共享sparkcontext实例sca,其中,客户端不局限于手机客户端、电脑客户端等。

优选应用示例

在描述该优选应用示例之前,首先参考图3a描述现有技术的应用场景。在现有技术中,一个sparkthriftserver只能服务于一个用户,当有不同用户请求时就无法正常的执行用户的某些与数据相关的请求。当用户需要访问自己的数据时,必须将属于该用户的server给预置好。

如图3a所示,在现有技术中,当用户1启动服务器后,便启动sparkcontext并实例化,实例化成功以后,若用户1发起新的会话,则用户1的sparkcontext与服务器绑定,用户1可以后续进行查询等操作,但另一个用户2则无法通过访问该服务器的sparkcontext来进行相应操作,如查询等。

图3b示出了本发明实施例的一个优选应用示例。如图3b所示,在该优选应用示例中,对于不同的用户连接请求,可以按用户来实例化sparkcontext,不同用户的连接请求实例化不同的sparkcontext,实现server并发响应来自不同用户的请求。对于相同用户来自不同客户端的连接请求,则共享一个sparkcontext实例,这些实例都会在各自资源管理器的有效队列中完成初始化,并后续访问hdfs存储层有权限的数据资源,从而实现多租户。

如图3b所示,用户1和用户2作为代理用户。

以用户1为例描述一个代理用户的完整实例,用户2可以采用类似的形式,将不再赘述。

在图3b中,sc缓存是基于线程安全的hashmap构建的<用户名,(sparkcontext实例,连接数)>的映射关系(或构建的<用户名,sparkcontext实例>映射关系),支持键值对的增、删、改、查操作。

如图3b所示,用户1通过进程用户启动服务器,sc缓存(sparkcontextcache)实例化(init)成功后,用户1发起新会话(设为会话1),在sc缓存中中查找用户1的用户名所对应的sparkcontext实例:若找到,则用户1与该sparkcontext实例绑定,当前连接数加1,即将<用户1的用户名,(用户1对应的sparkcontext实例,连接数)>更新为<用户1的用户名,(用户1对应的sparkcontext实例,连接数+1)>;否则,新建用户1的用户名所对应的sparkcontext并实例化该sparkcontext,令牌有效情况下,sparkcontext实例化成功,将<用户1的用户名,(用户1对应的sparkcontext实例,1)>映射关系写入sccache即完成注册,进而用户会话创建完成,然后将用户1与该sparkcontext实例绑定。用户1可以后续进行查询等操作。当会话1结束时,清除会话1本身,当前连接数减1,即将<用户1的用户名,(用户1对应的sparkcontext实例,连接数)>更新为<用户1的用户名,(用户1对应的sparkcontext实例,连接数-1)>。

此外,如图3b所示,当用户2发起新会话(设为会话2)时,在sc缓存中的预设关系集中查找用户2的用户名所对应的sparkcontext实例:若找到,则用户2与该sparkcontext实例绑定,当前连接数加1,即将<用户2的用户名,(用户2对应的sparkcontext实例,连接数)>更新为<用户2的用户名,(用户2对应的sparkcontext实例,连接数+1)>;否则,新建用户2的用户名所对应的sparkcontext并实例化该sparkcontext,令牌有效情况下,sparkcontext实例化成功,将<用户2的用户名,(用户2对应的sparkcontext实例,1)>映射关系写入sccache即完成注册,进而用户会话创建完成,然后将用户2与该sparkcontext实例绑定。用户2可以后续进行查询等操作。当会话2结束时,清除会话2本身,当前连接数减1,即将<用户2的用户名,(用户2对应的sparkcontext实例,连接数)>更新为<用户2的用户名,(用户2对应的sparkcontext实例,连接数-1)>。

此外,还可以根据lru原理定期地对sparkcontext实例所占用的资源进行回收等。如图3b所示,例如可以通过sc缓存清理线程(sccachecleanerthread)来实现上述功能,该线程为服务器端启动的一个周期性执行的线程,主要用于判断sccache中是否存在<用户名,(sparkcontext实例,0)>的映射关系(该映射关系表示没有活跃的用户在连接着该sparkcontext实例),若存在这样的映射关系,则会把这条记录彻底删除,并回收sparkcontext。

通过以上描述可知,根据本发明实施例的上述基于sparksql的数据处理方法,能够实现在单个spark程序的驱动器的java虚拟机(jvm)内以用户隔离的方式完成sparkcontext的多实例化,主要体现在两方面:一个是可满足sparkcontext线程级别的调度,比一般现有技术方案中以进程级别调度更加高效;另一个是可实现sparkcontext为同一用户共享,提高并发处理能力,而现有技术方案中无法实现共享。其中,sparkcontext线程级别的调度是指,如图3b所示的为一个进程实例,其运行在单一的jvm内,在内部完成属于不同用户的sparkcontext的实例化,并没有重新启动另一个进程/jvm来实现sparkcontext的实例化(而传统的方案由于受到spark本身架构的限制,要实现类似功能则只能启动另一个进程/jvm来实现)。

在一些实施例中,根据本发明实施例的上述基于sparksql的数据处理方法通过sparkcontext与用户绑定,在有用户请求时才需要实例化其实例,同用户的多个请求可共享该实例;不同的用户有不同的实例与之绑定;sparkcontext与服务器本身实现解耦,实现动态的调度,更高效合理的利用后台集群资源。此外,利用spark实现多租户引擎,与hiveserver2相比能够大大提高sql的查询性能

示例性装置

在介绍了本发明示例性实施方式的基于sparksql的数据处理方法之后,接下来,参考图4对本发明示例性实施方式的基于sparksql的数据处理装置进行说明。

参见图4,示意性地示出了根据本发明一实施例的基于sparksql的数据处理装置的结构示意图,该装置可以设置于终端设备中,例如,该装置可以设置于台式计算机、笔记型计算机、智能移动电话以及平板电脑等智能电子设备中;当然,本发明实施方式的装置也可以设置于服务器中。本发明实施方式的装置400可以包括下述组成单元:查找单元410、处理单元420和执行单元430。

查找单元410,适于响应于会话的发起,根据发起会话的代理用户的用户名,在预设关系集中查找用户名对应的sparkcontext实例。

处理单元420,适于若未查找到用户名对应的sparkcontext实例,则新建与用户名对应的sparkcontext,并对sparkcontext进行实例化,以形成用户名对应的sparkcontext实例,并在预设关系集中添加用户名至少与对应的sparkcontext实例之间的对应关系。

执行单元430,适于根据发起会话的代理用户的用户名对应的sparkcontext实例,创建对应的运行时环境来执行对应的数据处理。

作为示例,本发明实施方式中的预设关系集例如包括:从由一个或多个代理用户的用户名构成的第一集合到由一个或多个sparkcontext实例构成的第二集合之间的一一映射关系。

作为示例,本发明实施方式中的预设关系集例如也可以包括:从由一个或多个代理用户的用户名构成的第一集合到第三集合之间的一一映射关系;其中,第三集合包括一个或多个元素,第三集合的每个元素包括一个sparkcontext实例以及与该sparkcontext实例相应的连接数。

作为示例,本发明实施方式中的一一映射关系例如是基于线程安全的hashmap构建的。

作为示例,本发明实施方式中的该用户名至少与对应的sparkcontext实例之间的对应关系例如包括:该用户名与对应的sparkcontext实例之间的对应关系。

作为示例,本发明实施方式中的该用户名至少与对应的sparkcontext实例之间的对应关系例如包括:该用户名与对应的sparkcontext实例及该sparkcontext实例相应的连接数之间的对应关系。

作为示例,本发明实施方式中的处理单元420例如还适于:若查找到发起会话的代理用户的用户名对应的sparkcontext实例,将预设关系集中与该sparkcontext实例相应的连接数更新为当前连接数加1所得的值。

作为示例,本发明实施方式中的处理单元420例如还适于:当会话关闭时,将发起会话的代理用户对应的sparkcontext实例相应的连接数更新为当前连接数减1所得的值。

作为示例,本发明实施方式中的处理单元420例如还适于:周期性地、或响应于会话的关闭,根据lru原理对sparkcontext实例所占用的资源进行回收。

作为示例,本发明实施方式中的处理单元420例如适于:判断预设关系集中是否存在其中sparkcontext实例相应的连接数为0的对应关系,当存在连接数0的对应关系时,在预设关系集中删除该连接数0的对应关系,并释放该连接数0的对应关系对应的sparkcontext所占用的资源。

作为示例,本发明实施方式中的查找单元410例如适于使得同一代理用户在不同客户端发起的会话共享同一个sparkcontext实例。

作为示例,本发明实施方式中的执行单元430所执行的对应的数据处理例如包括对应的数据查询处理。

作为示例,本发明实施方式中的执行单元430所创建的对应的运行时环境例如包括:对应的driverrpc通信环境。

作为示例,本发明实施方式中的执行单元430例如适于通过如下处理来创建对应的运行时环境:向资源管理器提交资源请求,以通过资源管理器在发起会话的代理用户对应队列中获取相应的计算资源,并启动与该计算资源绑定的执行器。

在作为示例,本发明实施方式中的查找单元410例如还适于在查找单元410查找发起会话的代理用户的用户名对应的sparkcontext实例之前,判定发起会话的代理用户的认证信息是否有效,若该认证信息无效,结束会话的处理。

作为示例,本发明实施方式中的查找单元410例如还适于在查找发起会话的代理用户的用户名对应的sparkcontext实例的步骤之前,判定发起会话的代理用户是否是启动服务器的进程用户的授信者,若发起会话的代理用户不是启动服务器的进程用户的授信者,结束对会话的处理。

需要说明的是,上述基于sparksql的数据处理装置中的各单元可以分别执行与上文所述的基于sparksql的数据处理方法中的各对应步骤相同的处理,并能够达到相类似的功能和技术效果,这里不再赘述。

图5示出了适于用来实现本发明实施方式的示例性计算机系统/服务器50的框图。图5显示的计算机系统/服务器50仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图5所示,计算机系统/服务器50以通用计算设备的形式表现。计算机系统/服务器50的组件可以包括但不限于:一个或者多个处理器501,系统存储器502,连接不同系统组件(包括系统存储器502和处理器501)的总线503。

计算机系统/服务器50典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器50访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。

系统存储器502可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(ram)5021和/或高速缓存存储器5022。计算机系统/服务器50可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,rom5023可以用于读写不可移动的、非易失性磁介质(图5中未显示,通常称为“硬盘驱动器”)。尽管未在图5中示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如cd-rom,dvd-rom或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线503相连。系统存储器502中可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。

具有一组(至少一个)程序模块5024的程序/实用工具5025,可以存储在例如系统存储器502中,且这样的程序模块5024包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块5024通常执行本发明所描述的实施例中的功能和/或方法。

计算机系统/服务器50也可以与一个或多个外部设备504(如键盘、指向设备、显示器等)通信。这种通信可以通过输入/输出(i/o)接口505进行。并且,计算机系统/服务器50还可以通过网络适配器506与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图5所示,网络适配器506通过总线503与计算机系统/服务器50的其它模块(如处理器501等)通信。应当明白,尽管图5中未示出,可以结合计算机系统/服务器50使用其它硬件和/或软件模块。

处理器501通过运行存储在系统存储器502中的程序,从而执行各种功能应用以及数据处理,例如,执行并实现基于sparksql的数据处理方法中的各步骤;例如,响应于会话的发起,根据发起所述会话的代理用户的用户名,在预设关系集中查找所述用户名对应的spark上下文变量实例;若未查找到所述用户名对应的所述spark上下文变量实例,则新建与所述用户名对应的spark上下文变量,并对所述spark上下文变量进行实例化,以形成所述用户名对应的spark上下文变量实例,并在所述预设关系集中添加所述用户名至少与对应的spark上下文变量实例之间的对应关系;以及根据发起所述会话的代理用户的用户名对应的spark上下文变量实例,创建对应的运行时环境来执行对应的数据处理。

本发明实施方式的计算机可读存储介质一个具体例子如图6所示。

图6的计算机可读存储介质为光盘600,其上存储有计算机程序(即程序产品),该程序被处理器执行时,会实现上述方法实施方式中所记载的各步骤,例如,响应于会话的发起,根据发起所述会话的代理用户的用户名,在预设关系集中查找所述用户名对应的spark上下文变量实例;若未查找到所述用户名对应的所述spark上下文变量实例,则新建与所述用户名对应的spark上下文变量,并对所述spark上下文变量进行实例化,以形成所述用户名对应的spark上下文变量实例,并在所述预设关系集中添加所述用户名至少与对应的spark上下文变量实例之间的对应关系;以及根据发起所述会话的代理用户的用户名对应的spark上下文变量实例,创建对应的运行时环境来执行对应的数据处理;各步骤的具体实现方式在此不再重复说明。

应当注意,尽管在上文详细描述中提及了基于sparksql的数据处理装置的若干单元、模块或子模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多模块的特征和功能可以在一个模块中具体化。反之,上文描述的一个模块的特征和功能可以进一步划分为由多个模块来具体化。

此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。

虽然已经参考若干具体实施方式描述了本发明的精神和原理,但是应该理解,本发明并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本发明旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。

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