亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于Storm流式計算框架多并發(fā)寫文件的方法及系統(tǒng)與流程

文檔序號:11949461閱讀:306來源:國知局
一種基于Storm流式計算框架多并發(fā)寫文件的方法及系統(tǒng)與流程

本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種基于Storm流式計算框架多并發(fā)寫文件的方法及系統(tǒng)。



背景技術(shù):

Storm是一個免費(fèi)、開源的分布式實(shí)時流計算框架,在Storm中,一個實(shí)時計算應(yīng)用程序的邏輯被封裝在一個稱為Topology的對象中,也稱為計算拓?fù)洌谶壿嬌希粋€Topology是由消息獲取任務(wù)線程和消息處理任務(wù)線程通過流分組連接成有向無環(huán)圖的圖狀結(jié)構(gòu),消息獲取任務(wù)線程在Topology中充當(dāng)消息發(fā)送者的角色,而消息處理任務(wù)線程充當(dāng)消息處理的角色,消息獲取任務(wù)線程從Topology外部獲取消息并將消息發(fā)送給消息處理任務(wù)線程。一些業(yè)務(wù)場景中,將Storm中的消息寫入文件的邏輯主要是在消息處理任務(wù)線程組件中實(shí)現(xiàn)的,為了保證Storm集群處理消息的速度和吞吐量,需要調(diào)整該消息處理任務(wù)線程組件的并行度來改變消息寫入文件的速度,如此,將造成文件的數(shù)量太多和文件大小不一,不利于文件的管理,如果在該消息處理任務(wù)線程組件中,實(shí)現(xiàn)多并發(fā)寫同一個文件,一般需要使用同步鎖機(jī)制來保證文件中消息的正確性和完整性,但同步鎖會嚴(yán)重影響Storm集群的性能,降低寫文件效率。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明要解決的技術(shù)問題之一,在于提供一種基于Storm流式計算框架多并發(fā)寫文件的方法,提高寫文件的速度,提高Storm集群處理消息的速度。

本發(fā)明要解決的技術(shù)問題之一是這樣實(shí)現(xiàn)的:一種基于Storm流式計算框架多并發(fā)寫文件的方法,包括如下步驟:

步驟1、利用消息獲取任務(wù)線程采集原始消息,并將所述原始消息以數(shù)組形式發(fā)送給消息處理任務(wù)線程中任一一個線程;

步驟2、通過消息處理任務(wù)線程對獲取到的消息進(jìn)行處理,得到處理后的消息,并將處理后的消息寫入同一隊(duì)列中;

步驟3、通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,通過所述隊(duì)列處理線程獲取隊(duì)列中的消息按批次發(fā)送給一異步線程池;

步驟4、通過異步線程池根據(jù)所述隊(duì)列處理線程傳來的數(shù)據(jù)使用異步方式寫文件,所述異步線程池包括復(fù)數(shù)個寫文件線程,且每一寫文件線程對應(yīng)寫一個文件塊。

進(jìn)一步的,在所述消息處理任務(wù)線程初始化的時候,以單例模式一起啟動隊(duì)列處理線程,保證一個工作進(jìn)程中對應(yīng)一個隊(duì)列。

進(jìn)一步的,所述步驟3進(jìn)一步包括:

步驟31、通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,所述批次大小為消息條數(shù);

步驟32、通過所述隊(duì)列處理線程實(shí)時監(jiān)聽隊(duì)列,當(dāng)監(jiān)聽到隊(duì)列中有消息時,根據(jù)結(jié)束位置和文件大小判斷是否需要創(chuàng)建新的文件路徑,若結(jié)束位置大于或等于文件大小,則新建一個文件路徑,并將起始位置和結(jié)束位置置為0,進(jìn)入步驟33,否則,直接進(jìn)入步驟33;

步驟33、創(chuàng)建一個空的集合類,所述集合類的默認(rèn)大小設(shè)為批次大小,用于存儲每一批次的消息;

步驟34、通過所述隊(duì)列處理線程循環(huán)地從隊(duì)列中獲取消息存放在集合類里,同時根據(jù)添加的消息修改結(jié)束位置,直至集合類的消息數(shù)大于批次大小或者結(jié)束位置不小于文件大小或者隊(duì)列為空,結(jié)束循環(huán),進(jìn)入步驟35;

步驟35、判斷所述集合類是否為空,若是,則返回步驟32,否則,通過所述隊(duì)列處理線程將文件路徑、集合類、起始位置作為參數(shù)傳遞給異步線程池,修改起始位置為結(jié)束位置。

進(jìn)一步的,所述步驟4具體為:通過異步線程池中空閑的寫文件線程獲取所述隊(duì)列處理線程傳遞的集合類和文件路徑,并根據(jù)起始位置將集合類中的消息寫入到所給文件對應(yīng)的文件塊位置,所述文件塊大小為集合類中所有消息的大小,所述集合類用于存放每一批次消息。

本發(fā)明要解決的技術(shù)問題之二,在于提供一種基于Storm流式計算框架多并發(fā)寫文件的系統(tǒng),提高寫文件的速度,提高Storm集群處理消息的速度。

本發(fā)明要解決的技術(shù)問題之二是這樣實(shí)現(xiàn)的:一種基于Storm流式計算框架多并發(fā)寫文件的系統(tǒng),包括一消息采集模塊、一隊(duì)列存儲模塊、一批次處理模塊和一異步寫文件模塊:

所述消息采集模塊,用于利用消息獲取任務(wù)線程采集原始消息,并將所述原始消息以數(shù)組形式發(fā)送給消息處理任務(wù)線程中任一一個線程;

所述隊(duì)列存儲模塊,用于通過消息處理任務(wù)線程對獲取到的消息進(jìn)行處理,得到處理后的消息,并將處理后的消息寫入同一隊(duì)列中;

所述批次處理模塊,用于通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,通過所述隊(duì)列處理線程獲取隊(duì)列中的消息按批次發(fā)送給一異步線程池;

所述異步寫文件模塊,用于通過異步線程池根據(jù)所述隊(duì)列處理線程傳來的數(shù)據(jù)使用異步方式寫文件,所述異步線程池包括復(fù)數(shù)個寫文件線程,且每一寫文件線程對應(yīng)寫一個文件塊。

進(jìn)一步的,在所述消息處理任務(wù)線程初始化的時候,以單例模式一起啟動隊(duì)列處理線程,保證一個工作進(jìn)程中對應(yīng)一個隊(duì)列。

進(jìn)一步的,所述批次處理模塊進(jìn)一步包括:

一初始化參數(shù)模塊,用于通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,所述批次大小為消息條數(shù);

一監(jiān)聽模塊,用于通過所述隊(duì)列處理線程實(shí)時監(jiān)聽隊(duì)列,當(dāng)監(jiān)聽到隊(duì)列中有消息時,根據(jù)結(jié)束位置和文件大小判斷是否需要創(chuàng)建新的文件路徑,若結(jié)束位置大于或等于文件大小,則新建一個文件路徑,并將起始位置和結(jié)束位置置為0,執(zhí)行集合類創(chuàng)建模塊,否則,直接執(zhí)行集合類創(chuàng)建模塊;

一集合類創(chuàng)建模塊,用于創(chuàng)建一個空的集合類,所述集合類的默認(rèn)大小設(shè)為批次大小,用于存儲每一批次的消息;

一消息存儲模塊,用于通過所述隊(duì)列處理線程循環(huán)地從隊(duì)列中獲取消息存放在集合類里,同時根據(jù)添加的消息修改結(jié)束位置,直至集合類的消息數(shù)大于批次大小或者結(jié)束位置不小于文件大小或者隊(duì)列為空,結(jié)束循環(huán),執(zhí)行發(fā)送模塊;以及

一發(fā)送模塊,用于判斷所述集合類是否為空,若是,則返回執(zhí)行監(jiān)聽模塊,否則,通過所述隊(duì)列處理線程將文件路徑、集合類、起始位置作為參數(shù)傳遞給異步線程池,修改起始位置為結(jié)束位置。

進(jìn)一步的,所述異步寫文件模塊具體為:通過異步線程池中空閑的寫文件線程獲取所述隊(duì)列處理線程傳遞的集合類和文件路徑,并根據(jù)起始位置將集合類中的消息寫入到所給文件對應(yīng)的文件塊位置,所述文件塊大小為集合類中所有消息的大小,所述集合類用于存放每一批次消息。

本發(fā)明具有如下優(yōu)點(diǎn):保證生成大小固定的文件,確保文件內(nèi)容有序,使得文件命名規(guī)則有序;不影響Storm原有的性能,提高Storm集群處理消息的速度,提高寫文件的速度,同時減少了消息處理任務(wù)線程組件生產(chǎn)文件的個數(shù),使生成的文件便于管理和控制。

附圖說明

下面參照附圖結(jié)合實(shí)施例對本發(fā)明作進(jìn)一步的說明。

圖1為本發(fā)明一種基于Storm流式計算框架多并發(fā)寫文件的方法執(zhí)行流程圖。

圖2為本發(fā)明一種基于Storm流式計算框架多并發(fā)寫文件的系統(tǒng)邏輯示意圖。

圖3為本發(fā)明一種基于Storm流式計算框架多并發(fā)寫文件原理示意圖。

具體實(shí)施方式

如圖1和圖3所示,一種基于Storm流式計算框架多并發(fā)寫文件的方法,包括如下步驟:

步驟1、利用消息獲取任務(wù)線程采集原始消息,并將所述原始消息以數(shù)組形式發(fā)送給消息處理任務(wù)線程中任一一個線程;

步驟2、通過消息處理任務(wù)線程對獲取到的消息進(jìn)行處理,得到處理后的消息,并將處理后的消息寫入同一隊(duì)列中,且在所述消息處理任務(wù)線程初始化的時候,以單例模式一起啟動隊(duì)列處理線程,保證一個工作進(jìn)程中對應(yīng)一個隊(duì)列;

步驟3、通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,通過所述隊(duì)列處理線程獲取隊(duì)列中的消息按批次發(fā)送給一異步線程池;所述步驟3進(jìn)一步包括步驟31至步驟35:

步驟31、通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,所述批次大小為消息條數(shù);

步驟32、通過所述隊(duì)列處理線程實(shí)時監(jiān)聽隊(duì)列,當(dāng)監(jiān)聽到隊(duì)列中有消息時,根據(jù)結(jié)束位置和文件大小判斷是否需要創(chuàng)建新的文件路徑,若結(jié)束位置大于或等于文件大小,則新建一個文件路徑,并將起始位置和結(jié)束位置置為0,進(jìn)入步驟33,否則,直接進(jìn)入步驟33;

步驟33、創(chuàng)建一個空的集合類,所述集合類的默認(rèn)大小設(shè)為批次大小,用于存儲每一批次的消息;

步驟34、通過所述隊(duì)列處理線程循環(huán)地從隊(duì)列中獲取消息存放在集合類里,同時根據(jù)添加的消息修改結(jié)束位置,直至集合類的消息數(shù)大于批次大小或者結(jié)束位置不小于文件大小或者隊(duì)列為空,結(jié)束循環(huán),進(jìn)入步驟35;

步驟35、判斷所述集合類是否為空,若是,則返回步驟32,否則,通過所述隊(duì)列處理線程將文件路徑、集合類、起始位置作為參數(shù)傳遞給異步線程池,修改起始位置為結(jié)束位置;

步驟4、通過異步線程池根據(jù)所述隊(duì)列處理線程傳來的數(shù)據(jù)使用異步方式寫文件,所述異步線程池包括復(fù)數(shù)個寫文件線程,且每一寫文件線程對應(yīng)寫一個文件塊,所述步驟4具體為:通過異步線程池中空閑的寫文件線程獲取所述隊(duì)列處理線程傳遞的集合類和文件路徑,并根據(jù)起始位置將集合類中的消息寫入到所給文件對應(yīng)的文件塊位置,所述文件塊大小為集合類中所有消息的大小,所述集合類用于存放每一批次消息。

如圖2和圖3所示,一種基于Storm流式計算框架多并發(fā)寫文件的系統(tǒng),包括一消息采集模塊、一隊(duì)列存儲模塊、一批次處理模塊和一異步寫文件模塊:

所述消息采集模塊,用于利用消息獲取任務(wù)線程采集原始消息,并將所述原始消息以數(shù)組形式發(fā)送給消息處理任務(wù)線程中任一一個線程;

所述隊(duì)列存儲模塊,用于通過消息處理任務(wù)線程對獲取到的消息進(jìn)行處理,得到處理后的消息,并將處理后的消息寫入同一隊(duì)列中,在所述消息處理任務(wù)線程初始化的時候,以單例模式一起啟動隊(duì)列處理線程,保證一個工作進(jìn)程中對應(yīng)一個隊(duì)列;

所述批次處理模塊,用于通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,通過所述隊(duì)列處理線程獲取隊(duì)列中的消息按批次發(fā)送給一異步線程池所述批次處理模塊進(jìn)一步包括一初始化參數(shù)模塊、一監(jiān)聽模塊、一集合類創(chuàng)建模塊、一消息存儲模塊和一發(fā)送模塊:

所述初始化參數(shù)模塊,用于通過一隊(duì)列處理線程初始化文件大小、默認(rèn)批次和文件路徑,并劃分文件塊,記錄文件寫入的起始位置和結(jié)束位置,所述批次大小為消息條數(shù);

所述監(jiān)聽模塊,用于通過所述隊(duì)列處理線程實(shí)時監(jiān)聽隊(duì)列,當(dāng)監(jiān)聽到隊(duì)列中有消息時,根據(jù)結(jié)束位置和文件大小判斷是否需要創(chuàng)建新的文件路徑,若結(jié)束位置大于或等于文件大小,則新建一個文件路徑,并將起始位置和結(jié)束位置置為0,執(zhí)行集合類創(chuàng)建模塊,否則,直接執(zhí)行集合類創(chuàng)建模塊;

所述集合類創(chuàng)建模塊,用于創(chuàng)建一個空的集合類,所述集合類的默認(rèn)大小設(shè)為批次大小,用于存儲每一批次的消息;

所述消息存儲模塊,用于通過所述隊(duì)列處理線程循環(huán)地從隊(duì)列中獲取消息存放在集合類里,同時根據(jù)添加的消息修改結(jié)束位置,直至集合類的消息數(shù)大于批次大小或者結(jié)束位置不小于文件大小或者隊(duì)列為空,結(jié)束循環(huán),執(zhí)行發(fā)送模塊;

所述發(fā)送模塊,用于判斷所述集合類是否為空,若是,則返回執(zhí)行監(jiān)聽模塊,否則,通過所述隊(duì)列處理線程將文件路徑、集合類、起始位置作為參數(shù)傳遞給異步線程池,修改起始位置為結(jié)束位置;

所述異步寫文件模塊,用于通過異步線程池根據(jù)所述隊(duì)列處理線程傳來的數(shù)據(jù)使用異步方式寫文件,所述異步線程池包括復(fù)數(shù)個寫文件線程,且每一寫文件線程對應(yīng)寫一個文件塊,所述異步寫文件模塊具體為:通過異步線程池中空閑的寫文件線程獲取所述隊(duì)列處理線程傳遞的集合類和文件路徑,并根據(jù)起始位置將集合類中的消息寫入到所給文件對應(yīng)的文件塊位置,所述文件塊大小為集合類中所有消息的大小,所述集合類用于存放每一批次消息。

下面結(jié)合一具體實(shí)施例對本發(fā)明做進(jìn)一步說明:

本發(fā)明以Storm的工作進(jìn)程為粒度,讓每個工作進(jìn)程中所有消息處理任務(wù)線程將消息寫入隊(duì)列中,并在工作進(jìn)程中新啟動一個寫文件的線程,將隊(duì)列中的消息按批次通過JAVA的并發(fā)框架分塊異步寫入文件,從而在保證Storm集群性能的同時,控制文件生成的數(shù)量和大小,大大提高原有寫文件的速度。

在本發(fā)明的Storm集群中的一工作進(jìn)程中,包括一消息獲取任務(wù)線程、復(fù)數(shù)個消息處理任務(wù)線程、一隊(duì)列、一隊(duì)列處理線程以及一異步線程池,所述異步線程池中包括復(fù)數(shù)個異步處理消息的寫文件線程,寫文件的過程如下:

利用所述消息獲取任務(wù)線程將采集到的消息(即原始消息)以數(shù)組的形式發(fā)送給下游的任一一個消息處理任務(wù)線程;

通過所述消息處理任務(wù)線程對獲取到的消息進(jìn)行處理,得到處理后的消息,并將處理后的消息寫入所述隊(duì)列中,且在所述消息處理任務(wù)線程初始化的時候,以單例模式一起啟動隊(duì)列處理線程,從而保證一個工作進(jìn)程中對應(yīng)一個隊(duì)列;

通過一隊(duì)列處理線程初始化文件大小(例如,初始化文件大小為128M)、默認(rèn)批次和文件路徑(即某一文件地址),并劃分文件塊,即把一文件劃分成固定大小的文件塊,記錄文件寫入的起始位置和結(jié)束位置,將起始位置和結(jié)束位置初始化為0,所述批次大小為消息條數(shù)(例如1000條消息);

通過所述隊(duì)列處理線程實(shí)時監(jiān)聽隊(duì)列,當(dāng)監(jiān)聽到隊(duì)列中有消息時,根據(jù)結(jié)束位置和文件大小判斷是否需要創(chuàng)建新的文件路徑,若結(jié)束位置大于或等于文件大小,則新建一個文件路徑,并將起始位置和結(jié)束位置置為0;

創(chuàng)建一個空的集合類,所述集合類的默認(rèn)大小設(shè)為批次大小,用于存儲每一批次的消息;

通過所述隊(duì)列處理線程循環(huán)地從隊(duì)列中獲取消息存放在集合類里,同時根據(jù)添加的消息修改結(jié)束位置,即每存入一個消息就將結(jié)束位置增加該消息的長度(例如結(jié)束位置為endPos,消息為element,element為byty[]類型,endPos=endPos+element.length),直至集合類的消息數(shù)大于批次大小或者結(jié)束位置不小于文件大小或者隊(duì)列為空,結(jié)束該循環(huán),進(jìn)入下一步;

判斷所述集合類是否為空,若是,則返回繼續(xù)監(jiān)聽隊(duì)列,否則,通過所述隊(duì)列處理線程將文件路徑、集合類、起始位置作為參數(shù)傳遞給異步線程池,修改起始位置為結(jié)束位置;

通過JAVA的并發(fā)框架的異步線程池中空閑的寫文件線程獲取所述隊(duì)列處理線程傳遞的集合類和文件路徑,并根據(jù)起始位置將集合類中的消息寫入到對應(yīng)的文件塊位置,所述文件塊大小為集合類中所有消息的大小,使用這種異步方式寫文件,可以避免同步鎖引起的阻塞,加快隊(duì)列中消息的消費(fèi),提高些文件的速度,一個寫文件線程對應(yīng)寫一個文件塊,如果該寫文件線程寫完對應(yīng)的文件塊,可以將重新領(lǐng)取到的集合類中的消息寫入其他文件塊中,從而可以保證同一時刻有多個寫文件線程并發(fā)寫同一個文件,大大提高文件處理速度。

雖然以上描述了本發(fā)明的具體實(shí)施方式,但是熟悉本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,我們所描述的具體的實(shí)施例只是說明性的,而不是用于對本發(fā)明的范圍的限定,熟悉本領(lǐng)域的技術(shù)人員在依照本發(fā)明的精神所作的等效的修飾以及變化,都應(yīng)當(dāng)涵蓋在本發(fā)明的權(quán)利要求所保護(hù)的范圍內(nèi)。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1