一种适用于流计算的数据调度方法与流程

文档序号:11519411阅读:374来源:国知局

本发明涉及数据处理技术领域,尤其涉及一种适用于流计算的数据调度方法。



背景技术:

随着信息技术的飞速发展,基于数据处理和数据分析的应用受到了广泛的欢迎和关注。大量信息源带来了数据规模的爆发式增长,因此对海量数据进行复杂计算已经远远超过单台计算机的处理能力,由此推动了对分布式系统及其关键技术的研究。

分布式计算中把需要进行复杂计算的海量数据切分成小块后分交由多台计算机并行处理,并将局部计算结果整合得出最终结果。在复杂、海量、异构的数据环境中,不仅包含静态的、离线的、结构化的数据,还有实时传输的、持续产生的、非结构化的数据。面对这些“无限”运动着的数据,如果不能对其进行高效率的实时处理,将错过数据流中携带的关键信息。整合来自多个异构数据源的“运动”数据,在其“运动”的过程执行复杂的逻辑处理,包括数值计算、数据挖掘和模型预测,实时地给出用户关心的结果,这是传统分布式计算模式所无法做到的。

在传统的数据调度方法中,数据往往独立于应用,由系统负责将数据集中存储到磁盘上的关系表里并基于该关系表进行调度,存储的数据是静态的、固定的集合。针对这种处理模式的应用虽然可能频繁查询,但因为操作的对象是持久和稳定的,因此传统的数据调度方式并不适用于流计算。



技术实现要素:

本发明所要解决的技术问题在于提供一种适用于流计算的数据调度方法。

为解决上述技术问题,本发明采用如下技术方案:

本发明提供了一种数据调度方法,包括:

实时获取数据流和待处理任务的订阅关系,建立与待处理任务一一对应的链表;

逐条读取来自数据管道的数据流;

根据所述订阅关系,将接收到的数据流放入对应的链表中;

基于链表,传输对应的数据流。

优选的,在实时获取数据流和待处理任务的订阅关系之前,还包括:

在特定端口监听连接请求;

当获取到预设信号,打开数据管道。

优选的,实时获取数据流和待处理任务的订阅关系包括:

获取处于就绪状态的待处理任务的优先级;

基于各处于就绪状态的待处理任务的优先级,对各处于就绪状态的待处理任务进行排位,获得优先级队列;

基于所述优先级队列,开启数个位于所述优先级队列前列的待处理任务;

实时获取数据流和所开启的待处理任务的订阅关系。

优选的,该数据调度方法还包括:

当检测到系统负载负荷超出预设负荷范围或抖动幅度超出预设幅度范围时,重新计算处于就绪状态的待处理任务的优先级。

优选的,该数据调度方法还包括:

根据系统负载自适应调整同时开启的待处理任务的数量。

优选的,同时开启的待处理任务的数量为t=c/p,其中,c为系统所具有的处理器的数量,p为密集计算所占的时间比重,其中,p为小于或等于1的任意实数。

优选的,将输出数据流和对应的输出数据流名进行存储。

优选的,待处理任务的优先级的影响因子包括待处理任务的重要程度、系统的运行状况和任务算子的类型。

本发明实施例提供了一种适用于流计算的数据调度方法,该方法根据待处理任务和数据流的实时的订阅关系,建立与待处理任务一一对应的链表,之后读取数据流,并将数据流存储入对应的链表中,最终将链表传输出去。由于链表是当需要使用时才根据待处理任务进行分配的,因此系统的硬件资源可以得到充分利用,并且这样的调度是动态的、非固定的集合,每个系统存储空间内的操作对象并非是持久和稳定的,这样的数据调度方法可适用于流计算。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的数据调度方法的流程示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供了一种适用于流计算的数据调度方法,如图1所示,该数据调度方法包括:

步骤s1、实时获取数据流和待处理任务的订阅关系,建立与待处理任务一一对应的链表。

实时获取数据流和待处理任务的订阅关系,可以实时了解到各待处理任务所需的数据流的数量、名称、所需容量的大小等要素,并实时建立与待处理任务一一对应的链表。如此,可以灵活地、充分地应用处理系统或处理器的硬件设备、配置,使得处理系统或处理器得到充分发挥。

具体的,可通过zookeeper这样一个分布式系统的可靠协调系统实时获取数据流和外部的待处理任务的订阅关系,实际上,一个待处理任务可能会依赖于多个输入数据流,多个待处理任务之间可能需要使用同一个数据流。其中,链表可以以待处理任务的名称进行命名以进行区分,或者也可对每一个链表赋予特定的标识符、一串数字编码之类,并建立链表与待处理任务的关系,从而建立与待处理任务一一对应的链表。

步骤s2、逐条读取来自数据管道的数据流。

为了读取来自数据管道的数据流,首先需要打开数据管道。为了使得数据管道只在有需要的时候开启,节省对硬件的占用时间,从而提高硬件的利用率,本发明实施例中,可首先在特定端口监听连接请求;当获取到预设的连接请求时,打开数据管道。

具体的,可采用每线程循环(oneloopperthread)模式,在特定端口监听连接请求,当收到来自上游的数据流名称时,代表上游已经按照数据流名称切分好一整个数据流,以读取(read)标志打开先入先出(firstinputfirstoutput,简称fifo)数据管道的读端,逐条读取其中的数据流。

步骤s3、根据订阅关系,将接收到的数据流放入对应的链表中。

步骤s4、基于链表,传输对应的数据流。

由于与待处理任务对应的数据流已经放入对应的链表中,因此,可以直接传输链表,相当于把对应待处理任务整合好的数据包进行传输,方便且能保证数据的完整性。

进一步的,为了防止数据包在传输的过程中出错,使得数据丢失。本发明实施例中,还可将输出的数据流和对应的数据流名进行存储,这样一旦数据流在传输的过程中丢失,可以调取存储记录,再次发送数据流,保证了数据调度的完整性。

需要说明的是,当用很小的流量使cpu满负荷或者用很小的cpu占用率使流量占满网卡时,多线程并不能带来系统性能的提升,反而会带来线程间切换、cpu争用的性能损耗。但当输入/输出操作和cpu计算在时间上“重叠”时,多线程可以有效地降低系统延时。如果仅靠单线程既要负责接收输入的数据流,又要负责逻辑计算,必然会因为耗时的输入/输出操作使处理任务等待,cpu闲置,增加响应延迟。

因此本发明实施例中,可同时针对多个待处理任务进行数据调度。但当待处理任务过多时,受到硬件配置的制约,无法同时处理所有的待处理任务,因此,可对所有待处理任务进行优先级的计算、排序,优先处理优先级较高的多个待处理任务。

由于每一次完成优先级的计算、排序过后,都需要重新提取优先级较高的待处理任务,即对对应的待处理任务分配处理时间片。由于每个待处理任务肚饿时间片不是一致的,这增大了处理难度。因此,本发明实施例中,对待处理任务的优先级的计算、排序不是周期性进行的。因为当系统运行稳定、各项指标没有明显波动、任务算子没有变更、输入数据源的流速平稳时,没有必要周期性地重新计算待处理任务的优先级并重排优先级队列,这样做反而会给节点带来额外的负荷,此外,重新分配时间片会导致原本连续执行的任务被中断,增大了响应延时。只有当系统负载负荷较重、抖动较大,预计会影响任务执行效率时,优先级的重新计算和任务的重新调度才是有必要的。

其中,优先级的影响因子包括该待处理任务的重要程度、节点的运行状况、任务算子的类型等等。

具体的,可同时处理多少个待处理任务可根据需要根据系统负载自适应调整,即系统在处理待处理任务时,密集计算所占的时间比重为p(0<p<=1),而系统一共有c个cpu,为了让这c个cpu均参与执行而又不过载,同时开启的待处理任务的数量为t=c/p。

对这一策略进行边界条件验证:假设c=8,p=1.0,待处理任务完全是密集计算,则t=8。因为同时处理8个待处理任务就能让8个cpu饱和,cpu资源己经用尽,更多的并行处理的待处理任务并不能提高效率。假设c=8,p=0.5,执行待处理任务时的计算一半是cpu密集型,一半是i/o密集型,则t=16。考虑操作系统能灵活合理地调度睡眠(sleeping)/写磁盘(writing)/执行(running)线程,那么大概16个“50%繁忙的线程”能让8个cpu满负荷运转,启动更多的线程并不能提高吞吐量,反而因为增加上下文切换的开销而降低性能。t可以取一个固定值,比如5*c。

综上所述,本发明实施例提供了一种适用于流计算的数据调度方法,该方法根据待处理任务和数据流的实时的订阅关系,建立与待处理任务一一对应的链表,之后读取数据流,并将数据流存储入对应的链表中,最终将链表传输出去。由于链表是当需要使用时才根据待处理任务进行分配的,因此系统的硬件资源可以得到充分利用,并且这样的调度是动态的、非固定的集合,每个系统存储空间内的操作对象并非是持久和稳定的,这样的数据调度方法可适用于流计算。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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