當前位置:首頁 » 存儲配置 » 用map文件存儲大數據

用map文件存儲大數據

發布時間: 2022-09-21 11:52:47

❶ MapRece 知識

客戶端(client)
提交MapRece作業
JobTracker
1.作業調度:將一個作業(Job)分成若干個子任務分發到taskTraker中去執行
2.任務監控:TaskTracker發送心跳給JobTracker報告自己的運行狀態,以讓JobTracker能夠監控到他
3.資源管理:每個任務向JobTracker申請資源
4.監控過程中發現失敗或者運行過慢的任務,對他進行重新啟動
TaskTracker
主動發送心跳給jobTracker並與JobTracker通信,從而接受到JobTracker發送過來需要執行的任務

資源表示模型
用於描述資源表示形式,Hadoop1.0使用「槽位(slot)」組織各個節點的資源,為了簡化資源的管理,Hadoop將各個節點上資源(CPU、內存、網路IO、磁碟IO等等)等量切分成若干份,每一份用「slot」表示,同時規定一個task可根據實際情況需要佔用多個」slot」。
簡單的說:hadoop1.0將多維度的資源進行了抽象,使用「slot」來表示,從而簡化對資源的管理。

資源分配模型
而資源分配模型則決定如何將資源分配給各個作業/任務,在Hadoop中,這一部分由一個插拔式的調度器完成。

更進一步說,slot相當於運行的「許可證」,一個任務只有獲得「許可證」後,才能夠獲得運行的機會,這也意味著,每一個節點上的slot的數量決定了當前節點能夠並發執行多少個任務。Hadoop1.0為了區分MapTask跟ReceTask所使用資源的差異,進一步將slot分為MapSlot跟ReceSlot,他們分別只能被MapTask跟ReceTask使用。

Hadoop集群管理員可根據各個節點硬體配置和應用特點為它們分配不同的map slot數(由參數mapred.tasktracker.map.tasks.maximum指定)和rece slot數(由參數mapred.tasktrackerrece.tasks.maximum指定)

靜態資源配置 。 採用了靜態資源設置策略,即每個節點事先配置好可用的slot總數,這些slot數目一旦啟動後無法再動態修改。
資源無法共享 。 Hadoop 1.0將slot分為Map slot和Rece slot兩種,且不允許共享。對於一個作業,剛開始運行時,Map slot資源緊缺而Rece slot空閑,當Map Task全部運行完成後,Rece slot緊缺而Map slot空閑。很明顯,這種區分slot類別的資源管理方案在一定程度上降低了slot的利用率。
資源劃分粒度過大 。資源劃分粒度過大,往往會造成節點資源利用率過高或者過低 ,比如,管理員事先規劃好一個slot代表2GB內存和1個CPU,如果一個應用程序的任務只需要1GB內存,則會產生「資源碎片」,從而降低集群資源的利用率,同樣,如果一個應用程序的任務需要3GB內存,則會隱式地搶占其他任務的資源,從而產生資源搶占現象,可能導致集群利用率過高。
沒引入有效的資源隔離機制 。Hadoop 1.0僅採用了基於jvm的資源隔離機制,這種方式仍過於粗糙,很多資源,比如CPU,無法進行隔離,這會造成同一個節點上的任務之間干擾嚴重。

主要是InputFormat。InputFormat類有2個重要的作用:
1)將輸入的數據切分為多個邏輯上的InputSplit,其中每一個InputSplit作為一個map的輸入。
2)提供一個RecordReader,用於將InputSplit的內容轉換為可以作為map輸入的k,v鍵值對。

系統默認的RecordReader是 LineRecordReader ,它是 TextInputFormat (FileInputFormat的子類)對應的RecordReader; Map讀入的Key值是偏移量,Value是行內容。

兩個Mapper各自輸入一塊數據,由鍵值對構成,對它進行加工(加上了個字元n),然後按加工後的數據的鍵進行分組,相同的鍵到相同的機器。這樣的話,第一台機器分到了鍵nk1和nk3,第二台機器分到了鍵nk2。

接下來再在這些Recers上執行聚合操作(這里執行的是是count),輸出就是nk1出現了2次,nk3出現了1次,nk2出現了3次。從全局上來看,MapRece就是一個分布式的GroupBy的過程。

從上圖可以看到,Global Shuffle左邊,兩台機器執行的是Map。Global Shuffle右邊,兩台機器執行的是Rece。

Hadoop會將輸入數據劃分成等長的數據塊,成為數據分片。Hadoop會為每個分片構建一個map任務。並行的處理分片時間肯定會少於處理整個大數據塊的時間,但由於各個節點性能及作業運行情況的不同,每個分片的處理時間可能不一樣,因此, 把數據分片切分的更細可以得到更好的負載均衡

但另一方面,分片太小的話,管理分片和構建map任務的時間將會增多。因此,需要在hadoop分片大小和處理分片時間之間做一個權衡。對大多數作業來說,一個分片大小為64MB比較合適,其實,Hadoop的默認塊大小也是64MB。

我們上面看到了hadoop的數據塊大小與最佳分片大小相同,這樣的話,數據分片就不容易跨數據塊存儲,因此,一個map任務的輸入分片便可以直接讀取本地數據塊,這就 避免了再從其它節點讀取分片數據 ,從而節省了網路開銷。

map的任務輸出是 寫入到本地磁碟而非HDFS的 。那麼為什麼呢?因為map任務輸出的是中間結果,一旦map任務完成即會被刪除,如果把它存入HDFS中並實現備份容錯,未免有點大題小做。如果一個map任務失敗,hadoop會再另一個節點重啟map一個map任務。

而rece任務並不具備數據本地化優勢——單個rece任務的輸入通常來自所有mapper輸出。一般排序過的map輸出需要通過 網路傳輸 發送到運行rece任務的節點,並在rece端進行合並。rece的輸出通常需要存儲到HDFS中以實現可靠存儲。每個rece輸出HDFS塊第一個復本會存儲在本地節點,而其它復本則存儲到其它節點,因此rece輸出也需要佔用網路帶寬。

1.調整rece個數方法(1)
(1)每個Rece處理的數據量默認是256MB

(2)每個任務最大的rece數,默認為1009

(3)計算recer數的公式

2.調整rece個數方法(2)
在hadoop的mapred-default.xml文件中修改,設置每個job的Rece個數

3.rece個數並不是越多越好
(1)過多的啟動和初始化rece也會消耗時間和資源;
(2)另外,有多少個rece,就會有多少個輸出文件,如果產生了很多個小文件,那麼如果這些小文件作為下一個任務的輸入,則也會出現小文件過多的問題;
在設置rece個數的時候也需要考慮這兩個原則:處理大數據利用適合的rece數;使單個rece任務處理數據大小要合適;

在進行map計算之前,maprece會根據輸入文件計算輸入分片(input split),每個輸入分片(input split)針對一個map任務,輸入分片(input split)存儲的並非數據本身,而是一個分片長度和一個記錄數據的位置的數組,輸入分片(input split)往往和hdfs的block(塊)關系很密切,我們沒有設置分片的范圍的時候,分片大小是由block塊大小決定的,和它的大小一樣。

比如把一個258MB的文件上傳到HDFS上,假設block塊大小是128MB,那麼它就會被分成三個block塊,與之對應產生三個split,所以最終會產生三個map task。我又發現了另一個問題,第三個block塊里存的文件大小隻有2MB,而它的block塊大小是128MB,那它實際佔用Linux file system的多大空間?答案是實際的文件大小,而非一個塊的大小。最後一個問題是: 如果hdfs佔用Linux file system的磁碟空間按實際文件大小算,那麼這個」塊大小「有必要存在嗎?其實塊大小還是必要的,一個顯而易見的作用就是當文件通過append操作不斷增長的過程中,可以通過來block size決定何時split文件。

1.每個輸入分片會讓一個map任務來處理,map輸出的結果會暫且放在一個環形內存緩沖區中(該緩沖區的大小默認為100M,由io.sort.mb屬性控制),當該緩沖區快要溢出時(默認為緩沖區大小的80%,由io.sort.spill.percent屬性控制),會在本地文件系統中創建一個溢出文件,將該緩沖區中的數據寫入這個文件。

2.在寫入磁碟之前,線程首先根據rece任務的數目將數據劃分為相同數目的分區,也就是一個rece任務對應一個分區的數據。這樣做是為了避免有些rece任務分配到大量數據,而有些rece任務卻分到很少數據,甚至沒有分到數據的尷尬局面。其實分區就是對數據進行hash的過程。然後對每個分區中的數據進行 排序 ,如果此時設置了Combiner,將排序後的結果進行Combiner操作,主要是在map計算出中間文件前做一個簡單的合並重復key值的操作,這樣做的目的是讓盡可能少的數據寫入到磁碟。

3.當map任務輸出最後一個記錄時,可能會有很多的溢出文件,這時需要將這些文件合並。合並的過程中會不斷地進行排序和Combiner操作,目的有兩個:1.盡量減少每次寫入磁碟的數據量;2.盡量減少下一復制階段網路傳輸的數據量。最後合並成了一個 已分區且已排序 的文件。為了減少網路傳輸的數據量,這里可以將數據壓縮,只要將mapred.compress.map.out設置為true就可以了。

4.將分區中的數據 拷貝 (網路傳輸)給相對應的rece任務。有人可能會問:分區中的數據怎麼知道它對應的rece是哪個呢?其實map任務一直和其父TaskTracker保持聯系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整個集群中的宏觀信息。只要rece任務向JobTracker獲取對應的map輸出位置就ok了哦。

Rece端:
1.Rece會接收到不同map任務傳來的數據,並且每個map傳來的數據都是有序的。如果rece端接受的數據量相當小,則直接存儲在內存中(緩沖區大小由mapred.job.shuffle.input.buffer.percent屬性控制,表示用作此用途的堆空間的百分比),如果數據量超過了該緩沖區大小的一定比例(由mapred.job.shuffle.merge.percent決定),則對 數據合並 溢寫 到磁碟中。

2.隨著溢寫文件的增多,後台線程會將它們合並成一個更大的有序的文件,這樣做是為了給後面的合並節省時間。其實不管在map端還是rece端,MapRece都是反復地執行排序,合並操作,現在終於明白了有些人為什麼會說:排序是hadoop的靈魂。

3.合並的過程中會產生許多的中間文件(寫入磁碟了),但MapRece會讓寫入磁碟的數據盡可能地少,並且 最後一次合並的結果 並沒有寫入磁碟,而是直接輸入到rece函數。

Read階段 :MapTask通過用戶編寫的RecordReader,從輸入InputSplit中解析出一個個key/value

Map階段 :該節點主要是將解析出的key/value交給用戶編寫map()函數處理,並產生一系列新的key/value。

Collect收集階段 :在用戶編寫map()函數中,當數據處理完成後,一般會調用OutputCollection.collect()輸出結果。在該函數內部,它會將生成的 key/value分區 (調用Partitioner),並寫入一個環形內存緩沖區中。

Spill階段 :即「溢寫」,當環形緩沖區滿後,MapRece會將數據寫入本地磁碟上,生成一個臨時文件。需要注意的是,將數據寫入本地磁碟之前,先要對數據進行一次本地 排序 ,並在必要時對數據進行 combiner 壓縮 等操作。

溢寫階段詳情:

合並階段 :當所有數據處理完成後,MapTask對所有臨時文件進行一次合並,以確保最終只會生成一個數據文件。在進行文件合並過程中,MapTask以分區為單位進行合並。對於某個分區,它將採用多輪遞歸合並的方式。每輪合並io.sort.factor(默認100)個文件,並將產生的文件重新加入待合並列表中,對文件排序後,重復以上過程,直到最終得到一個大文件。讓一個MapTask最終只生成一個數據文件,可避免同時打開大量文件和同時讀取大量小文件產生的隨機讀取帶來的開銷。

java static map 靜態的集合類型變數(大數據)多次重復賦值對內存佔用會產生什麼樣的影響

這種做法是個不好做法。
可以:1 實用緩存組件 如OSCache 之類
2 如果不用緩存組件 ,可以使用軟引用,來使JVM能正常釋放內存。

❸ 如何架構大數據系統 hadoop

大數據數量龐大,格式多樣化。大量數據由家庭、製造工廠和辦公場所的各種設備、互聯網事務交易、社交網路的活動、自動化感測器、移動設備以及科研儀器等生成。它的爆炸式增長已超出了傳統IT基礎架構的處理能力,給企業和社會帶來嚴峻的數據管理問題。因此必須開發新的數據架構,圍繞「數據收集、數據管理、數據分析、知識形成、智慧行動」的全過程,開發使用這些數據,釋放出更多數據的隱藏價值。

一、大數據建設思路

1)數據的獲得

四、總結

基於分布式技術構建的大數據平台能夠有效降低數據存儲成本,提升數據分析處理效率,並具備海量數據、高並發場景的支撐能力,可大幅縮短數據查詢響應時間,滿足企業各上層應用的數據需求。

❹ bitmap能存放的最大數據是多少

redis的bitmap能設置最大的長度是多少, 為什麼可以設置的最大長度位數是2^32, 怎麼計算bitmap會佔用多大的空間





前提: 實際上, redis只支持5種數據類型. 並沒有bitmap. 也就是bitmap是基於redis的字元串類型的. 而一個字元串類型最多存儲512M.


首先: 計算機的單位換算先了解下


8 bit = 1byte


1024 byte = 1kb


1024 kb = 1Mb


其次:


我們使用的bitmap指令SETBIT key offset value, 這個指令就是將第offset設置成0或1. 比如 SETBIT ss 1000 1 //就是將1000位置為1. 1 bit就是1位, 所以我們只要將512M換算成bit, 那麼就知道bitmap支持的最大設置長度了. 計算如下


8 * 1024 * 1024 * 512 = 2^32 (所以這個結果就是這么來的)



怎麼計算自己的bitmap會大概佔用多大的存儲空間呢?


舉個栗子: 今有一個bitmap最大長度1024, 需要佔用多大的空間?


解: 長度1024也就是他需要1024個位(bit), 或者單位為byte就是需要 1024 / 8, 即需要128byte

————————————————

版權聲明:本文為CSDN博主「Day____Day____Up」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_37281289/article/details/106834014

❺ 大數據存儲技術都有哪些

1. 數據採集:在大數據的生命周期中,數據採集是第一個環節。按照MapRece應用系統的分類,大數據採集主要來自四個來源:管理信息系統、web信息系統、物理信息系統和科學實驗系統。

2. 數據訪問:大數據的存儲和刪除採用不同的技術路線,大致可分為三類。第一類主要面向大規模結構化數據。第二類主要面向半結構化和非結構化數據。第三類是面對結構化和非結構化的混合大數據,

3。基礎設施:雲存儲、分布式文件存儲等。數據處理:對於收集到的不同數據集,可能會有不同的結構和模式,如文件、XML樹、關系表等,表現出數據的異構性。對於多個異構數據集,需要進行進一步的集成或集成處理。在對不同數據集的數據進行收集、排序、清理和轉換後,生成一個新的數據集,為後續的查詢和分析處理提供統一的數據視圖。

5. 統計分析:假設檢驗、顯著性檢驗、差異分析、相關分析、t檢驗、方差分析、卡方分析、偏相關分析、距離分析、回歸分析、簡單回歸分析、多元回歸分析、逐步回歸、回歸預測、殘差分析,嶺回歸、logistic回歸、曲線估計、因子分析、聚類分析、主成分分析等方法介紹了聚類分析、因子分析、快速聚類與聚類、判別分析、對應分析等方法,多元對應分析(最優尺度分析)、bootstrap技術等。

6. 數據挖掘:目前需要改進現有的數據挖掘和機器學習技術;開發數據網路挖掘、特殊群挖掘、圖挖掘等新的數據挖掘技術;突破基於對象的數據連接、相似性連接等大數據融合技術;突破面向領域的大數據挖掘技術如用戶興趣分析、網路行為分析、情感語義分析等挖掘技術。

7. 模型預測:預測模型、機器學習、建模與模擬。

8. 結果:雲計算、標簽雲、關系圖等。

關於大數據存儲技術都有哪些,青藤小編就和您分享到這里了。如果您對大數據工程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於數據分析師、大數據工程師的技巧及素材等內容,可以點擊本站的其他文章進行學習。

❻ hadoop是怎麼存儲大數據的

Hadoop本身是分布式框架,如果在hadoop框架下,需要配合hbase,hive等工具來進行大數據計算。如果具體深入還要了解HDFS,Map/Rece,任務機制等等。如果要分析還要考慮其他分析展現工具。
大數據還有分析才有價值
用於分析大數據的工具主要有開源與商用兩個生態圈。開源大數據生態圈:
1、Hadoop
HDFS、HadoopMapRece,
HBase、Hive
漸次誕生,早期Hadoop生態圈逐步形成。
2、.
Hypertable是另類。它存在於Hadoop生態圈之外,但也曾經有一些用戶。
3、NoSQL,membase、MongoDb商用大數據生態圈:1、一體機資料庫/數據倉庫:IBM
PureData(Netezza),
OracleExadata,
SAP
Hana等等。2、數據倉庫:TeradataAsterData,
EMC
GreenPlum,
HPVertica
等等。3、數據集市:QlikView、
Tableau

以及國內的Yonghong
Data
Mart

c語言處理文件里的大數據

C語言處理大數據一般有三種處理方法:
1、分段處理,即無論文件多大,程序中使用的永遠只是一小段部分,可以使用一個緩沖區,根據用戶交互輸入,分段的輸出。
2、使用內存文件映射,這是最常用的文件的處理方法,Linux和Windows都提供一種內存文件映射的機制,以Windows為例,可以調用 CreateFile()、 CreateFileMapping()以及 MapViewOfFile()三個函數來完成內存文件映射。
3、使用資料庫,藉助SQL查詢語言對大數據進行操作。

❽ redis 和map存儲有什麼區別

Redis的作者Salvatore Sanfilippo曾經對這兩種基於內存的數據存儲系統進行過比較:
Redis支持伺服器端的數據操作:Redis相比Memcached來說,擁有更多的數據結構和並支持更豐富的數據操作,通常在Memcached里,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網路IO的次數和數據體積。在Redis中,這些復雜的操作通常和一般的GET/SET一樣高效。所以,如果需要緩存能夠支持更復雜的結構和操作,那麼Redis會是不錯的選擇。
內存使用效率對比:使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。
性能對比:由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還是稍有遜色。
具體為什麼會出現上面的結論,以下為收集到的資料:
1、數據類型支持不同
與Memcached僅支持簡單的key-value結構的數據記錄不同,Redis支持的數據類型要豐富得多。最為常用的數據類型主要由五種:String、Hash、List、Set和Sorted Set。Redis內部使用一個redisObject對象來表示所有的key和value。redisObject最主要的信息如圖所示:

type代表一個value對象具體是何種數據類型,encoding是不同數據類型在redis內部的存儲方式,比如:type=string代表value存儲的是一個普通字元串,那麼對應的encoding可以是raw或者是int,如果是int則代表實際redis內部是按數值型類存儲和表示這個字元串的,當然前提是這個字元串本身可以用數值表示,比如:」123″ 「456」這樣的字元串。只有打開了Redis的虛擬內存功能,vm欄位欄位才會真正的分配內存,該功能默認是關閉狀態的。
1)String
常用命令:set/get/decr/incr/mget等;
應用場景:String是最常用的一種數據類型,普通的key/value存儲都可以歸為此類;
實現方式:String在redis內部存儲默認就是一個字元串,被redisObject所引用,當遇到incr、decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int。
2)Hash
常用命令:hget/hset/hgetall等
應用場景:我們要存儲一個用戶信息對象數據,其中包括用戶ID、用戶姓名、年齡和生日,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;
實現方式:Redis的Hash實際是內部存儲的Value為一個HashMap,並提供了直接存取這個Map成員的介面。如圖所示,Key是用戶ID, value是一個Map。這個Map的key是成員的屬性名,value是屬性值。這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis里稱內部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據。當前HashMap的實現有兩種方式:當HashMap的成員比較少時Redis為了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,這時對應的value的redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。

3)List
常用命令:lpush/rpush/lpop/rpop/lrange等;
應用場景:Redis list的應用場景非常多,也是Redis最重要的數據結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現;
實現方式:Redis list的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷,Redis內部的很多實現,包括發送緩沖隊列等也都是用的這個數據結構。
4)Set
常用命令:sadd/spop/smembers/sunion等;
應用場景:Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的;
實現方式:set 的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。
5)Sorted Set
常用命令:zadd/zrange/zrem/zcard等;
應用場景:Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優先順序(score)的參數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重復的集合列表,那麼可以選擇sorted set數據結構,比如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。
實現方式:Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表裡存放的是所有的成員,排序依據是HashMap里存的score,使用跳躍表的結構可以獲得比較高的查找效率,並且在實現上比較簡單。

❾ hadoop是怎麼存儲大數據的

Hadoop中有很多方法可以加入多個數據集。MapRece提供了Map端和Rece端的數據連接。這些連接是非平凡的連接,並且可能會是非常昂貴的操作。Pig和Hive也具有同等的能力來申請連接到多個數據集。Pig提供了復制連接,合並連接和傾斜連接(skewed join),並且Hive提供了map端的連接和完整外部連接來分析數據。

一個重要的事實是,通過使用各種工具,比如MapRece、Pig和Hive等,數據可以基於它們的內置功能和實際需求來使用它們。至於在Hadoop分析大量數據,Anoop指出,通常,在大數據/Hadoop的世界,一些問題可能並不復雜,並且解決方案也是直截了當的,但面臨的挑戰是數據量。在這種情況下需要不同的解決辦法來解決問題。

一些分析任務是從日誌文件中統計明確的ID的數目、在特定的日期范圍內改造存儲的數據、以及網友排名等。所有這些任務都可以通過Hadoop中的多種工具和技術如MapRece、Hive、Pig、Giraph和Mahout等來解決。這些工具在自定義常式的幫助下可以靈活地擴展它們的能力。

❿ 如何實現企業數據 大數據平台 分布式存放

Hadoop在可伸縮性、健壯性、計算性能和成本上具有無可替代的優勢,事實上已成為當前互聯網企業主流的大數據分析平台。本文主要介紹一種基於Hadoop平台的多維分析和數據挖掘平台架構。作為一家互聯網數據分析公司,我們在海量數據的分析領域那真是被「逼上樑山」。多年來在嚴苛的業務需求和數據壓力下,我們幾乎嘗試了所有可能的大數據分析方法,最終落地於Hadoop平台之上。
1. 大數據分析大分類
Hadoop平台對業務的針對性較強,為了讓你明確它是否符合你的業務,現粗略地從幾個角度將大數據分析的業務需求分類,針對不同的具體需求,應採用不同的數據分析架構。
按照數據分析的實時性,分為實時數據分析和離線數據分析兩種。
實時數據分析一般用於金融、移動和互聯網B2C等產品,往往要求在數秒內返回上億行數據的分析,從而達到不影響用戶體驗的目的。要滿足這樣的需求,可以採用精心設計的傳統關系型資料庫組成並行處理集群,或者採用一些內存計算平台,或者採用HDD的架構,這些無疑都需要比較高的軟硬體成本。目前比較新的海量數據實時分析工具有EMC的Greenplum、SAP的HANA等。
對於大多數反饋時間要求不是那麼嚴苛的應用,比如離線統計分析、機器學習、搜索引擎的反向索引計算、推薦引擎的計算等,應採用離線分析的方式,通過數據採集工具將日誌數據導入專用的分析平台。但面對海量數據,傳統的ETL工具往往徹底失效,主要原因是數據格式轉換的開銷太大,在性能上無法滿足海量數據的採集需求。互聯網企業的海量數據採集工具,有Facebook開源的Scribe、LinkedIn開源的Kafka、淘寶開源的Timetunnel、Hadoop的Chukwa等,均可以滿足每秒數百MB的日誌數據採集和傳輸需求,並將這些數據上載到Hadoop中央系統上。
按照大數據的數據量,分為內存級別、BI級別、海量級別三種。
這里的內存級別指的是數據量不超過集群的內存最大值。不要小看今天內存的容量,Facebook緩存在內存的Memcached中的數據高達320TB,而目前的PC伺服器,內存也可以超過百GB。因此可以採用一些內存資料庫,將熱點數據常駐內存之中,從而取得非常快速的分析能力,非常適合實時分析業務。圖1是一種實際可行的MongoDB分析架構。

圖1 用於實時分析的MongoDB架構
MongoDB大集群目前存在一些穩定性問題,會發生周期性的寫堵塞和主從同步失效,但仍不失為一種潛力十足的可以用於高速數據分析的NoSQL。
此外,目前大多數服務廠商都已經推出了帶4GB以上SSD的解決方案,利用內存+SSD,也可以輕易達到內存分析的性能。隨著SSD的發展,內存數據分析必然能得到更加廣泛的應用。
BI級別指的是那些對於內存來說太大的數據量,但一般可以將其放入傳統的BI產品和專門設計的BI資料庫之中進行分析。目前主流的BI產品都有支持TB級以上的數據分析方案。種類繁多,就不具體列舉了。
海量級別指的是對於資料庫和BI產品已經完全失效或者成本過高的數據量。海量數據級別的優秀企業級產品也有很多,但基於軟硬體的成本原因,目前大多數互聯網企業採用Hadoop的HDFS分布式文件系統來存儲數據,並使用MapRece進行分析。本文稍後將主要介紹Hadoop上基於MapRece的一個多維數據分析平台。
數據分析的演算法復雜度
根據不同的業務需求,數據分析的演算法也差異巨大,而數據分析的演算法復雜度和架構是緊密關聯的。舉個例子,Redis是一個性能非常高的內存Key-Value NoSQL,它支持List和Set、SortedSet等簡單集合,如果你的數據分析需求簡單地通過排序,鏈表就可以解決,同時總的數據量不大於內存(准確地說是內存加上虛擬內存再除以2),那麼無疑使用Redis會達到非常驚人的分析性能。
還有很多易並行問題(Embarrassingly Parallel),計算可以分解成完全獨立的部分,或者很簡單地就能改造出分布式演算法,比如大規模臉部識別、圖形渲染等,這樣的問題自然是使用並行處理集群比較適合。
而大多數統計分析,機器學習問題可以用MapRece演算法改寫。MapRece目前最擅長的計算領域有流量統計、推薦引擎、趨勢分析、用戶行為分析、數據挖掘分類器、分布式索引等。
2. 面對大數據OLAP大一些問題

OLAP分析需要進行大量的數據分組和表間關聯,而這些顯然不是NoSQL和傳統資料庫的強項,往往必須使用特定的針對BI優化的資料庫。比如絕大多數針對BI優化的資料庫採用了列存儲或混合存儲、壓縮、延遲載入、對存儲數據塊的預統計、分片索引等技術。

Hadoop平台上的OLAP分析,同樣存在這個問題,Facebook針對Hive開發的RCFile數據格式,就是採用了上述的一些優化技術,從而達到了較好的數據分析性能。如圖2所示。
然而,對於Hadoop平台來說,單單通過使用Hive模仿出SQL,對於數據分析來說遠遠不夠,首先Hive雖然將HiveQL翻譯MapRece的時候進行了優化,但依然效率低下。多維分析時依然要做事實表和維度表的關聯,維度一多性能必然大幅下降。其次,RCFile的行列混合存儲模式,事實上限制死了數據格式,也就是說數據格式是針對特定分析預先設計好的,一旦分析的業務模型有所改動,海量數據轉換格式的代價是極其巨大的。最後,HiveQL對OLAP業務分析人員依然是非常不友善的,維度和度量才是直接針對業務人員的分析語言。
而且目前OLAP存在的最大問題是:業務靈活多變,必然導致業務模型隨之經常發生變化,而業務維度和度量一旦發生變化,技術人員需要把整個Cube(多維立方體)重新定義並重新生成,業務人員只能在此Cube上進行多維分析,這樣就限制了業務人員快速改變問題分析的角度,從而使所謂的BI系統成為死板的日常報表系統。
使用Hadoop進行多維分析,首先能解決上述維度難以改變的問題,利用Hadoop中數據非結構化的特徵,採集來的數據本身就是包含大量冗餘信息的。同時也可以將大量冗餘的維度信息整合到事實表中,這樣可以在冗餘維度下靈活地改變問題分析的角度。其次利用Hadoop MapRece強大的並行化處理能力,無論OLAP分析中的維度增加多少,開銷並不顯著增長。換言之,Hadoop可以支持一個巨大無比的Cube,包含了無數你想到或者想不到的維度,而且每次多維分析,都可以支持成千上百個維度,並不會顯著影響分析的性能。


而且目前OLAP存在的最大問題是:業務靈活多變,必然導致業務模型隨之經常發生變化,而業務維度和度量一旦發生變化,技術人員需要把整個Cube(多維立方體)重新定義並重新生成,業務人員只能在此Cube上進行多維分析,這樣就限制了業務人員快速改變問題分析的角度,從而使所謂的BI系統成為死板的日常報表系統。
3. 一種Hadoop多維分析平台的架構
整個架構由四大部分組成:數據採集模塊、數據冗餘模塊、維度定義模塊、並行分 析模塊。

數據採集模塊採用了Cloudera的Flume,將海量的小日誌文件進行高速傳輸和合並,並能夠確保數據的傳輸安全性。單個collector宕機之後,數據也不會丟失,並能將agent數據自動轉移到其他的colllecter處理,不會影響整個採集系統的運行。如圖5所示。

數據冗餘模塊不是必須的,但如果日誌數據中沒有足夠的維度信息,或者需要比較頻繁地增加維度,則需要定義數據冗餘模塊。通過冗餘維度定義器定義需要冗餘的維度信息和來源(資料庫、文件、內存等),並指定擴展方式,將信息寫入數據日誌中。在海量數據下,數據冗餘模塊往往成為整個系統的瓶頸,建議使用一些比較快的內存NoSQL來冗餘原始數據,並採用盡可能多的節點進行並行冗餘;或者也完全可以在Hadoop中執行批量Map,進行數據格式的轉化。

維度定義模塊是面向業務用戶的前端模塊,用戶通過可視化的定義器從數據日誌中定義維度和度量,並能自動生成一種多維分析語言,同時可以使用可視化的分析器通過GUI執行剛剛定義好的多維分析命令。
並行分析模塊接受用戶提交的多維分析命令,並將通過核心模塊將該命令解析為Map-Rece,提交給Hadoop集群之後,生成報表供報表中心展示。
核心模塊是將多維分析語言轉化為MapRece的解析器,讀取用戶定義的維度和度量,將用戶的多維分析命令翻譯成MapRece程序。核心模塊的具體邏輯如圖6所示。

圖6中根據JobConf參數進行Map和Rece類的拼裝並不復雜,難點是很多實際問題很難通過一個MapRece Job解決,必須通過多個MapRece Job組成工作流(WorkFlow),這里是最需要根據業務進行定製的部分。圖7是一個簡單的MapRece工作流的例子。

MapRece的輸出一般是統計分析的結果,數據量相較於輸入的海量數據會小很多,這樣就可以導入傳統的數據報表產品中進行展現。

熱點內容
idle運行python文件 發布:2025-05-15 17:12:19 瀏覽:230
主存儲器屬於外存儲器嗎 發布:2025-05-15 16:54:00 瀏覽:755
顯示屏看股票都有哪些配置 發布:2025-05-15 16:52:39 瀏覽:397
android行情 發布:2025-05-15 16:52:25 瀏覽:438
活動上線前伺服器配置要注意什麼 發布:2025-05-15 16:38:43 瀏覽:949
王者榮耀安卓區怎麼免費轉蘋果 發布:2025-05-15 16:18:02 瀏覽:763
威朗pro高配都有哪些配置 發布:2025-05-15 15:57:09 瀏覽:958
資料庫分頁查詢數據 發布:2025-05-15 15:45:13 瀏覽:522
phpmyadmin上傳限制 發布:2025-05-15 15:39:52 瀏覽:432
如何給手機配置真正的電腦 發布:2025-05-15 15:39:52 瀏覽:765