首頁技術文章正文

Kafka數據是存在磁盤上還是內存上?

更新時間:2021-01-12 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif

1. 順序寫入

因為硬盤是機械結構,每次讀寫都會尋址->寫入,其中尋址是一個“機械動作”,它是耗時的。所以硬盤“討厭”隨機I/O,喜歡順序I/O。為了提高讀寫硬盤的速度,Kafka就是使用順序I/O。如果一個topic建立多個分區(qū)那么每個parathion都是一個文件,收到消息后Kafka會把數據插入到文件末尾。

2. Memory Mapped Files(內存映射文件)

64位操作系統(tǒng)中一般可以表示20G的數據文件,它的工作原理是直接利用操作系統(tǒng)的Page來實現文件到物理內存的直接映射。完成映射之后你對物理內存的操作會被同步到硬盤上。

3. Kafka高效文件存儲設計特點

Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤占用。通過索引信息可以快速定位
message和確定response的 大大小。通過index元數據全部映射到memory(內存映射文件),可以避免segment file的IO磁盤操作。通過索引文件稀疏存儲,可以大幅降低index文件元數據占用空間大小。

Kafka數據存儲

(1)數據文件的分段Kafka解決查詢效率的手段之一是將數據文件分段,比如有100條Message,它們的offset是從0到99。假設將數據文件分成5段,第一段為0-19,第二段為20-39,以此類推,每段放在一個單獨的數據文件里面,數據文件以該段中 小的offset命名。這樣在查找指定offset的Message的時候,用二分查找就可以定位到該Message在哪個段中。

(2)為數據文件建索引數據文件分段使得可以在一個較小的數據文件中查找對應offset的Message 了,但是這依然需要順序掃描才能找到對應offset的Message。
為了進一步提高查找的效率,Kafka為每個分段后的數據文件建立了索引文件,文件名與數據文件的名字是一樣的,只是文件擴展名為.index。

索引文件中包含若干個索引條目,每個條目表示數據文件中一條Message的索引。索引包含兩個部分(均為4個字節(jié)的數字),分別為相對offset和position。相對offset:因為數據文件分段以后,每個數據文件的起始offset不為0,相對offset表示這條Message相對于其所屬數據文件中 小的offset的大小。舉例,分段后的一個數據文件的offset是從20開始,那么offset為25的Message在index文件中的相對offset就是25-20 = 5。存儲相對offset可以減小索引文件占用的空間。

position,表示該條Message在數據文件中的絕對位置。只要打開文件并移動文件指針到這個 position就可以讀取對應的Message了。index文件中并沒有為數據文件中的每條Message建立索引,而是采用了稀疏存儲的方式,每隔一定字節(jié)的數據建立一條索引。這樣避免了索引文件占用過多的空間,從而可以將索引文件保留在內存中。但缺點是沒有建立索引的Message也不能一次定位到其在數據文件的位置,從而需要做一次順序掃描,但是這次順序掃描的范圍就很小了。


猜你喜歡:

大數據流處理:Flume、Kafka和NiFi的區(qū)別

大數據的兩種計算框架對比,哪個更適合開發(fā)?

黑馬程序員大數據基礎視頻教程

黑馬大數據培訓 

分享到:
在線咨詢 我要報名
和我們在線交談!