海量數據分布存儲
① 海量空間數據存儲
(一)空間數據存儲技術
隨著地理信息系統的發展,空間資料庫技術也得到了很大的發展,並出現了很多新的空間資料庫技術(黃釗等,2003),其中應用最廣的就是用關系資料庫管理系統(RDBMS)來管理空間數據。
用關系資料庫管理系統來管理空間數據,主要解決存儲在關系資料庫中的空間數據與應用程序之間的數據介面問題,即空間資料庫引擎(SpatialDatabase Engine)(熊麗華等,2004)。更確切地說,空間資料庫技術是解決空間數據對象中幾何屬性在關系資料庫中的存取問題,其主要任務是:
(1)用關系資料庫存儲管理空間數據;
(2)從資料庫中讀取空間數據,並轉換為GIS應用程序能夠接收和使用的格式;
(3)將GIS應用程序中的空間數據導入資料庫,交給關系資料庫管理。
空間資料庫中數據存儲主要有三種模式:拓撲關系數據存儲模式、Oracle Spatial模式和ArcSDE模式。拓撲關系數據存儲模式將空間數據存在文件中,而將屬性數據存在資料庫系統中,二者以一個關鍵字相連。這樣分離存儲的方式由於存在數據的管理和維護困難、數據訪問速度慢、多用戶數據並發共享沖突等問題而不適用於大型空間資料庫的建設。而OracleSpatial實際上只是在原來的資料庫模型上進行了空間數據模型的擴展,實現的是「點、線、面」等簡單要素的存儲和檢索,所以它並不能存儲數據之間復雜的拓撲關系,也不能建立一個空間幾何網路。ArcSDE解決了這些問題,並利用空間索引機制來提高查詢速度,利用長事務和版本機制來實現多用戶同時操縱同一類型數據,利用特殊的表結構來實現空間數據和屬性數據的無縫集成等(熊麗華等,2004)。
ArcSDE是ESRI公司開發的一個中間件產品,所謂中間件是一個軟體,它允許應用元素通過網路連接進行互操作,屏蔽其下的通訊協議、系統結構、操作系統、資料庫和其他應用服務。中間件位於客戶機/伺服器的操作系統之上,管理計算資源和網路通訊,並營造出一個相對穩定的高層應用環境,使開發人員可以集中精力於系統的上層開發,而不用過多考慮系統分布式環境下的移植性和通訊能力。因此,中間件能無縫地連入應用開發環境中,應用程序可以很容易地定位和共享中間件提供的應用邏輯和數據,易於系統集成。在分布式的網路環境下,客戶端的應用程序如果要訪問網路上某個伺服器的信息,而伺服器可能運行在不同於客戶端的操作系統和資料庫系統中。此時,客戶機的應用程序中負責尋找數據的部分只需要訪問一個數據訪問中間件,由該中間件完成網路中數據或服務的查找,然後將查找的信息返回給客戶端(萬定生等,2003)。因此,本系統實現空間資料庫存儲的基本思想就是利用ArcSDE實現各類空間數據的存儲。
目前,空間數據存儲技術已比較成熟,出現了許多類似ArcSDE功能的中間件產品,這些軟體基本上都能實現空間數據的資料庫存儲與管理,但對於海量空間數據的存儲,各種軟體性能差別較大。隨著數據量的增長,計算機在分析處理上會產生很多問題,比如數據不可能一次完全被讀入計算機的內存中進行處理。單純依賴於硬體技術,並不能滿足持續增長的數據的處理要求。因此需要在軟體上找到處理海量數據的策略,並最終通過軟硬體的結合完成對海量數據的處理。在海量數據存儲問題上,許多專家從不同側面進行過研究,Lindstrom在地形簡化中使用了外存模型(Out-of-core)技術;鍾正採用了基於數據分塊、動態調用的策略;汪國平等人在研究使用高速網路進行三維海量地形數據的實時交互瀏覽中,採用了分塊、多解析度模板建立模型等方法。這些技術、方法已經在各自系統上進行了研究和實現。本系統採用的ArcSDE軟體基本上也是採用分塊模型的方法,具體存儲和操作不需要用戶過多了解,已經由ArcSDE軟體實現。因此,對海量數據的存儲管理,更需要從數據的組織方式等方面進行設計。塔里木河流域生態環境動態監測系統採集了大量的遙感影像、正射影像等柵格結構的數據,這些數據具有很大的數據量,為適應流域空間基礎設施的管理需要,採取一種新的方式來管理、分發這些海量數據以適應各部門的快速瀏覽和管理需要。
(二)影像金字塔結構
影像資料庫的組織是影像資料庫效率的關鍵,為了獲得高效率的存取速度,在數據的組織上使用了金字塔數據結構和網格分塊數據結構。該技術主導思想如下:
(1)將資料庫中使用到的紋理處理成為大小一致的紋理塊;
(2)為每塊紋理生成5個細節等級的紋理,分別為0、1、2、3、4,其中1級紋理通過0級紋理1/4壓縮得到,2級紋理通過1級紋理1/4壓縮得到,…,以此類推;
(3)在顯示每個塊數據之前,根據顯示比例的大小,並以此決定該使用那一級的紋理;
(4)在內存中建立紋理緩沖池,使用LRU演算法進行紋理塊的調度,確保使用頻率高的紋理調度次數盡可能少。
(三)影像數據壓縮
影像數據壓縮有無損壓縮和有損壓縮兩個方法,具體採取哪種壓縮方法需根據具體情況確定。對於像元值很重要的數據,如分類數據、分析數據等採用無損壓縮(即LZ77演算法),否則採用有損壓縮(即JPEG演算法)。通過對影像數據的壓縮,一方面可以節約存儲空間,另一方面可以加快影像的讀取和顯示速度。影像數據的壓縮一般與構建金字塔同時進行,在構建影像金字塔過程中自動完成數據的壓縮。
② 海量數據存儲有哪些方式與方法
杉岩海量對象存儲MOS,針對海量非結構化數據存儲的最優化解決方案,採用去中心化、分布式技術架構,支持百億級文件及EB級容量存儲,
具備高效的數據檢索、智能化標簽和分析能力,輕松應對大數據和雲時代的存儲挑戰,為企業發展提供智能決策。
1、容量可線性擴展,單名字空間達EB級
SandStone MOS可在單一名字空間下實現海量數據存儲,支持業務無感知的存儲伺服器橫向擴容,為爆炸式增長的視頻、音頻、圖片、文檔等不同類型的非結構化數據提供完美的存儲方案,規避傳統NAS存儲的單一目錄或文件系統存儲空間無法彈性擴展難題
2、海量小文件存儲,百億級文件高效訪問
SandStone MOS基於完全分布式的數據和元數據存儲架構,為海量小文件存儲而生,將企業級NAS存儲的千萬文件量級提升至互聯網規模的百億級別,幫助企業從容應對幾何級增長的海量小文件挑戰。
3、中心靈活部署,容災匯聚分發更便捷
SandStone MOS支持多數據中心靈活部署,為企業數據容災、容災自動切換、多分支機構、數據就近訪問等場景提供可自定義的靈活解決方案,幫助企業實現跨地域多活容災、數據流轉、就近讀寫等,助力業務高速發展。
4、支持大數據和AI,統一數據存儲和分析
SandStone MOS內置文件智能化處理引擎,實現包括語音識別、圖片OCR識別、文件格式轉換等批量處理功能,結合標簽檢索能力還可實現語音、證件照片檢索,從而幫助企業更好地管理非結構化數據。同時,SandStone MOS還支持與Hadoop、Spark等大數據分析平台對接,一套存儲即可滿足企業數據存儲、管理和挖掘的需求。
③ 海量數據存儲有哪些方式與方法
1、容量可線性擴展,單名字空間達EB級,2、海量小文件存儲,百億級文件高效訪問,3、中心靈活部署,容災匯聚分發更便捷,4、支持大數據和AI,統一數據存儲和分析,你可以問下瑞馳信息技術,做數據存儲很專 業,技術很牛的。希望我的回答能解決到你的問題
④ 介紹一下海量數據的處理方法
介紹一下海量數據的處理方法
適用范圍:可以用來實現數據字典,進行數據的判重,或者集合求交集
基本原理及要點:
對於原理來說很簡單,位數組+k個獨立hash函數。將hash函數對應的值的位數組置1,查找時如果發現所有hash函數對應位都是1說明存在,很明顯這個過程並不保證查找的結果是100%正確的。同時也不支持刪除一個已經插入的關鍵字,因為該關鍵字對應的位會牽動到其他的關鍵字。所以一個簡單的改進就是 counting Bloom filter,用一個counter數組代替位數組,就可以支持刪除了。
還有一個比較重要的問題,如 何根據輸入元素個數n,確定位數組m的大小及hash函數個數。當hash函數個數k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大於E的情況 下,m至少要等於n*lg(1/E)才能表示任意n個元素的集合。但m還應該更大些,因為還要保證bit數組里至少一半為0,則m應 該>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2為底的對數)。
舉個例子我們假設錯誤率為0.01,則此時m應大概是n的13倍。這樣k大概是8個。
注意這里m與n的單位不同,m是bit為單位,而n則是以元素個數為單位(准確的說是不同元素的個數)。通常單個元素的長度都是有很多bit的。所以使用bloom filter內存上通常都是節省的。
擴展:
Bloom filter將集合中的元素映射到位數組中,用k(k為哈希函數個數)個映射位是否全1表示元素在不在這個集合中。Counting bloom filter(CBF)將位數組中的每一位擴展為一個counter,從而支持了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現次數關聯。SBF採用counter中的最小值來近似表示元素的出現頻率。
問題實例:給你A,B兩個文件,各存放50億條URL,每條URL佔用64位元組,內存限制是4G,讓你找出A,B文件共同的URL。如果是三個乃至n個文件呢?
根據這個問題我們來計算下內存的佔用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。 現在可用的是340億,相差並不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。
2.Hashing
適用范圍:快速查找,刪除的基本數據結構,通常需要總數據量可以放入內存
基本原理及要點:
hash函數選擇,針對字元串,整數,排列,具體相應的hash方法。
碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。
擴展:
d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個哈希函數,h1和h2。在存儲一個新的key時,同時用兩個哈希函數進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個位置已經存儲的(有碰撞的)key比較多,然後將新key存儲在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都存儲了一個key,就把新key 存儲在左邊的T1子表中,2-left也由此而來。在查找一個key時,必須進行兩次hash,同時查找兩個位置。
問題實例:1).海量日誌數據,提取出某日訪問網路次數最多的那個IP。
IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然後進行統計。
3.bit-map
適用范圍:可進行數據的快速查找,判重,刪除,一般來說數據范圍是int的10倍以下
基本原理及要點:使用bit數組來表示某些元素是否存在,比如8位電話號碼
擴展:bloom filter可以看做是對bit-map的擴展
問題實例:
1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的內存即可。
2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map。
4.堆
適用范圍:海量數據前n大,並且n比較小,堆可以放入內存
基本原理及要點:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆里的最大元素,如果它小於最大元素,則應該替換那個最大元 素。這樣最後得到的n個元素就是最小的n個。適合大數據量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。
擴展:雙堆,一個最大堆與一個最小堆結合,可以用來維護中位數。
問題實例:
1)100w個數中找最大的前100個數。
用一個100個元素大小的最小堆即可。
5.雙層桶劃分
適用范圍:第k大,中位數,不重復或重復的數字
基本原理及要點:因為元素范圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定范圍,然後最後在一個可以接受的范圍內進行。可以通過多次縮小,雙層只是一個例子。
擴展:
問題實例:
1).2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個文件代表一個區域),然後將數據分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
2).5億個int找它們的中位數。
這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然後讀取數據統計落到各個區域里的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃描我們只統計落在這個區域中的那些數就可以了。
實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然後確定區域的第幾 大數,在將該區域分成2^20個子區域,然後確定是子區域的第幾大數,然後子區域里的數的個數只有2^20,就可以直接利用direct addr table進行統計了。
6.資料庫索引
適用范圍:大數據量的增刪改查
基本原理及要點:利用數據的設計實現方法,對海量數據的增刪改查進行處理。
擴展:
問題實例:
7.倒排索引(Inverted index)
適用范圍:搜索引擎,關鍵字查詢
基本原理及要點:為何叫倒排索引?一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
以英文為例,下面是要被索引的文本:
T0 = 「it is what it is」
T1 = 「what is it」
T2 = 「it is a banana」
我們就能得到下面的反向文件索引:
「a」: {2}
「banana」: {2}
「is」: {0, 1, 2}
「it」: {0, 1, 2}
「what」: {0, 1}
檢索的條件」what」, 「is」 和 「it」 將對應集合的交集。
正 向索引開發出來用來存儲每個文檔的單詞的列表。正向索引的查詢往往滿足每個文檔有序頻繁的全文查詢和每個單詞在校驗文檔中的驗證這樣的查詢。在正向索引中,文檔占據了中心的位置,每個文檔指向了一個它所包含的索引項的序列。也就是說文檔指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文檔,很 容易看到這個反向的關系。
擴展:
問題實例:文檔檢索系統,查詢那些文件包含了某單詞,比如常見的學術論文的關鍵字搜索。
8.外排序
適用范圍:大數據的排序,去重
基本原理及要點:外排序的歸並方法,置換選擇 敗者樹原理,最優歸並樹
擴展:
問題實例:
1).有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16個位元組,內存限制大小是1M。返回頻數最高的100個詞。
這個數據具有很明顯的特點,詞的大小為16個位元組,但是內存只有1m做hash有些不夠,所以可以用來排序。內存可以當輸入緩沖區使用。
9.trie樹
適用范圍:數據量大,重復多,但是數據種類小可以放入內存
基本原理及要點:實現方式,節點孩子的表示方式
擴展:壓縮實現。
問題實例:
1).有10個文件,每個文件1G, 每個文件的每一行都存放的是用戶的query,每個文件的query都可能重復。要你按照query的頻度排序 。
2).1000萬字元串,其中有些是相同的(重復),需要把重復的全部去掉,保留沒有重復的字元串。請問怎麼設計和實現?
3).尋找熱門查詢:查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復後,不超過3百萬個,每個不超過255位元組。
10.分布式處理 maprece
適用范圍:數據量大,但是數據種類小可以放入內存
基本原理及要點:將數據交給不同的機器去處理,數據劃分,結果歸約。
擴展:
問題實例:
1).The canonical example application of MapRece is a process to count the appearances of
each different word in a set of documents:
void map(String name, String document):
// name: document name
// document: document contents
for each word w in document:
EmitIntermediate(w, 1);
void rece(String word, Iterator partialCounts):
// key: a word
// values: a list of aggregated partial counts
int result = 0;
for each v in partialCounts:
result += ParseInt(v);
Emit(result);
Here, each document is split in words, and each word is counted initially with a 「1″ value by
the Map function, using the word as the result key. The framework puts together all the pairs
with the same key and feeds them to the same call to Rece, thus this function just needs to
sum all of its input values to find the total appearances of that word.
2).海量數據分布在100台電腦中,想個辦法高效統計出這批數據的TOP10。
3).一共有N個機器,每個機器上有N個數。每個機器最多存O(N)個數並對它們操作。如何找到N^2個數的中數(median)?
經典問題分析
上千萬or億數據(有重復),統計其中出現次數最多的前N個數據,分兩種情況:可一次讀入內存,不可一次讀入。
可用思路:trie樹+堆,資料庫索引,劃分子集分別統計,hash,分布式計算,近似統計,外排序
所 謂的是否能一次讀入內存,實際上應該指去除重復後的數據量。如果去重後數據可以放入內存,我們可以為數據建立字典,比如通過 map,hashmap,trie,然後直接進行統計即可。當然在更新每條數據的出現次數的時候,我們可以利用一個堆來維護出現次數最多的前N個數據,當 然這樣導致維護次數增加,不如完全統計後在求前N大效率高。
如果數據無法放入內存。一方面我們可以考慮上面的字典方法能否被改進以適應這種情形,可以做的改變就是將字典存放到硬碟上,而不是內存,這可以參考資料庫的存儲方法。
當然還有更好的方法,就是可以採用分布式計算,基本上就是map-rece過程,首先可以根據數據值或者把數據hash(md5)後的值,將數據按照范圍劃分到不同的機子,最好可以讓數據劃分後可以一次讀入內存,這樣不同的機子負責處理各種的數值范圍,實際上就是map。得到結果後,各個機子只需拿出各 自的出現次數最多的前N個數據,然後匯總,選出所有的數據中出現次數最多的前N個數據,這實際上就是rece過程。
實際上可能想直接將數據均分到不同的機子上進行處理,這樣是無法得到正確的解的。因為一個數據可能被均分到不同的機子上,而另一個則可能完全聚集到一個機子上,同時還可 能存在具有相同數目的數據。比如我們要找出現次數最多的前100個,我們將1000萬的數據分布到10台機器上,找到每台出現次數最多的前 100個,歸並之後這樣不能保證找到真正的第100個,因為比如出現次數最多的第100個可能有1萬個,但是它被分到了10台機子,這樣在每台上只有1千個,假設這些機子排名在1000個之前的那些都是單獨分布在一台機子上的,比如有1001個,這樣本來具有1萬個的這個就會被淘汰,即使我們讓每台機子選出出現次數最多的1000個再歸並,仍然會出錯,因為可能存在大量個數為1001個的發生聚集。因此不能將數據隨便均分到不同機子上,而是要根據hash 後的值將它們映射到不同的機子上處理,讓不同的機器處理一個數值范圍。
而外排序的方法會消耗大量的IO,效率不會很高。而上面的分布式方法,也可以用於單機版本,也就是將總的數據根據值的范圍,劃分成多個不同的子文件,然後逐個處理。處理完畢之後再對這些單詞的及其出現頻率進行一個歸並。實際上就可以利用一個外排序的歸並過程。
另外還可以考慮近似計算,也就是我們可以通過結合自然語言屬性,只將那些真正實際中出現最多的那些詞作為一個字典,使得這個規模可以放入內存。
⑤ 海量數據存儲一般用在什麼地方
分布式存儲是一種數據存儲技術,它通過網路使用企業中每台機器上的磁碟空間,這些分散的存儲資源構成了虛擬存儲設備,數據分布存儲在企業的各個角落。你可以咨詢下瑞馳,專業做數據存儲的。
⑥ 海量數據分析處理方法
海量數據分析處理方法
一、Bloom filter
適用范圍:可以用來實現數據字典,進行數據的判重,或者集合求交集
基本原理及要點:
對於原理來說很簡單,位數組+k個獨立hash函數。將hash函數對應的值的位數組置1,查找時如果發現所有hash函數對應位都是1說明存在,很明顯這個過程並不保證查找的結果是100%正確的。同時也不支持刪除一個已經插入的關鍵字,因為該關鍵字對應的位會牽動到其他的關鍵字。所以一個簡單的改進就是 counting Bloom filter,用一個counter數組代替位數組,就可以支持刪除了。
還有一個比較重要的問題,如何根據輸入元素個數n,確定位數組m的大小及hash函數個數。當hash函數個數k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大於E的情況下,m至少要等於n*lg(1/E)才能表示任意n個元素的集合。但m還應該更大些,因為還要保證bit數組里至少一半為0,則m應該>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2為底的對數)。
舉個例子我們假設錯誤率為0.01,則此時m應大概是n的13倍。這樣k大概是8個。
注意這里m與n的單位不同,m是bit為單位,而n則是以元素個數為單位(准確的說是不同元素的個數)。通常單個元素的長度都是有很多bit的。所以使用bloom filter內存上通常都是節省的。
擴展:
Bloom filter將集合中的元素映射到位數組中,用k(k為哈希函數個數)個映射位是否全1表示元素在不在這個集合中。Counting bloom filter(CBF)將位數組中的每一位擴展為一個counter,從而支持了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現次數關聯。SBF採用counter中的最小值來近似表示元素的出現頻率。
問題實例:給你A,B兩個文件,各存放50億條URL,每條URL佔用64位元組,內存限制是4G,讓你找出A,B文件共同的URL。如果是三個乃至n個文件呢?
根據這個問題我們來計算下內存的佔用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。現在可用的是340億,相差並不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。
二、Hashing
適用范圍:快速查找,刪除的基本數據結構,通常需要總數據量可以放入內存
基本原理及要點:
hash函數選擇,針對字元串,整數,排列,具體相應的hash方法。
碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。
擴展:
d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個哈希函數,h1和h2。在存儲一個新的key時,同時用兩個哈希函數進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個位置已經存儲的(有碰撞的)key比較多,然後將新key存儲在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都存儲了一個key,就把新key存儲在左邊的T1子表中,2-left也由此而來。在查找一個key時,必須進行兩次hash,同時查找兩個位置。
問題實例:
1).海量日誌數據,提取出某日訪問網路次數最多的那個IP。
IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然後進行統計。
三、bit-map
適用范圍:可進行數據的快速查找,判重,刪除,一般來說數據范圍是int的10倍以下
基本原理及要點:使用bit數組來表示某些元素是否存在,比如8位電話號碼
擴展:bloom filter可以看做是對bit-map的擴展
問題實例:
1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的內存即可。
2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map。
四、堆
適用范圍:海量數據前n大,並且n比較小,堆可以放入內存
基本原理及要點:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆里的最大元素,如果它小於最大元素,則應該替換那個最大元素。這樣最後得到的n個元素就是最小的n個。適合大數據量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。
擴展:雙堆,一個最大堆與一個最小堆結合,可以用來維護中位數。
問題實例:
1)100w個數中找最大的前100個數。
用一個100個元素大小的最小堆即可。
五、雙層桶劃分-—其實本質上就是【分而治之】的思想,重在分的技巧上!
適用范圍:第k大,中位數,不重復或重復的數字
基本原理及要點:因為元素范圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定范圍,然後最後在一個可以接受的范圍內進行。可以通過多次縮小,雙層只是一個例子。
擴展:
問題實例:
1).2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個文件代表一個區域),然後將數據分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
2).5億個int找它們的中位數。
這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然後讀取數據統計落到各個區域里的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃描我們只統計落在這個區域中的那些數就可以了。
實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然後確定區域的第幾大數,在將該區域分成2^20個子區域,然後確定是子區域的第幾大數,然後子區域里的數的個數只有2^20,就可以直接利用direct addr table進行統計了。
六、資料庫索引
適用范圍:大數據量的增刪改查
基本原理及要點:利用數據的設計實現方法,對海量數據的增刪改查進行處理。
七、倒排索引(Inverted index)
適用范圍:搜索引擎,關鍵字查詢
基本原理及要點:為何叫倒排索引?一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
以英文為例,下面是要被索引的文本: T0 = 「it is what it is」 T1 = 「what is it」 T2 = 「it is a banana」
我們就能得到下面的反向文件索引:
「a」: {2} 「banana」: {2} 「is」: {0, 1, 2} 「it」: {0, 1, 2} 「what」: {0, 1}
檢索的條件」what」,」is」和」it」將對應集合的交集。
正向索引開發出來用來存儲每個文檔的單詞的列表。正向索引的查詢往往滿足每個文檔有序頻繁的全文查詢和每個單詞在校驗文檔中的驗證這樣的查詢。在正向索引中,文檔占據了中心的位置,每個文檔指向了一個它所包含的索引項的序列。也就是說文檔指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文檔,很容易看到這個反向的關系。
擴展:
問題實例:文檔檢索系統,查詢那些文件包含了某單詞,比如常見的學術論文的關鍵字搜索。
八、外排序
適用范圍:大數據的排序,去重
基本原理及要點:外排序的歸並方法,置換選擇敗者樹原理,最優歸並樹
擴展:
問題實例:
1).有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16個位元組,內存限制大小是1M。返回頻數最高的100個詞。
這個數據具有很明顯的特點,詞的大小為16個位元組,但是內存只有1m做hash有些不夠,所以可以用來排序。內存可以當輸入緩沖區使用。
九、trie樹
適用范圍:數據量大,重復多,但是數據種類小可以放入內存
基本原理及要點:實現方式,節點孩子的表示方式
擴展:壓縮實現。
問題實例:
1).有10個文件,每個文件1G,每個文件的每一行都存放的是用戶的query,每個文件的query都可能重復。要你按照query的頻度排序。
2).1000萬字元串,其中有些是相同的(重復),需要把重復的全部去掉,保留沒有重復的字元串。請問怎麼設計和實現?
3).尋找熱門查詢:查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復後,不超過3百萬個,每個不超過255位元組。
十、分布式處理 maprece
適用范圍:數據量大,但是數據種類小可以放入內存
基本原理及要點:將數據交給不同的機器去處理,數據劃分,結果歸約。
擴展:
問題實例:
1).The canonical example application of MapRece is a process to count the appearances ofeach different word in a set of documents:
2).海量數據分布在100台電腦中,想個辦法高效統計出這批數據的TOP10。
3).一共有N個機器,每個機器上有N個數。每個機器最多存O(N)個數並對它們操作。如何找到N^2個數的中數(median)?
⑦ 互聯網如何海量存儲數據
目前存儲海量數據的技術主要包括NoSQL、分布式文件系統、和傳統關系型資料庫。隨著互聯網行業不斷的發展,產生的數據量越來越多,並且這些數據的特點是半結構化和非結構化,數據很可能是不精確的,易變的。這樣傳統關系型資料庫就無法發揮它的優勢。因此,目前互聯網行業偏向於使用NoSQL和分布式文件系統來存儲海量數據。
下面介紹下常用的NoSQL和分布式文件系統。
NoSQL
互聯網行業常用的NoSQL有:HBase、MongoDB、Couchbase、LevelDB。
HBase是Apache Hadoop的子項目,理論依據為Google論文 Bigtable: A Distributed Storage System for Structured Data開發的。HBase適合存儲半結構化或非結構化的數據。HBase的數據模型是稀疏的、分布式的、持久穩固的多維map。HBase也有行和列的概念,這是與RDBMS相同的地方,但卻又不同。HBase底層採用HDFS作為文件系統,具有高可靠性、高性能。
MongoDB是一種支持高性能數據存儲的開源文檔型資料庫。支持嵌入式數據模型以減少對資料庫系統的I/O、利用索引實現快速查詢,並且嵌入式文檔和集合也支持索引,它復制能力被稱作復制集(replica set),提供了自動的故障遷移和數據冗餘。MongoDB的分片策略將數據分布在伺服器集群上。
Couchbase這種NoSQL有三個重要的組件:Couchbase伺服器、Couchbase Gateway、Couchbase Lite。Couchbase伺服器,支持橫向擴展,面向文檔的資料庫,支持鍵值操作,類似於SQL查詢和內置的全文搜索;Couchbase Gateway提供了用於RESTful和流式訪問數據的應用層API。Couchbase Lite是一款面向移動設備和「邊緣」系統的嵌入式資料庫。Couchbase支持千萬級海量數據存儲
分布式文件系統
如果針對單個大文件,譬如超過100MB的文件,使用NoSQL存儲就不適當了。使用分布式文件系統的優勢在於,分布式文件系統隔離底層數據存儲和分布的細節,展示給用戶的是一個統一的邏輯視圖。常用的分布式文件系統有Google File System、HDFS、MooseFS、Ceph、GlusterFS、Lustre等。
相比過去打電話、發簡訊、用彩鈴的「老三樣」,移動互聯網的發展使得人們可以隨時隨地通過刷微博、看視頻、微信聊天、瀏覽網頁、地圖導航、網上購物、外賣訂餐等,這些業務的海量數據都構建在大規模網路雲資源池之上。當14億中國人把衣食住行搬上移動互聯網的同時,也給網路雲資源池帶來巨大業務挑戰。
首先,用戶需求動態變化,傳統業務流量主要是端到端模式,較為穩定;而互聯網流量易受熱點內容牽引,數據流量流向復雜和規模多變:比如雙十一購物狂潮,電商平台訂單創建峰值達到58.3萬筆,要求通信網路提供高並發支持;又如優酷春節期間有超過23億人次上網刷劇、抖音拜年短視頻增長超10倍,需要通信網路能夠靈活擴充帶寬。面對用戶動態多變的需求,通信網路需要具備快速洞察和響應用戶需求的能力,提供高效、彈性、智能的數據服務。
「隨著通信網路管道十倍百倍加粗、節點數從千萬級逐漸躍升至百億千億級,如何『接得住、存得下』海量數據,成為網路雲資源池建設面臨的巨大考驗」,李輝表示。一直以來,作為新數據存儲首倡者和引領者,浪潮存儲攜手通信行業用戶,不斷 探索 提速通信網路雲基礎設施的各種姿勢。
早在2018年,浪潮存儲就參與了通信行業基礎設施建設,四年內累計交付約5000套存儲產品,涵蓋全快閃記憶體儲、高端存儲、分布式存儲等明星產品。其中在網路雲建設中,浪潮存儲已連續兩年兩次中標全球最大的NFV網路雲項目,其中在網路雲二期建設中,浪潮存儲提供數千節點,為上層網元、應用提供高效數據服務。在最新的NFV三期項目中,浪潮存儲也已中標。
能夠與通信用戶在網路雲建設中多次握手,背後是浪潮存儲的持續技術投入與創新。浪潮存儲6年內投入超30億研發經費,開發了業界首個「多合一」極簡架構的浪潮並行融合存儲系統。此存儲系統能夠統籌管理數千個節點,實現性能、容量線性擴展;同時基於浪潮iTurbo智能加速引擎的智能IO均衡、智能資源調度、智能元數據管理等功能,與自研NVMe SSD快閃記憶體檔進行系統級別聯調優化,讓百萬級IO均衡落盤且路徑更短,將存儲系統性能發揮到極致。
「為了確保全球最大規模的網路雲正常上線運行,我們聯合用戶對存儲集群展開了長達數月的魔鬼測試」,浪潮存儲工程師表示。網路雲的IO以虛擬機數據和上層應用數據為主,浪潮按照每個存儲集群支持15000台虛機進行配置,分別對單卷隨機讀寫、順序寫、混合讀寫以及全系統隨機讀寫的IO、帶寬、時延等指標進行了360無死角測試,達到了通信用戶提出的單卷、系統性能不低於4萬和12萬IOPS、時延小於3ms的要求,產品成熟度得到了驗證。
以通信行業為例,2020年全國移動互聯網接入流量1656億GB,相當於中國14億人每人消耗118GB數據;其中春節期間,移動互聯網更是創下7天消耗36億GB數據流量的記錄,還「捎帶」打了548億分鍾電話、發送212億條簡訊……海量實時數據洪流,在網路雲資源池(NFV)支撐下收放自如,其中分布式存儲平台發揮了作用。如此樣板工程,其巨大示範及拉動作用不言而喻。
⑧ Bigtable---分布式的結構化數據存儲系統
sina
Bigtable 是一個分布式的結構化數據存儲系統,它被設計用來處理海量數據:通常是分布在數千台普通伺服器上的PB 級的數據。Google 的很多項目使用Bigtable 存儲升唯數據,包括Web 索引、GoogleEarth、Google Finance。這些應用對Bigtable 提出的要求差異非常大,無論是在數據量上(從URL到網頁到衛星圖像)還是在響應速度上(從後端的批量處理到實時數據服務)。
Bigtable 已經實現了下面的幾個目標:適用性廣泛、可擴展、高性能和高可用性,Bigtable 是一個稀疏的、分布式的、持久化存儲的多維度排序Map。
圖一:一個存儲Web 網頁的例子的表的片斷。行名是一個反向URL。contents 列族存放的是網頁的內容,anchor 列族存放引用該網頁的錨鏈接文本(alex 註:如果不知道HTML 的Anchor,請Google一把)。CNN 的主頁被Sports Illustrater和MY-look 的主頁引用,因此該行包含了名為「anchor:cnnsi.com」和「anchhor:my.look.ca」的列。每個錨鏈接只有一拿缺個版本(alex 註:注意時間戳標識了列的版本,t9 和t8 分別標識了兩個錨鏈接的版本);而contents 列則有三個版本,分別由時間戳t3,t5,和t6 標識。
行
Bigtable 通過行關鍵字的字典順序來組織數據。表中的每個行都可以動態分區。每個分區叫做一個」Tablet」,Tablet 是數據分布和負載均衡調整的最小單位。
列族
Webtable 有個列族language,language 列族用來存放撰寫網頁的語言。
我們在language 列族中只使用一個列關鍵字,用來存放每個網頁的語言標識ID。Webtable 中另一個有用的列族是anchor;這個列族的每一個列關鍵字代表一個錨鏈接,如圖一所示。Anchor 列族的限定詞是引用該網頁的站點名;Anchor 列族每列的數據項存放的是鏈接文本。訪問控制、磁碟和內存的使用統計都是在列族層面進行的。
時間戳
不同版本的數據通過時間戳來索引。Bigtable 時間戳的類型是64 位整型。
Bigtable 可以給時間戳賦值,用來表示精確到毫秒的「實時」時間;用戶程序也可以給時間戳賦值。如果應用程序需要避免數據版本沖突,那麼它必須自己生成具有唯一性的時間戳。數據項中,不同版本的數據按照時間戳倒序排序,即最新的數據排在最前面。為了減輕多個版本數據的管理負擔,我們對每一個列族配有兩個設置參數, Bigtable 通過這兩個參數可以對廢棄版本的數據自動進行垃圾收集。用戶可以指定只保存最後n 個版本的數據,或者只保存「足夠新」的版本的數據(比如,只保存最近7 天的內容寫入的數據)。
Bigtable支持的其他特性
1、Bigtable 支持單行上的事務處理,利用這個功能,用戶可以對存儲在一個行關鍵字下的數據進行原子性的讀-更新-寫操作。
2、Bigtable 允許把數據項用做整數計數器。
3、Bigtable 允許用戶在伺服器的地址空間內執行腳本程序
4、Bigtable 可以和MapRece一起使用,MapRece 是Google 開發的大規模並行計算框架。我們已經開發了一些Wrapper 類,通過使用這些Wrapper 類,Bigtable 可以作為MapRece 框架的輸入和輸出。
Bigtable依賴於google的幾項技術。用GFS來存儲日誌和數據文件;按SSTable文件格式存儲數據;用Chubby管理元數據:
Bigtable是建立在其它的幾個Google基礎構件上的。BigTable 使用Google 的分布式文件系統(GFS)存儲日誌文件和數據文件。BigTable 集群通常運行在一個共享的機器池中,池中的機器還會運行其它的各種各樣的分布式應用程序,BigTable 的進程經消笑辯常要和其它應用的進程共享機器。BigTable 依賴集群管理系統來調度任務、管理共享的機器上的資源、處理機器的故障、以及監視機器的狀態。
BigTable 內部存儲數據的文件是Google SSTable 格式的。SSTable 是一個持久化的、排序的、不可更改的Map 結構,而Map 是一個key-value 映射的數據結構,key 和value 的值都是任意的Byte串,從內部看,SSTable 是一系列的數據塊(通常每個塊的大小是64KB,這個大小是可以配置的)。。SSTable 使用塊索引(通常存儲在SSTable 的最後)來定位數據塊;在打開SSTable的時候,索引被載入到內存。每次查找都可以通過一次磁碟搜索完成:首先使用二分查找法在內存中的索引里找到數據塊的位置,然後再從硬碟讀取相應的數據塊。也可以選擇把整個SSTable 都放在內存中,這樣就不必訪問硬碟了。
BigTable 還依賴一個高可用的、序列化的分布式鎖服務組件,叫做Chubby。Chubby有五個活躍副本,同時只有一個主副本提供服務,副本之間用Paxos演算法維持一致性,Chubby提供了一個命名空間(包括一些目錄和文件),每個目錄和文件就是一個鎖,Chubby的客戶端必須和Chubby保持會話,客戶端的會話若過期則會丟失所有的鎖。
Bigtable 包括了三個主要的組件:鏈接到客戶程序中的庫、一個Master主伺服器和多個Tablet片 伺服器。
Bigtable會將表(table)進行分片,片(tablet)的大小維持在100-200MB范圍,一旦超出范圍就將分裂成更小的片,或者合並成更大的片。每個片伺服器負責一定量的片,處理對其片的讀寫請求,以及片的分裂或合並。片伺服器可以根據負載隨時添加和刪除。這里片伺服器並不真實存儲數據,而相當於一個連接Bigtable和GFS的代理,客戶端的一些數據操作都通過片伺服器代理間接訪問GFS。主伺服器負責將片分配給片伺服器,監控片伺服器的添加和刪除,平衡片伺服器的負載,處理表和列族的創建等。注意,主伺服器不存儲任何片,不提供任何數據服務,也不提供片的定位信息。
客戶端需要讀寫數據時,直接與片伺服器聯系。因為客戶端並不需要從主伺服器獲取片的位置信息,所以大多數客戶端從來不需要訪問主伺服器,主伺服器的負載一般很輕。
Master 伺服器主要負責以下工作:為Tablet 伺服器分配Tablets、檢測新加入的或者過期失效的Table 伺服器、對Tablet 伺服器進行負載均衡、以及對保存在GFS 上的文件進行垃圾收集。除此之外,它還處理對模式的相關修改操作,例如建立表和列族。
我們使用一個三層的、類似B+樹的結構存儲Tablet 的位置信息。
第一層是一個存儲在Chubby 中的文件,它包含了Root Tablet 的位置信息。這個Chubby文件屬於Chubby服務的一部分,一旦Chubby不可用,就意味著丟失了root tablet的位置,整個Bigtable也就不可用了。
第二層是root tablet。root tablet其實是元數據表(METADATA table)的第一個分片,它保存著元數據表其它片的位置。root tablet很特別,為了保證樹的深度不變,root tablet從不分裂。
第三層是其它的元數據片,它們和root tablet一起組成完整的元數據表。每個元數據片都包含了許多用戶片的位置信息。
片的數據最終還是寫到GFS里的,片在GFS里的物理形態就是若干個SSTable文件。下圖展示了讀寫操作基本情況。
BigTable和GFS的關系
集群包括主伺服器和片伺服器,主伺服器負責將片分配給片伺服器,而具體的數據服務則全權由片伺服器負責。但是不要誤以為片伺服器真的存儲了數據(除了內存中memtable的數據),數據的真實位置只有GFS才知道,主伺服器將片分配給片伺服器的意思應該是,片伺服器獲取了片的所有SSTable文件名,片伺服器通過一些索引機制可以知道所需要的數據在哪個SSTable文件,然後從GFS中讀取SSTable文件的數據,這個SSTable文件可能分布在好幾台chunkserver上。
一個簡化的Bigtable結構圖:
結構圖以Webtable表為例,表中存儲了網易、網路和豆瓣的幾個網頁。當我們想查找網路貼吧昨天的網頁內容,可以向Bigtable發出查詢Webtable表的(com..tieba, contents:, yesterday)。
假設客戶端沒有該緩存,那麼Bigtable訪問root tablet的片伺服器,希望得到該網頁所屬的片的位置信息在哪個元數據片中。使用 METADATA.Webtable.com..tieba 為行鍵在root tablet中查找,定位到最後一個比它大的是 METADATA.Webtable.com..www ,於是確定需要的就是元數據表的片A。訪問片A的片伺服器,繼續查找 Webtable.com..tieba ,定位到 Webtable.com..www 是比它大的,確定需要的是Webtable表的片B。訪問片B的片伺服器,獲得數據。
這里需要注意的是,每個片實際都由若干SSTable文件和memtable組成,而且這些SSTable和memtable都是已排序的。這就導致查找片B時,可能需要將所有SSTable和memtable都查找一遍;另外客戶端應該不會直接從元數據表獲得SSTable的文件名,而只是獲得片屬於片伺服器的信息,通過片伺服器為代理訪問SSTable。
⑨ 淘寶的海量商品數據是如何存儲的怎麼做到查詢這么快呢
數據信息並不大嘩罩,詳細信息只在你打開商品後才進行的,只是圖片等大,但不在同襪蘆空一個告瞎表裡,查詢可以自定義,結果一般很快,