面對十億資料量的技術挑戰,如何對系統進行效能優化?

2021-09-23 07:53:57 字數 2368 閱讀 2278

「 這篇文章,我們來聊一聊在十億級的大資料量技術挑戰下,世界上最優秀的大資料系統之一的hadoop是如何將系統效能提公升數十倍的?

首先一起來畫個圖,回顧一下hadoop hdfs中的超大資料檔案上傳的原理。

其實說出來也很簡單,比如有個十億資料量級的超大資料檔案,可能都達到tb級了,此時這個檔案實在是太大了。

此時,hdfs客戶端會給拆成很多block,乙個block就128mb。

這個hdfs客戶端你可以理解為是雲盤系統、日誌採集系統之類的東西,比如有人上傳乙個1tb的大檔案到網盤,或者是上傳個1tb的大日誌檔案。

然後hdfs客戶端把乙個乙個的block上傳到第乙個datanode,第乙個datanode會把這個block複製乙份,做乙個副本傳送給第二個datanode,然後第二個datanode傳送乙個block副本到第三個datanode。

所以你會發現,乙個block有3個副本,分布在三颱機器上。任何一台機器宕機,資料是不會丟失的。

然後乙個tb級大檔案就被拆散成了n多個mb級的小檔案存放在很多臺機器上了,這不就是分布式儲存麼?

今天要討論的問題,就是那個hdfs客戶端上傳tb級大檔案的時候,到底是怎麼上傳呢?

如果用乙個比較原始的方式來上傳,我們大概能想到的是下面這個圖里的樣子。

其實很簡單,無非就是不停的從本地磁碟檔案用輸入流讀取資料,然後讀到一點,就立馬通過網路的輸出流寫到datanode裡去。

參見上圖,對檔案的輸入流最多就是個fileinputstream,對datanode的輸出流,最多就是個socket返回的outputstream,然後中間找乙個小的記憶體byte陣列,進行流對考就行了。從本地檔案讀一點資料,就給datanode發一點資料。

但是如果真是這麼弄,效能真是極其的低下了,網路通訊講究的是適當頻率,每次batch批量傳送,你得讀一大批資料,通過網路通訊發一批資料。不能讀一點點資料,就立馬來一次網路通訊,就發出去這一點點的資料。

如果按照上面這種原始的方式,絕對會導致網路通訊效率極其低下,大檔案上傳效能很差。相當於你可能剛讀出來幾百個位元組的資料,立馬就寫網路,卡頓個比如幾百毫秒,然後再讀下一批幾百個位元組的資料,再寫網路卡頓個幾百毫秒,這個效能很差,幾乎在工業級的大規模分布式系統中,是無法容忍的。

hadoop中的大檔案上傳如何優化效能?我們來看看下面那張圖。

你需要自己建立乙個針對本地tb級磁碟檔案的輸入流,然後讀到資料之後立馬寫入hdfs提供的fsdataoutputstream輸出流。

這個fsdataoutputstream輸出流在幹啥呢?他會天真的立馬把資料通過網路傳輸寫給datanode嗎?

答案當然是否定的!這麼幹的話,不就跟之前的那種方式一樣了!

1、chunk緩衝機制

首先,資料會被寫入乙個chunk緩衝陣列,這個chunk是乙個512位元組大小的資料片段,你可以這麼來理解。

然後這個緩衝陣列可以容納多個chunk大小的資料在裡面緩衝。光是這個緩衝,首先就可以讓客戶端快速的寫入資料了,不至於說幾百位元組就要進行一次網路傳輸,對吧?

2、packet資料報機制

接著,當chunk緩衝陣列都寫滿了之後,就會把這個chunk緩衝陣列進行一下chunk切割,切割為乙個乙個的chunk,乙個chunk是乙個資料片段。然後多個chunk會直接一次性寫入另外乙個記憶體緩衝資料結構,就是packet資料報。

乙個packet資料報,設計為可以容納127個chunk,大小大致為64mb。所以說大量的chunk會不斷的寫入packet資料報的記憶體緩衝中。通過這個packet資料報機制的設計,又可以在記憶體中容納大量的資料,進一步避免了頻繁的網路傳輸影響效能。

3、記憶體佇列非同步傳送機制

當乙個packet被塞滿了chunk之後,就會將這個packet放入乙個記憶體佇列來進行排隊,然後有乙個datastreamer執行緒會不斷的獲取佇列中的packet資料報,通過網路傳輸直接寫乙個packet資料報給datanode。

如果乙個block預設是128mb的話,那麼乙個block缺省會對應兩個packet資料報,每個packet資料報是64mb。

也就是說傳送兩個packet資料報datanode之後,就會發乙個通知說,乙個block的資料都傳輸完畢,那datanode就知道自己收到了乙個block了,包含了人家傳送過來的兩個packet資料報。

總結:ok,大家看完了上面的那個圖以及hadoop採取的大檔案上傳機制,是不是感覺設計的很巧妙?

工業級的大規模分布式系統,都不會採取特別簡單的**和模式,那樣效能很低下。這裡都有大量的併發優化、網路io優化、記憶體優化、磁碟讀寫優化的架構設計、生產方案在裡面。

所以大家觀察上面那個圖,hdfs客戶端可以快速的將tb級大檔案的資料讀出來,然後快速的交給hdfs的輸出流寫入記憶體,基於記憶體裡的chunk緩衝機制、packet資料報機制、記憶體佇列非同步傳送機制,絕對不會有任何網路傳輸的卡頓,導致大檔案的上傳速度變慢。反而通過上述幾種機制,可以大幅度提公升乙個tb級大檔案的上傳效能。

Jcs對大資料量的處理方案

jcs的原理是利用快取獲取使用者所需要的資料,減少對資料庫的訪問,從而提高儲存效率。實現該方案的需要解決兩個問題 1.快取的資料從哪來 2.快取的資料的有效性 1.快取的資料從哪來 從根源來講,快取的資料應當在查詢過資料後放入cache,通常使用者在進行業務流程時,查詢資料 放入快取。但是這樣存在乙...

mysql如何讓設計資料量較少的一對多關係資料表

當我們在設計資料庫的資料表時,經常會遇到一對多的資料結構,如新聞的tag等,比如我們在設計資料表的時候,就碰到了這個問題,當時涉及樓盤資料表 house 物業性質 樓盤的裝修性質等情況的時候,因為乙個樓盤可能會涉及多個物業性質,而且物業性質的數量並不是很多。為了便於搜尋,如果把所有物業性質的id用分...

如何解決匯出大資料量的Excel,FullGc問題

public static void main string args int groupsize 10 定長sheet int length dataset.size 能分幾段 計算需要匯出的資料可以分成多少組 int num length groupsize 1 groupsize 為何用 sx...