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

一種分布式環(huán)境下避免全局排序的海量數(shù)據(jù)分頁查詢方法與流程

文檔序號:11432271閱讀:779來源:國知局
一種分布式環(huán)境下避免全局排序的海量數(shù)據(jù)分頁查詢方法與流程

本發(fā)明涉及數(shù)據(jù)庫和大數(shù)據(jù)領域,具體涉及一種基于分布式海量數(shù)據(jù)的檢索及分頁方法。



背景技術:

分頁查詢一般需要兩個結果,其一是根據(jù)查詢條件命中的查詢條數(shù)count,count用來計算總頁數(shù),為頁碼導航欄提供數(shù)據(jù);其二是當前頁(pageno)數(shù)據(jù),該數(shù)據(jù)一般直接反饋給用戶(例如顯示到web平臺)。在應用程序中對數(shù)據(jù)分頁查詢的傳統(tǒng)處理方法是一次性從數(shù)據(jù)庫中檢索出所有符合條件的結果,并將結果數(shù)據(jù)從數(shù)據(jù)庫服務器端傳輸?shù)娇蛻舳司彺?,然后客戶端通過應用程序內部編程對查詢的結果進行分頁顯示。在大數(shù)據(jù)環(huán)境下該種方式存在兩個問題。第一個問題是,如果查詢結果數(shù)據(jù)量很大,很難緩存所有數(shù)據(jù)結果。第二個問題是,在利用數(shù)據(jù)庫查詢時,如果分頁查詢必須進行排序(orderby)操作,這導致計算非常緩慢。

大數(shù)據(jù)指的是數(shù)據(jù)規(guī)模龐大,通常達到pb級以上級別。在大數(shù)據(jù)下分頁查詢面臨三個問題。其一,在利用集群進行計算時,例如利用spark的orderby操作對數(shù)據(jù)進行排序,要花費大量時間。其二,在查詢結果很多時,要從集群的各個節(jié)點收集數(shù)據(jù),這導致非常頻繁的網絡io和磁盤io,計算緩慢,很難到達實時查詢。其三,查詢結果集龐大,全部緩存到內存很困難。同時,大量用戶對不同查詢條件在匹配大量數(shù)據(jù)時,大量用戶和每個用戶查詢結果都過大,因此很難全部緩存到內存中。

spark是基于內存的分布式并行計算框架,誕生于2009年,由加州大學伯克利分校amp實驗室開發(fā),現(xiàn)在是apache軟件基金會旗下的頂級開源項目。spark抽象出了彈性分布式數(shù)據(jù)集rdd(resilientdistributeddatasets),它是一種基于內存的集群計算容錯抽象。spark基于rdd的內存計算擁有hadoopmapreduce計算模型的所有優(yōu)點,但不同于hadoopmapreduce的是中間結果和最終結果不需要保存到hdfs,可以直接保存到內存中;海量數(shù)據(jù)很難在數(shù)據(jù)庫中查詢,利用spark可以進行高效的分布式計算,因此本發(fā)明的實施階段采用spark技術。



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

針對大數(shù)據(jù)在分布式下分頁查詢時命中數(shù)據(jù)量大,每次查詢需要全局排序和從集群的各個機器上收集大量結果數(shù)據(jù)問題。本發(fā)明設計了一種基于分布式環(huán)境下數(shù)據(jù)查詢的索引結構和分頁檢索方法,該方法可以很好的解決上述問題。針對排序列(相當于在數(shù)據(jù)庫中對該列orderby操作)分頁檢索,該方法可以避免全局排序和大量數(shù)據(jù)結果收集;針對條件列過濾(相當于數(shù)據(jù)庫where語句中的條件列語句),該方法可以避免全局數(shù)據(jù)掃描。

本發(fā)明采用的技術方案如下:

一種分布式環(huán)境下海量數(shù)據(jù)的索引構建方法,其步驟包括:

1)根據(jù)待排序的不同屬性,將數(shù)據(jù)復制成相應的份數(shù);

2)根據(jù)待排序的屬性對相應的每一份數(shù)據(jù)進行排序,并將排序后的每一份數(shù)據(jù)保存在不同的文件夾;

3)將每一份數(shù)據(jù)拆分成多個數(shù)據(jù)文件,拆分規(guī)則是:從第一條數(shù)據(jù)開始每m條數(shù)據(jù)保存成一個數(shù)據(jù)文件,每個數(shù)據(jù)文件分配一個唯一的索引編號indexno,索引編號indexno從1開始依次累加分配;

4)對步驟3)形成的每一個數(shù)據(jù)文件添加一列,該列的值與數(shù)據(jù)文件的索引編號indexno相同;

5)根據(jù)數(shù)據(jù)文件構建索引文件,索引文件的每一條記錄描述一個數(shù)據(jù)文件的信息,包括索引編號indexno、最小值、最大值、數(shù)據(jù)條數(shù)總和、所在磁盤路徑。

進一步地,步驟5)中最小值、最大值都是有序的,為非遞減有序序列或者非遞增有序序列,索引文件中每一條記錄的最小值<=最大值。

進一步地,對于組合屬性,如果組合屬性有兩個,則索引文件添加兩列最小值和最大值;如果組合屬性有多個,以此類推。

進一步地,采用分布式存儲系統(tǒng)和分布式計算框架進行索引構建及數(shù)據(jù)存儲。

一種采用上述方法的分布式環(huán)境下海量數(shù)據(jù)的分頁查詢方法,其步驟包括:

1)讀取所有索引文件和數(shù)據(jù)文件,緩存到集群中各個機器的內存,并根據(jù)排序要求選擇相應的文件;

2)從索引文件過濾符合條件的數(shù)據(jù)文件,并獲取文件路徑集合pathset;

3)根據(jù)pathset集合和步驟1)中緩存的數(shù)據(jù)文件,獲取集群中緩存的數(shù)據(jù)集;

4)根據(jù)過濾條件對獲取的數(shù)據(jù)集進行過濾計算,如果滿足過濾條件則返回indexno;分別計算每個以indexno編號的數(shù)據(jù)文件中符合過濾條件的結果總和,并保存到數(shù)據(jù)結果分布集indexnoset;

5)對indexnoset按照indexno排序,并從第一個開始依次累加,獲取總數(shù)據(jù)條數(shù)total;

6)根據(jù)total總和,計算查詢結果中的分頁個數(shù)pagesum;

7)根據(jù)頁碼pageno和每頁數(shù)據(jù)條數(shù)pagesize計算數(shù)據(jù)的第一條記錄startno和最后一條記錄endno;

8)根據(jù)startno和endno計算數(shù)據(jù)所在的文件的indexno,然后從索引文件查找對應的數(shù)據(jù)文件,計算數(shù)據(jù)文件中滿足要求的數(shù)據(jù),對數(shù)據(jù)進行排序;

9)根據(jù)步驟8)中獲取的數(shù)據(jù),計算出當前頁所需要的數(shù)據(jù),并返回給客戶端系統(tǒng)。

進一步地,步驟1)中如果集群規(guī)模比較大,則將所有數(shù)據(jù)文件緩存到內存,如果集群規(guī)模較小,則緩存頻繁讀的數(shù)據(jù)文件。

進一步地,步驟3)判斷過濾條件是否是排序屬性,如果是排序屬性,則直接根據(jù)索引文件中的最小值和最大值進行過濾,將過濾的數(shù)據(jù)文件路徑保存到路徑集pathset中;如果過濾條件不是排序屬性,則將索引文件中所有路徑加入到pathset中。

進一步地,步驟5)中數(shù)據(jù)結果分布集indexnoset的元素格式為(indexno,count)二元組,其中count代表以indexno編號的數(shù)據(jù)文件中符合過濾條件的結果總和。

進一步地,采用分布式存儲系統(tǒng)和分布式計算框架實現(xiàn)分頁查詢。其中步驟4)可在分布式計算框架中計算;進行具體的分頁數(shù)據(jù)查詢的步驟7)、8)、9)是直接計算,而不是使用分布式集群計算。

本發(fā)明的有益效果如下:

1)有利地,由于count計算的計算量大,采用集群進行分布式計算,可以大大減少計算時間。

2)有利地,在進行count計算時,由于不需要收集所有結果數(shù)據(jù),因此可以大大減少網絡io和磁盤io,并且隨著集群規(guī)模的增加,具有很強的擴展性。

3)有利地,由于數(shù)據(jù)是根據(jù)indexno提前排序的,因此避免了查詢時全局排序,在進行查詢時,避免了結果收集和全局排序對集群的壓力,而且最終分頁的結果數(shù)據(jù)也是排序的。

4)有利地,由于count計算中已經計算了數(shù)據(jù)結果的分布情況,分頁查詢時要計算的數(shù)據(jù)很少,計算量也很小,不需要分布式并行計算,單機計算即可。因此可以減少集群的壓力,減少集群的任務量。

5)有利地,由于在count計算的時候,數(shù)據(jù)是按照indexno計算求和的,而每一個indexno數(shù)據(jù)都在一個文件中,因此每個indexno數(shù)據(jù)在集群中分布在少量的機器上,能夠最大程度的滿足數(shù)據(jù)的本地性,集群在shuffle計算的時候能夠最小程度的進行網絡io通信。

附圖說明

圖1是單列排序索引文件結構和數(shù)據(jù)文件結構圖。

圖2是組合屬性排序索引文件結構和數(shù)據(jù)文件結構圖。

圖3是spark集群下創(chuàng)建排序索引文件和數(shù)據(jù)文件流程圖。

圖4是分頁查詢流程圖。

具體實施方式

下面通過具體實施例和附圖,對本發(fā)明做進一步說明。

本發(fā)明設計了一種基于分布式環(huán)境下數(shù)據(jù)查詢的索引結構和分頁檢索方法。該方法包括索引構建和分頁檢索等。

1、索引構建

1)對每一個要排序的屬性復制一份,假如用戶經常對屬性1field1升序,屬性2field2升序,或者組合屬性3field3升序,然后屬性4field4升序進行排序,那么對原始數(shù)據(jù)復制三份。然后對每一份數(shù)據(jù)進行如下操作。

2)分別對每一種排序屬性進行排序。對第一份數(shù)據(jù)進行field1升序排序,對第二份數(shù)據(jù)進行field2升序排序,對第三份數(shù)據(jù)進行field3升序和field4升序排序。

3)分別保存第一份數(shù)據(jù),第二份數(shù)據(jù),第三份數(shù)據(jù)到不同的文件夾。文件夾名稱分別為field1,field2,field3_field4。

4)對每一份數(shù)據(jù),將數(shù)據(jù)拆分成多個數(shù)據(jù)文件。規(guī)則如下,從第一條開始每m條數(shù)據(jù)保存成一個數(shù)據(jù)文件,每個數(shù)據(jù)文件分配一個唯一的indexno編號,indexno編號從1開始依次累加分配。比如m等于10000,第一個文件為1.txt,保存的數(shù)據(jù)為1-10000條數(shù)據(jù),第二個文件為2.txt,保存的數(shù)據(jù)為10001-20000條數(shù)據(jù),以此類推。對每一個屬性,最終將數(shù)據(jù)分別保存到對應的文件夾下。

5)對每一個數(shù)據(jù)文件添加一列,該列的值與數(shù)據(jù)文件的索引編號indexno相同。比如1.txt中每一行添加一列屬性1,2.txt中每一行添加一列屬性2,以此類推。

6)根據(jù)數(shù)據(jù)文件構建索引文件,索引文件的每一條數(shù)據(jù)描述了一個數(shù)據(jù)文件的信息。索引文件的每一條數(shù)據(jù)中包含索引編號indexno、數(shù)據(jù)文件中field1的最小值min1、數(shù)據(jù)文件中field1的最大值max1、數(shù)據(jù)文件數(shù)據(jù)條數(shù)總和total、數(shù)據(jù)文件所在磁盤的路徑path。有利地,min1和max1都是非遞減有序序列,索引文件中每一條記錄min1<=max1;如果是組合屬性,假如組合屬性有兩個,索引文件添加四列min1、max1和min2、max2。如果組合屬性有多個,以此類推。如圖1所示的單列排序索引文件結構和數(shù)據(jù)文件結構圖,以及圖2所示的組合屬性排序索引文件結構和數(shù)據(jù)文件結構圖。

2、分頁檢索

1)讀取所有索引文件和數(shù)據(jù)文件,并緩存到集群中各個機器的內存。

2)根據(jù)排序要求選擇文件。如果按照field1排序,選擇field1文件夾下面的文件。如果按照field2排序,選擇field2文件夾下面的文件。如果按照field3排序和field4排序,選擇field3_field4文件夾下面的文件。

3)首先在索引文件中過濾。如果存在where過濾條件,并且過濾條件是排序索引field1,則首先從索引文件過濾符合條件的數(shù)據(jù)文件,并獲取文件路徑集合pathset。如果滿足field1>=min1并且field1<=max1則將path加入到pathset集合。

4)如果過濾條件不是排序索引field1,則將所有索引文件中的所有path路徑加入到pathset集合。

5)根據(jù)pathset集合和1)中緩存的數(shù)據(jù)文件,獲取集群中緩存的數(shù)據(jù)集。

6)根據(jù)過濾條件對步驟5)獲取的數(shù)據(jù)集進行過濾計算。例如fieldx字符串類型,過濾文本是否含有指定的過濾字符串,類似數(shù)據(jù)庫中的like操作等。

7)如果6)中滿足過濾條件,則返回indexno。分別計算每個以indexno編號的數(shù)據(jù)文件中符合過濾條件的結果總和,并保存到數(shù)據(jù)結果分布集indexnoset。元素格式為(indexno,count)二元組,其中count代表以indexno編號的數(shù)據(jù)文件中符合過濾條件的結果總和。

8)對indexnoset按照indexno排序,并從第一個開始依次累加,獲取總數(shù)據(jù)條數(shù)total。

9)根據(jù)total總和,計算查詢結果共有多少個分頁pagesum。

10)根據(jù)頁碼pageno和每頁數(shù)據(jù)條數(shù)pagesize計算數(shù)據(jù)的第一條記錄startno和最后一條記錄endno。startno=pageno*pagesize。endno=pageno*(pagesize+1)-1。

11)根據(jù)startno和endno計算數(shù)據(jù)所在的文件的indexno,然后根據(jù)indexno從索引文件查找對應的數(shù)據(jù)文件,計算數(shù)據(jù)文件中滿足要求的數(shù)據(jù),對數(shù)據(jù)進行排序。

12)根據(jù)11)中獲取的數(shù)據(jù),計算出當前頁pageno所需要的數(shù)據(jù),并返回給客戶端系統(tǒng)。

下面提供一個具體應用實例,本實例采用spark技術。

1.索引構建及數(shù)據(jù)存儲:

spark集群下創(chuàng)建排序索引文件和數(shù)據(jù)文件的流程如圖3所示,包括以下步驟:

(1)將原始數(shù)據(jù)上傳到hdfs分布式文件系統(tǒng)中。

(2)根據(jù)排序列,利用spark分布式計算框架,將數(shù)據(jù)按照排序列排序,其中sortbykey的key指定為排序列,并利用zipwithindex分配排序編號id。

(3)利用(2)中的id對數(shù)據(jù)文件最大記錄數(shù)subfilemax取模(取余數(shù)),取模結果為文件索引編號indexno。

(4)對(3)的結果進行groupbykey,其中key為indexno,然后將結果收集并保存到hdfs的datapath中,其中文件名稱為indexno.txt。

(5)對(3)的結果進行groupbykey,其中key為indexno,然后對每一個key的list計算索引編號,最小值,最大值,總條數(shù),以及分配文件路徑,即分配(indexno,min,max,total,path)。

(6)利用sortbykey對indexno進行排序,然后將5元組結果保存到hdfs的indexpath,當做索引文件。

2.分頁檢索:

分頁查詢流程如圖4所示,包括以下步驟:

(1)利用spark將所有索引文件緩存到內存中。選擇要緩存的數(shù)據(jù)文件,如果集群規(guī)模比較大,可以將所有數(shù)據(jù)文件緩存到內存,如果集群規(guī)模較小,可以緩存頻繁讀的數(shù)據(jù)文件。

(2)判斷過濾條件是否是排序屬性,如果是排序屬性,則直接根據(jù)索引文件進行過濾。即根據(jù)索引文件中的min和max屬性進行過濾,將過濾的數(shù)據(jù)文件path保存到路徑集pathset中。如果過濾條件不是排序屬性,則將索引文件中所有path加入到pathset中。

(3)根據(jù)(2)中的pathset加載數(shù)據(jù)集生成rdd,再次根據(jù)過濾條件對每一條數(shù)據(jù)進行filter過濾。利用map操作,返回二元組(indexno,1)。

(4)利用reducebykey進行累加,其中key為indexno。將結果利用sortbykey進行排序并收集到driver端,保存為resultset,并緩存到服務器端。

(5)根據(jù)常用的分頁計算公式直接計算出當前頁所需數(shù)據(jù),讀取當前頁數(shù)據(jù)所在文件,從hdfs讀取當前頁數(shù)據(jù),返回給客戶端。

本發(fā)明也可以利用mongodb、hbase、hive等nosql數(shù)據(jù)庫進行實施,實施效果和利用spark效果類似,可以避免全局排序,對海量數(shù)據(jù)實現(xiàn)分頁查詢。

以上實施例僅用以說明本發(fā)明的技術方案而非對其進行限制,本領域的普通技術人員可以對本發(fā)明的技術方案進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護范圍應以權利要求書所述為準。

當前第1頁1 2 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1