一种数据获取方法及设备与流程

文档序号:12906152阅读:173来源:国知局
一种数据获取方法及设备与流程

本发明涉及软件工程领域,更具体地,涉及一种数据获取方法及设备。



背景技术:

elasticsearch是一个优秀的开源分布式搜索引擎,除了用于搜索,elasticsearch也是日志存储、离线数据分析挖掘的利器。应用elasticsearch可以实时收集线上应用在运行过程中输出到磁盘上的日志,并将实时收集到的日志存储到elasticsearch集群中。

对于存储在elasticsearch集群中的日志,有以下两种应用场景:一方面根据所开发的日志中心平台,在该平台上开发人员通过设置检索条件查询线上应用输出的各种日志,从而帮助开发人员了解线上应用的运行情况和快速定位线上应用的问题。另一方面storm集群会实时批量地从elasticsearch集群中拉取日志做复杂的聚合计算,如分布式调用链计算等。以上两种场景均要求快速、连续、实时地从elasticsearch集群中获取大量数据。elasticsearch提供了scrollapi(滚动搜索)用于使elasticsearch快速、有效地执行大批量的数据查询。

但scrollapi(滚动搜索)适合处理大量的数据,不适合实时用户请求,且每当应用程序重新发起一个新的scrollapi调用时,elasticsearch会从头开始返回数据,造成客户端接收重复的数据。直接使用elasticsearch提供的scrollapi会给应用程序带来了以下问题:无法确保在应用程序端可靠、按序、实时以及不重复地获取大批量的数据。



技术实现要素:

为了克服直接使用elasticsearch提供的scrollapi带来的无法可靠、按序、实时及不重复地获取大批量数据的问题,本发明提供一种数据获取方法及设备。

根据本发明的一个方面,提供一种数据获取方法,包括:

s1,将所设置的数据查询条件和对elasticsearch返回的数据进行解析的规则提供给预定义的数据获取组件;

s2,调用所述数据获取组件向搜索引擎elasticsearch发起滚屏查询请求,获取经过解析的搜索引擎elasticsearch对所述滚屏查询请求的返回结果。

其中,在步骤s1之前还包括:

s0,实现基于elasticsearchscrollapi的数据获取组件。

其中,所述数据获取组件具体包括:准备查询接口类和滚屏查询组件类;

所述准备查询接口类包括prepare方法和parseresult方法,所述prepare方法用于向数据获取组件提供开发人员设置的查询条件,所述parseresult方法用于向数据获取组件提供开发人员设置的对从搜索引擎elasticsearch中获取到的数据的解析规则;

所述滚屏查询组件类包括doscrollsearch方法,所述doscrollsearch方法用于以elasticsearchscrollapi的方式获取搜索引擎elasticsearch中的数据,所述doscrollsearch方法的入参为所述准备查询接口类的实例。

其中,步骤s1进一步包括:

s11,将所述准备查询接口类实例化,获得所述准备查询接口类的一个实例对象;

s12,将所述实例对象传递给所述滚屏查询组件的doscrollsearch方法。

其中,步骤s2进一步包括:

s21,在所述doscrollsearch方法中回调所述prepare方法获取开发人员设置的查询条件,向搜索引擎elasticsearch发起滚屏查询请求;

s22,当获取到搜索引擎elasticsearch对所述滚屏查询请求的返回结果时,回调所述parseresult方法对所述返回结果进行解析,获得经过解析的elasticsearch数据;

s23,返回所述经过解析的elasticsearch数据。

其中,所述滚屏查询请求包括:开发人员设置的查询条件、请求上下文id、offset查询参数以及上次访问的索引。

其中,在步骤s21中向搜索引擎elasticsearch发起滚屏查询请求的步骤之后,还包括:

使搜索引擎elasticsearch按照offset字段对数据进行升序排序。

其中,步骤s22还包括:

若获知搜索引擎elasticsearch根据所述请求上下文id获取不到该请求上下文所对应的数据,则向搜索引擎elasticsearch重新发起新的滚屏查询请求。

根据本发明的另一个方面,提供一种数据获取设备,包括存储器、处理器、以及总线,

所述处理器和存储器通过所述总线完成相互间的通信;

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述存储器中的程序指令,以执行如前所述的数据获取方法。

根据本发明的又一个方面,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如前所述的数据获取方法。

本发明提出的一种数据获取方法及设备,通过调用自定义的数据获取组件向搜索引擎elasticsearch获取大批量数据,使得数据获取较直接使用elasticsearch的scrollapi更加地可靠、有序、实时和不重复。

附图说明

图1为根据本发明一实施例提供的数据获取方法的流程示意图;

图2为根据本发明另一实施例提供的基于图1中步骤s2的流程示意图;

图3为本发明另一实施例提供的一种数据获取设备的结构示意图。

具体实施方式

下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。

如图1所示,为根据本发明一实施例提供的数据获取方法的流程示意图,包括:

s1,将所设置的数据查询条件和对elasticsearch返回的数据进行解析的规则提供给预定义的数据获取组件;

s2,调用所述数据获取组件向搜索引擎elasticsearch发起滚屏查询请求,获取经过解析的搜索引擎elasticsearch对所述滚屏查询请求的返回结果。

具体地,为了能够快速、连续且实时地从搜索引擎elasticsearch中获取大批量的数据用于具体的业务场景,应用程序可以通过调用预定义的数据获取组件向搜索引擎elasticsearch发起滚屏查询请求(scrollapi请求),由数据获取组件代替现有技术的scrollapi与搜索引擎elasticsearch进行交互,从而获取搜索引擎elasticsearch中符合查询条件的数据,并且数据获取组件会将所获取到的elasticsearch数据解析成具体业务场景所需要的类型对象。开发人员只需要在调用预定义的数据获取组件前,将所设置的数据查询条件和对elasticsearch返回的数据进行解析的规则提供给数据获取组件,就可以通过调用所述数据获取组件,获取到解析后的elasticsearch数据。

数据获取组件向搜索引擎elasticsearch发送的滚屏查询请求的内容是开发人员设置的querybuilder类型的查询条件,并在所述querybuilder类型查询条件的基础上添加offset(数据偏移值)查询参数、scrollid参数(请求上下文id)以及上次访问的索引,而现有的通过scrollapi发送的滚屏查询请求的内容通常只包括开发人员设置的查询条件。数据获取组件依赖scrollid参数保证数据获取的实时性和不重复性,依赖offset机制保证数据获取的有序性。

本发明实施例提供的一种数据获取方法,通过调用自定义的数据获取组件向搜索引擎elasticsearch获取大批量数据,使得数据获取较直接使用elasticsearch的scrollapi更加地可靠、有序、实时和不重复。

本发明另一实施例,在上述实施例的基础上,在步骤s1之前还包括:

s0,实现基于elasticsearchscrollapi的数据获取组件;

其中,所述数据获取组件具体包括:准备查询接口类和滚屏查询组件类;

所述准备查询接口类包括prepare方法和parseresult方法,所述prepare方法用于向数据获取组件提供开发人员设置的查询条件,所述parseresult方法用于向数据获取组件提供开发人员设置的对从搜索引擎elasticsearch中获取到的数据的解析规则;

所述滚屏查询组件类包括doscrollsearch方法,所述doscrollsearch方法用于以elasticsearchscrollapi的方式获取搜索引擎elasticsearch中的数据,所述doscrollsearch方法的入参为所述准备查询接口类的实例。

具体地,所述数据获取组件是基于elasticsearchscrollapi的,实现所述数据获取组件包括:构造准备查询接口类(ipreparesearch<t>接口类)和构造滚屏查询组件类(scrollsearchcomponent类)。

1)构造ipreparesearch<t>接口类

该接口的作用是提供给应用程序(开发人员)对查询条件进行设置、对从elasticsearch获取的数据的解析规则进行设置。

ipreparesearch<t>接口类的定义如下:

该接口类由两个方法构成,一个是prepare方法,该方法的作用是提供给应用的开发人员向数据获取组件提供准备查询条件。这里定义了searchrequestvo用于描述开发人员向数据获取组件提供的查询数据。另一个方法是parseresult方法,该方法提供给开发人员设置对从elasticsearch获取到的数据的解析规则,其中方法的入参source表示数据获取组件从elasticsearch获取到的一条数据,方法的返回值类型使用了泛型,由开发人员实现ipreparesearch<r>接口时提供,source的类型为map<string,object>类型,是比较原始的数据类型,开发人员最终需要的数据是具体业务场景所需要的类型对象,因此需要通过parseresult对获取到的elasticsearch数据进行解析。

searchrequestvo的定义如下:

其中,scrollid表示elasticsearch为每次的滚屏查询请求(scrollapi请求)创建的请求上下文id。当应用程序首次调用elasticsearch的scrollapi时,elasticsearch会为该应用程序创建一个请求上下文,该请求上下文具有一定的时效性,即在指定的时间后会过期。而在该请求上下文的有效时间内,应用程序再次调用elasticsearchscrollapi的请求时,只要将该scrollid传给elasticsearch,那么elasticsearch就会接着上次的查询结果,返回剩下的数据,从而保证了数据获取的不重复性。

scrollwindow表示的是elasticsearch为请求上下文设置的过期时间,单位是毫秒,180000是开发人员设置的过期时长,在此只是示例性的,还可以根据需要设定为其他的值,scrollwindow有默认值,若开发人员没有对scrollwindow的取值进行设置,则scrollwindow为默认值。

offset表示在上次请求上下文有效的时间内,应用程序所访问到的最近一次的数据偏移值,该offset的作用很重要,用于保证应用程序不会无序地获取elasticsearch中的数据。elasticsearch并不会为自动存储到其中的数据添加offset字段,也就是说我们的应用开发人员需要保证向elasticsearch集群存储的数据必须具offset字段,该字段的要求是全局唯一且单调递增。

querybuilder的类型由elasticsearch提供的java客户端库中的类定义,表示开发人员所构建的查询条件。

2)构造scrollsearchcomponent类

scrollsearchcomponent类是数据获取组件的核心类,开发人员通过该类的doscrollsearch方法最终以elasticsearchscrollapi的方式获取elasticsearch集群中的数据。以下是doscrollsearch方法的签名:

public<t>searchresponsevo<t>

doscrollsearch(ipreparesearch<t>preparesearch)

该方法的入参的类型是ipreparesearch<t>接口类型,doscrollsearch方法内部会回调preparesearch中的prepare方法以确定本次查询请求的查询参数,同时会自动的调用preparesearch中的parseresult方法对从elasticsearch中获取到的每条数据进行解析。最后返回给应用程序本地查询的结果,该查询结果由searchresponsevo进行定义,内容如下:

其中scrollid、offset以及scrollwindow和searchrequestvo类中的含义一致,这里的content表示调用preparesearch中的parseresult方法对elasticsearch数据进行解析后的数据。

本发明另一实施例,在上述实施例的基础上,步骤s1进一步包括:

s11,将所述准备查询接口类实例化,获得所述准备查询接口类的一个实例对象;

s12,将所述实例对象传递给所述滚屏查询组件类的doscrollsearch方法。

具体地,开发人员在实现数据获取组件后,在调用该数据获取组件向搜索引擎elasticsearch获取数据前,需要实现准备查询接口类(ipreparesearch<t>接口类),即将所述准备查询接口类实例化,获得所述准备查询接口类的一个实例,从而实现ipreparesearch<t>接口类的prepare方法和parseresult方法。开发人员通过prepare方法向数据获取组件提供根据业务的规则编写的查询条件,该查询条件是querybuilder类型,通过parseresult方法向数据获取组件提供如何将map<string,object>类型的数据转换成开发人员想要的领域模型类型。

步骤s12是指将所述实例对象作为滚屏查询组件类(scrollsearchcomponent类)的doscrollsearch方法的入参。

如图2所示,为本发明另一实施例,在上述实施例的基础上,步骤s2的流程示意图,包括:

s21,在所述doscrollsearch方法中回调所述prepare方法获取开发人员设置的查询条件,向搜索引擎elasticsearch发起滚屏查询请求;

s22,当获取到搜索引擎elasticsearch对所述滚屏查询请求的返回结果时,回调所述parseresult方法对所述返回结果进行解析,获得经过解析的elasticsearch数据;

s23,返回所述经过解析的elasticsearch数据。

具体地,调用预定义的数据获取组件向搜索引擎elasticsearch发起滚屏(scroll)查询请求,获取经过解析的搜索引擎elasticsearch对所述滚屏查询请求的返回结果的步骤包括:

数据获取组件通过回调prepare方法获取开发人员设置的查询请求,然后在组件内部向elasticsearch发起滚屏查询请求。由上述实施例可知,prepare方法的返回值类型为searchrequestvo,包含四个参数,即请求上下文id值scrollid、所述请求上下文id所表示的请求上下文的过期时长scrollwindow、最近一次获取到的数据的偏移值offset和开发人员设置的查询条件querybuilder。数据获取组件通过回调prepare方法,即可以获取到上述各参数。准备好查询条件后,数据获取组件向搜索引擎elasticsearch发起滚屏查询请求。

在数据获取组件第一次向搜索引擎elasticsearch发起滚屏查询请求时,scrollid和offset均为空或默认值,elasticsearch会创建一个具有时效性的请求上下文,并返回与该请求上下文相关联的scrollid。当elasticsearch查询结束向数据获取组件返回数据的同时,数据获取组件会保留此次获取到的最后一条数据的offset字段。当数据获取组件再次向搜索引擎发送同一滚屏查询请求时(即与之前的滚屏查询请求具有相同的scrollid值),如果该scrollid值仍然有效,那么elasticsearch就能够根据offset字段开始返回数据,从而保证了多次的滚屏查询请求所返回的数据是连续且不重复的。如果该scrollid所对应的请求上下文已经无效,那么elasticsearch会向数据获取组件提示该scrollid已经无效。

prepare方法中的scrollid和offset值,是通过数据获取组件与elasticsearch的之间交互而自动更新的。数据获取组件与elasticsearch之间的交互是通过elasticsearch提供的javaclient来实现的,该javaclient以tcp的形式访问elasticsearch服务器的端口。

当数据获取组件获取到elasticsearch对刚刚查询请求的返回结果时,该结果的数据类型是map<string,object>,数据获取组件会回调parseresult方法,即将未经过解析的elasticsearch返回的请求结果传递给parseresult方法,根据开发人员所设置的具体的解析规则解析所述请求结果。最后,数据获取组件将经过parseresult方法解析过的elasticsearch数据返回给调用者,即开发人员。

步骤s2的整个过程都是在scrollsearchcomponent类中doscrollsearch方法中进行的。

基于上述实施例,所述滚屏查询请求包括:开发人员设置的查询条件、请求上下文id、offset查询参数以及上次访问的索引。

滚屏查询请求的类型也是querybuilder类型,其内容是在开发人员设置的查询条件querybuilder的基础上,添加offset查询参数、scrollid参数以及上一次访问的索引,搜索引擎elasticsearch根据上述滚屏查询请求的内容在其服务器中查询符合查询条件的数据。

基于上述实施例,在步骤s21中向搜索引擎elasticsearch发起滚屏查询请求的步骤之后,还包括:

使搜索引擎elasticsearch按照offset字段对数据进行升序排序。

具体地,应用程序每次重新发起一个新的scrollapi调用,那么elasticsearch就会从头开始返回数据,这就会造成客户端接收重复的数据。为了解决这个问题,数据获取组件要求应用开发人员保证存储到elasticsearch中的数据必须含有offset字段,该字段需要全局唯一且单调递增(业内有很多方案可以实现该需求)。这样数据获取组件会在应用每次执行新的scrollapi调用请求后,都会要求elasticsearch对数据在offset字段上进行升序排序,并将获取到的数据集中的最后一条数据的offset字段保留下来,以此来保证新一轮的scrollapi请求是在上一次的scrollapi请求的基础上继续获取数据。

通过每次执行新的scrollapi请求时都要求elasticsearch对数据基于offset进行排序可以保证数据的顺序型。数据获取组件依赖elasticsearch和offset机制保证连续性和不重复性。

基于上述实施例,步骤s22还包括:

若获知搜索引擎elasticsearch根据所述请求上下文id获取不到该请求上下文所对应的数据,则向搜索引擎elasticsearch重新发起新的滚屏查询请求。

具体地,elasticsearchscrollapi请求返回的结果反映了初始search请求建立时索引的状态。它就像一个实时的快照,后续对文本的改变(插入,更新或者删除)都仅仅影响了后来的请求。也就是说elasticsearch在为新的scrollapi请求创建了请求上下文之后,在此之后的对elasticsearch新添加、删除、更新的数据都不会影响该请求上下文下的多次scroll请求。为了使数据获取组件在实时性上能够实现获取到在scroll请求上下文创建之后的新增加的数据,实现方式是数据获取组件如果获知搜索引擎elasticsearch通过scrollid获取不到该请求上下文所对应的数据(表明数据已经获取完了),则数据获取组件会向搜索引擎elasticsearch重新发起新一轮的滚屏查询请求。

如图3所述,为本发明另一实施例提供的一种数据获取设备的结构示意图,包括存储器31、处理器32、以及总线33,

所述处理器32和存储器31通过所述总线33完成相互间的通信;

所述存储器31存储有可被所述处理器32执行的程序指令,所述处理器32调用所述存储器31中的程序指令,以执行如上述各实施例所述的数据获取方法,例如包括:将所设置的数据查询条件和对elasticsearch返回的数据进行解析的规则提供给预定义的数据获取组件;调用所述数据获取组件向搜索引擎elasticsearch发起滚屏查询请求,获取经过解析的搜索引擎elasticsearch对所述滚屏查询请求的返回结果。

本发明又一实施例,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如上述各实施例所述的数据获取方法,例如包括:将所设置的数据查询条件和对elasticsearch返回的数据进行解析的规则提供给预定义的数据获取组件;调用所述数据获取组件向搜索引擎elasticsearch发起滚屏查询请求,获取经过解析的搜索引擎elasticsearch对所述滚屏查询请求的返回结果。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

以上所描述的数据获取设备的实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

本发明上述各实施例提出的数据获取方法及设备,通过调用自定义的数据获取组件向搜索引擎elasticsearch获取大批量数据,使得数据获取较直接使用elasticsearch的scrollapi更加地可靠、有序、实时和不重复。

最后,本发明的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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