本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種數(shù)據(jù)傳輸方法。
背景技術(shù):
::隨著信息技術(shù)的飛速發(fā)展,基于數(shù)據(jù)處理和數(shù)據(jù)分析的應(yīng)用受到廣泛的歡迎和關(guān)注。大量信息源帶來(lái)數(shù)據(jù)規(guī)模的爆發(fā)式增長(zhǎng),對(duì)海量數(shù)據(jù)進(jìn)行復(fù)雜計(jì)算已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)單臺(tái)計(jì)算機(jī)的處理能力,由此推動(dòng)了對(duì)分布式系統(tǒng)及其關(guān)鍵技術(shù)的研究。分布式計(jì)算中把需要進(jìn)行復(fù)雜計(jì)算的海量數(shù)據(jù)切分成小塊后分交由多臺(tái)計(jì)算機(jī)并行處理,并將局部計(jì)算結(jié)果整合得出最終結(jié)果。分布式計(jì)算意味著需要將數(shù)據(jù)進(jìn)行多次分發(fā)或轉(zhuǎn)發(fā),以將對(duì)應(yīng)的數(shù)據(jù)流發(fā)送到對(duì)應(yīng)的計(jì)算機(jī)或下流節(jié)點(diǎn)進(jìn)行處理,因此,需要保證數(shù)據(jù)流分發(fā)的準(zhǔn)確性,保證分布式計(jì)算的準(zhǔn)確性、高效性。技術(shù)實(shí)現(xiàn)要素:本發(fā)明所要解決的技術(shù)問(wèn)題在于提供一種數(shù)據(jù)傳輸方法,可以保證數(shù)據(jù)流分發(fā)的準(zhǔn)確性,從而保證分布式計(jì)算的準(zhǔn)確性、高效性。為解決上述技術(shù)問(wèn)題,本發(fā)明采用如下技術(shù)方案:本發(fā)明實(shí)施例提供了一種數(shù)據(jù)傳輸方法,該數(shù)據(jù)傳輸方法包括:獲取來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流;根據(jù)數(shù)據(jù)流名將所述輸出數(shù)據(jù)流進(jìn)行持久化備份;根據(jù)所述輸出數(shù)據(jù)流和下游節(jié)點(diǎn)的訂閱關(guān)系,將所述輸出數(shù)據(jù)流發(fā)送到與所述下游節(jié)點(diǎn)一一對(duì)應(yīng)的共享內(nèi)存隊(duì)列上;發(fā)送所述共享內(nèi)存隊(duì)列內(nèi)的數(shù)據(jù)流。優(yōu)選的,與所述下游節(jié)點(diǎn)一一對(duì)應(yīng)的所述共享內(nèi)存隊(duì)列是以所述下游節(jié)點(diǎn)命名的。優(yōu)選的,該數(shù)據(jù)傳輸方法還包括:設(shè)置過(guò)期時(shí)長(zhǎng);記錄對(duì)所述輸出數(shù)據(jù)流進(jìn)行持久化備份的開(kāi)始時(shí)間;獲取當(dāng)前時(shí)間;若當(dāng)前時(shí)間與開(kāi)始時(shí)間之間的時(shí)間差大于或等于所述過(guò)期時(shí)長(zhǎng),則刪除所述輸出數(shù)據(jù)流。優(yōu)選的,獲取來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流包括:監(jiān)聽(tīng)指定端口,并將所述指定端口加入到epoll句柄中;當(dāng)接收到來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流名時(shí),以閱讀標(biāo)志打開(kāi)有名管道;將所述有名管道的文件描述符加入到epoll循環(huán)中;從所述有名管道中循環(huán)讀取來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流。優(yōu)選的,根據(jù)數(shù)據(jù)流名將所述輸出數(shù)據(jù)流進(jìn)行持久化備份包括:所述共享內(nèi)存隊(duì)列中的數(shù)據(jù)項(xiàng)以key-value形式儲(chǔ)存。優(yōu)選的,所述key值是數(shù)據(jù)項(xiàng)的時(shí)間戳。優(yōu)選的,發(fā)送所述共享內(nèi)存隊(duì)列內(nèi)的所有數(shù)據(jù)流包括:將下游節(jié)點(diǎn)名封裝成任務(wù)放入任務(wù)隊(duì)列中;取出所述任務(wù)隊(duì)列中的下游節(jié)點(diǎn)名,從相應(yīng)的共享內(nèi)存隊(duì)列中取出數(shù)據(jù);根據(jù)zookeeper中所述下游節(jié)點(diǎn)的配置發(fā)送數(shù)據(jù)。優(yōu)選的,所述根據(jù)zookeeper中所述下游節(jié)點(diǎn)的配置發(fā)送數(shù)據(jù)包括:獲取所述下游節(jié)點(diǎn)的流量設(shè)置;基于所述流量設(shè)置,發(fā)送數(shù)據(jù)。本發(fā)明提供了一種數(shù)據(jù)傳輸方法,當(dāng)接收到來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流時(shí),可根據(jù)輸出數(shù)據(jù)流名將數(shù)據(jù)流保存在磁盤(pán)上做持久化備份后,并按照輸出數(shù)據(jù)流和下游節(jié)點(diǎn)的訂閱關(guān)系,將輸出流發(fā)送到以下游節(jié)點(diǎn)命名的共享內(nèi)存隊(duì)列上,統(tǒng)一發(fā)送給下游節(jié)點(diǎn)。使得在輸出數(shù)據(jù)流時(shí),更有針對(duì)性,同時(shí)具有更高的準(zhǔn)確性。附圖說(shuō)明為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明實(shí)施例提供的數(shù)據(jù)傳輸方法的流程示意圖。具體實(shí)施方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本發(fā)明實(shí)施例提供了一種數(shù)據(jù)傳輸方法,如圖1所示,該數(shù)據(jù)傳輸方法包括:步驟s1、獲取來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流。具體的,在本發(fā)明實(shí)施例中,通過(guò)長(zhǎng)期監(jiān)聽(tīng)一個(gè)指定端口并加入到epoll句柄中,當(dāng)接收到上游節(jié)點(diǎn)發(fā)送的輸出數(shù)據(jù)流名(outstreamname)時(shí),以閱讀(read)標(biāo)志打開(kāi)有名管道(fifo管道),并將管道文件描述符加入到epoll循環(huán)中。步驟s2、根據(jù)數(shù)據(jù)流名將輸出數(shù)據(jù)流進(jìn)行持久化備份。為了增加框架的健壯性,在節(jié)點(diǎn)中添加了數(shù)據(jù)持久化模塊,該模塊充當(dāng)磁盤(pán)隊(duì)列的角色,它遵循隊(duì)列先進(jìn)先出(fifo)的語(yǔ)義。該模塊把處理完畢的輸出數(shù)據(jù)流保存在磁盤(pán)上。為了避免磁盤(pán)容量膨脹,持久化模塊賦給每條數(shù)據(jù)項(xiàng)一定的過(guò)期時(shí)間并定期將它們從磁盤(pán)上刪除。進(jìn)行持久化備份有利于解決上下游節(jié)點(diǎn)處理數(shù)據(jù)流的速度不匹配的問(wèn)題。特別是當(dāng)上游節(jié)點(diǎn)的發(fā)送速度遠(yuǎn)大于下游節(jié)點(diǎn)的接收、處理速度時(shí),會(huì)有大量的數(shù)據(jù)包在上游節(jié)點(diǎn)的緩沖區(qū)中堆積而無(wú)法發(fā)送,導(dǎo)致內(nèi)存占用膨脹而使上游節(jié)點(diǎn)內(nèi)部運(yùn)行緩慢。持久化備份在上下游節(jié)點(diǎn)中間做了一層緩沖,有利于緩解上下游節(jié)點(diǎn)的處理速度有差異帶來(lái)的問(wèn)題。另外,為了提高分布式計(jì)算的處理速度,每一臺(tái)計(jì)算機(jī)進(jìn)行局部計(jì)算時(shí),對(duì)數(shù)據(jù)流的切割、融合和處理都可在內(nèi)存中完成,保證了極快的處理速度和響應(yīng)速度。但是這也帶來(lái)了弊端,即相對(duì)磁盤(pán)上“落地”的長(zhǎng)期數(shù)據(jù),內(nèi)存數(shù)據(jù)是一種非穩(wěn)定的數(shù)據(jù),當(dāng)其中的某一臺(tái)計(jì)算機(jī)因故障重新啟動(dòng)或直接宕機(jī)時(shí),內(nèi)存中的數(shù)據(jù)將全部消失,在分布式計(jì)算中引起事故擴(kuò)散,影響系統(tǒng)計(jì)算結(jié)果的準(zhǔn)確性。進(jìn)一步的,很多流式計(jì)算系統(tǒng)不支持?jǐn)帱c(diǎn)續(xù)傳的功能,因?yàn)榧僭O(shè)了數(shù)據(jù)流一次性通過(guò)系統(tǒng),當(dāng)節(jié)點(diǎn)故障或者計(jì)算邏輯出錯(cuò)時(shí),只能讓原始的數(shù)據(jù)流重新通過(guò)系統(tǒng)再執(zhí)行一次計(jì)算,不僅浪費(fèi)了資源,特別是在數(shù)據(jù)流有唯一性且不可重現(xiàn)時(shí),最后的輸出結(jié)果將不包含這部分?jǐn)?shù)據(jù)流,系統(tǒng)的準(zhǔn)確性大大降低。因此,本發(fā)明實(shí)施例中,針對(duì)這一弊端加入了持久化備份,用以支持?jǐn)帱c(diǎn)續(xù)傳、差錯(cuò)重傳的功能。本發(fā)明實(shí)施例中,持久化備份還可提供斷點(diǎn)續(xù)傳和差錯(cuò)重傳的功能。在現(xiàn)有的數(shù)據(jù)流計(jì)算系統(tǒng)中,數(shù)據(jù)流一次性、完全地經(jīng)過(guò)系統(tǒng)內(nèi)存,由于數(shù)據(jù)無(wú)法恢復(fù)和重現(xiàn),所以對(duì)故障非常敏感,容錯(cuò)性較差。這就要求參與數(shù)據(jù)傳送的雙方在正式傳送數(shù)據(jù)流前進(jìn)行一次協(xié)議,下游節(jié)點(diǎn)通知上游節(jié)點(diǎn)前一次數(shù)據(jù)流傳送終止的位置。本發(fā)明實(shí)施例中可以通過(guò)定位傳輸協(xié)議用以定位數(shù)據(jù)流曾經(jīng)的傳輸位置,并從持久化備份中取出相應(yīng)位置的數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)流的恢復(fù)。具體的,在步驟s1的基礎(chǔ)上,從指定管道中持續(xù)讀取上游節(jié)點(diǎn)處理完畢的輸出數(shù)據(jù)流,存入以輸出數(shù)據(jù)流命名的磁盤(pán)隊(duì)列中,進(jìn)行持久化備份。磁盤(pán)隊(duì)列中的數(shù)據(jù)項(xiàng)以key-value形式儲(chǔ)存,key值是數(shù)據(jù)項(xiàng)的時(shí)間戳,這樣方便差錯(cuò)重傳時(shí)從硬盤(pán)隊(duì)列中快速定位數(shù)據(jù)項(xiàng)。根據(jù)epoll異步讀寫(xiě)的特點(diǎn),實(shí)現(xiàn)一個(gè)狀態(tài)機(jī),一個(gè)簡(jiǎn)單的類似tcp/ip的數(shù)據(jù)傳輸協(xié)議,為數(shù)據(jù)的斷點(diǎn)續(xù)傳提供支持,保證數(shù)據(jù)的準(zhǔn)確性和真實(shí)性。epoll是linux內(nèi)核為處理大批量文件描述符而作了改進(jìn)的poll,是linux下多路復(fù)用io接口select/poll的增強(qiáng)版本,它能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)cpu利用率。另一點(diǎn)原因就是獲取事件的時(shí)候,它無(wú)須遍歷整個(gè)被偵聽(tīng)的描述符集,只要遍歷那些被內(nèi)核io事件異步喚醒而加入ready隊(duì)列的描述符集合就行了。epoll除了提供select/poll那種io事件的水平觸發(fā)(leveltriggered)外,還提供了邊緣觸發(fā)(edgetriggered),這就使得用戶空間程序有可能緩存io狀態(tài),減少epoll_wait/epoll_pwait的調(diào)用,提高應(yīng)用程序效率。本發(fā)明實(shí)施例中,可通過(guò)開(kāi)源軟件tokyocabinet實(shí)現(xiàn)高效的磁盤(pán)隊(duì)列,從而實(shí)現(xiàn)高效的持久化備份。tokyocabinet(簡(jiǎn)稱tc)是一個(gè)用c語(yǔ)言編寫(xiě)的數(shù)據(jù)存儲(chǔ)引擎,以key-value的方式存儲(chǔ)數(shù)據(jù),支持hash、b+tree、hashtable等多種數(shù)據(jù)結(jié)構(gòu),且讀寫(xiě)速度極快。步驟s3、根據(jù)輸出數(shù)據(jù)流和下游節(jié)點(diǎn)的訂閱關(guān)系,將輸出數(shù)據(jù)流發(fā)送到與下游節(jié)點(diǎn)一一對(duì)應(yīng)的共享內(nèi)存隊(duì)列上。通過(guò)查詢輸出數(shù)據(jù)流與下游節(jié)點(diǎn)的訂閱關(guān)系,將已經(jīng)在磁盤(pán)隊(duì)列中備份好的數(shù)據(jù)發(fā)送到以下游節(jié)點(diǎn)(node)命名的共享內(nèi)存隊(duì)列中,顯然,每個(gè)下游節(jié)點(diǎn)都對(duì)應(yīng)有唯一個(gè)共享內(nèi)存隊(duì)列。為了保證接收和發(fā)送數(shù)據(jù)時(shí)的一致性,本發(fā)明實(shí)施例中可將下游節(jié)點(diǎn)名封裝成任務(wù)放到任務(wù)隊(duì)列中,通過(guò)解析任務(wù)類型為“內(nèi)部”(從上游節(jié)點(diǎn)接收數(shù)據(jù)為“外部”任務(wù),從共享內(nèi)存隊(duì)列取數(shù)據(jù)是“內(nèi)部”任務(wù)),取出任務(wù)中的下游節(jié)點(diǎn)名,從相應(yīng)的共享內(nèi)存隊(duì)列中取出數(shù)據(jù),并根據(jù)zookeeper中對(duì)應(yīng)的下游節(jié)點(diǎn)的配置(ip)發(fā)送數(shù)據(jù)。共享消息隊(duì)列也是類unix系統(tǒng)中進(jìn)程間通信(ipc)的一種方式,多個(gè)進(jìn)程可以讀取或添加隊(duì)列中的消息。共享消息隊(duì)列是隨內(nèi)核持續(xù)的消息鏈表,其中的消息具有規(guī)定的格式、特定的類型和相應(yīng)的優(yōu)先級(jí)。步驟s4、發(fā)送共享內(nèi)存隊(duì)列內(nèi)的數(shù)據(jù)流。找到共享內(nèi)存隊(duì)列內(nèi)的數(shù)據(jù)流分別對(duì)應(yīng)地下游節(jié)點(diǎn)之后,即可將共享內(nèi)存隊(duì)列內(nèi)的數(shù)據(jù)發(fā)送。本發(fā)明實(shí)施例提供了一種數(shù)據(jù)傳輸方法,當(dāng)接收到來(lái)自上游節(jié)點(diǎn)的輸出數(shù)據(jù)流時(shí),可根據(jù)輸出數(shù)據(jù)流名將數(shù)據(jù)流保存在磁盤(pán)上做持久化備份后,并按照輸出數(shù)據(jù)流和下游節(jié)點(diǎn)的訂閱關(guān)系,將輸出流發(fā)送到以下游節(jié)點(diǎn)命名的共享內(nèi)存隊(duì)列上,統(tǒng)一發(fā)送給下游節(jié)點(diǎn)。使得在輸出數(shù)據(jù)流時(shí),更有針對(duì)性,同時(shí)具有更高的準(zhǔn)確性。以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本
技術(shù)領(lǐng)域:
:的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以所述權(quán)利要求的保護(hù)范圍為準(zhǔn)。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12