一种数据传输方法与流程

文档序号:11524242阅读:578来源:国知局
本发明涉及数据处理领域,尤其涉及一种数据传输方法。
背景技术
::随着信息技术的飞速发展,基于数据处理和数据分析的应用受到广泛的欢迎和关注。大量信息源带来数据规模的爆发式增长,对海量数据进行复杂计算已经远远超过单台计算机的处理能力,由此推动了对分布式系统及其关键技术的研究。分布式计算中把需要进行复杂计算的海量数据切分成小块后分交由多台计算机并行处理,并将局部计算结果整合得出最终结果。分布式计算意味着需要将数据进行多次分发或转发,以将对应的数据流发送到对应的计算机或下流节点进行处理,因此,需要保证数据流分发的准确性,保证分布式计算的准确性、高效性。技术实现要素:本发明所要解决的技术问题在于提供一种数据传输方法,可以保证数据流分发的准确性,从而保证分布式计算的准确性、高效性。为解决上述技术问题,本发明采用如下技术方案:本发明实施例提供了一种数据传输方法,该数据传输方法包括:获取来自上游节点的输出数据流;根据数据流名将所述输出数据流进行持久化备份;根据所述输出数据流和下游节点的订阅关系,将所述输出数据流发送到与所述下游节点一一对应的共享内存队列上;发送所述共享内存队列内的数据流。优选的,与所述下游节点一一对应的所述共享内存队列是以所述下游节点命名的。优选的,该数据传输方法还包括:设置过期时长;记录对所述输出数据流进行持久化备份的开始时间;获取当前时间;若当前时间与开始时间之间的时间差大于或等于所述过期时长,则删除所述输出数据流。优选的,获取来自上游节点的输出数据流包括:监听指定端口,并将所述指定端口加入到epoll句柄中;当接收到来自上游节点的输出数据流名时,以阅读标志打开有名管道;将所述有名管道的文件描述符加入到epoll循环中;从所述有名管道中循环读取来自上游节点的输出数据流。优选的,根据数据流名将所述输出数据流进行持久化备份包括:所述共享内存队列中的数据项以key-value形式储存。优选的,所述key值是数据项的时间戳。优选的,发送所述共享内存队列内的所有数据流包括:将下游节点名封装成任务放入任务队列中;取出所述任务队列中的下游节点名,从相应的共享内存队列中取出数据;根据zookeeper中所述下游节点的配置发送数据。优选的,所述根据zookeeper中所述下游节点的配置发送数据包括:获取所述下游节点的流量设置;基于所述流量设置,发送数据。本发明提供了一种数据传输方法,当接收到来自上游节点的输出数据流时,可根据输出数据流名将数据流保存在磁盘上做持久化备份后,并按照输出数据流和下游节点的订阅关系,将输出流发送到以下游节点命名的共享内存队列上,统一发送给下游节点。使得在输出数据流时,更有针对性,同时具有更高的准确性。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例提供的数据传输方法的流程示意图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本发明实施例提供了一种数据传输方法,如图1所示,该数据传输方法包括:步骤s1、获取来自上游节点的输出数据流。具体的,在本发明实施例中,通过长期监听一个指定端口并加入到epoll句柄中,当接收到上游节点发送的输出数据流名(outstreamname)时,以阅读(read)标志打开有名管道(fifo管道),并将管道文件描述符加入到epoll循环中。步骤s2、根据数据流名将输出数据流进行持久化备份。为了增加框架的健壮性,在节点中添加了数据持久化模块,该模块充当磁盘队列的角色,它遵循队列先进先出(fifo)的语义。该模块把处理完毕的输出数据流保存在磁盘上。为了避免磁盘容量膨胀,持久化模块赋给每条数据项一定的过期时间并定期将它们从磁盘上删除。进行持久化备份有利于解决上下游节点处理数据流的速度不匹配的问题。特别是当上游节点的发送速度远大于下游节点的接收、处理速度时,会有大量的数据包在上游节点的缓冲区中堆积而无法发送,导致内存占用膨胀而使上游节点内部运行缓慢。持久化备份在上下游节点中间做了一层缓冲,有利于缓解上下游节点的处理速度有差异带来的问题。另外,为了提高分布式计算的处理速度,每一台计算机进行局部计算时,对数据流的切割、融合和处理都可在内存中完成,保证了极快的处理速度和响应速度。但是这也带来了弊端,即相对磁盘上“落地”的长期数据,内存数据是一种非稳定的数据,当其中的某一台计算机因故障重新启动或直接宕机时,内存中的数据将全部消失,在分布式计算中引起事故扩散,影响系统计算结果的准确性。进一步的,很多流式计算系统不支持断点续传的功能,因为假设了数据流一次性通过系统,当节点故障或者计算逻辑出错时,只能让原始的数据流重新通过系统再执行一次计算,不仅浪费了资源,特别是在数据流有唯一性且不可重现时,最后的输出结果将不包含这部分数据流,系统的准确性大大降低。因此,本发明实施例中,针对这一弊端加入了持久化备份,用以支持断点续传、差错重传的功能。本发明实施例中,持久化备份还可提供断点续传和差错重传的功能。在现有的数据流计算系统中,数据流一次性、完全地经过系统内存,由于数据无法恢复和重现,所以对故障非常敏感,容错性较差。这就要求参与数据传送的双方在正式传送数据流前进行一次协议,下游节点通知上游节点前一次数据流传送终止的位置。本发明实施例中可以通过定位传输协议用以定位数据流曾经的传输位置,并从持久化备份中取出相应位置的数据,从而实现数据流的恢复。具体的,在步骤s1的基础上,从指定管道中持续读取上游节点处理完毕的输出数据流,存入以输出数据流命名的磁盘队列中,进行持久化备份。磁盘队列中的数据项以key-value形式储存,key值是数据项的时间戳,这样方便差错重传时从硬盘队列中快速定位数据项。根据epoll异步读写的特点,实现一个状态机,一个简单的类似tcp/ip的数据传输协议,为数据的断点续传提供支持,保证数据的准确性和真实性。epoll是linux内核为处理大批量文件描述符而作了改进的poll,是linux下多路复用io接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核io事件异步唤醒而加入ready队列的描述符集合就行了。epoll除了提供select/poll那种io事件的水平触发(leveltriggered)外,还提供了边缘触发(edgetriggered),这就使得用户空间程序有可能缓存io状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。本发明实施例中,可通过开源软件tokyocabinet实现高效的磁盘队列,从而实现高效的持久化备份。tokyocabinet(简称tc)是一个用c语言编写的数据存储引擎,以key-value的方式存储数据,支持hash、b+tree、hashtable等多种数据结构,且读写速度极快。步骤s3、根据输出数据流和下游节点的订阅关系,将输出数据流发送到与下游节点一一对应的共享内存队列上。通过查询输出数据流与下游节点的订阅关系,将已经在磁盘队列中备份好的数据发送到以下游节点(node)命名的共享内存队列中,显然,每个下游节点都对应有唯一个共享内存队列。为了保证接收和发送数据时的一致性,本发明实施例中可将下游节点名封装成任务放到任务队列中,通过解析任务类型为“内部”(从上游节点接收数据为“外部”任务,从共享内存队列取数据是“内部”任务),取出任务中的下游节点名,从相应的共享内存队列中取出数据,并根据zookeeper中对应的下游节点的配置(ip)发送数据。共享消息队列也是类unix系统中进程间通信(ipc)的一种方式,多个进程可以读取或添加队列中的消息。共享消息队列是随内核持续的消息链表,其中的消息具有规定的格式、特定的类型和相应的优先级。步骤s4、发送共享内存队列内的数据流。找到共享内存队列内的数据流分别对应地下游节点之后,即可将共享内存队列内的数据发送。本发明实施例提供了一种数据传输方法,当接收到来自上游节点的输出数据流时,可根据输出数据流名将数据流保存在磁盘上做持久化备份后,并按照输出数据流和下游节点的订阅关系,将输出流发送到以下游节点命名的共享内存队列上,统一发送给下游节点。使得在输出数据流时,更有针对性,同时具有更高的准确性。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本
技术领域
:的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1