全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Kafka數(shù)據(jù)是存在磁盤(pán)上還是內(nèi)存上?

更新時(shí)間:2021-01-12 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

1. 順序?qū)懭?/p>

因?yàn)橛脖P(pán)是機(jī)械結(jié)構(gòu),每次讀寫(xiě)都會(huì)尋址->寫(xiě)入,其中尋址是一個(gè)“機(jī)械動(dòng)作”,它是耗時(shí)的。所以硬盤(pán)“討厭”隨機(jī)I/O,喜歡順序I/O。為了提高讀寫(xiě)硬盤(pán)的速度,Kafka就是使用順序I/O。如果一個(gè)topic建立多個(gè)分區(qū)那么每個(gè)parathion都是一個(gè)文件,收到消息后Kafka會(huì)把數(shù)據(jù)插入到文件末尾。

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

64位操作系統(tǒng)中一般可以表示20G的數(shù)據(jù)文件,它的工作原理是直接利用操作系統(tǒng)的Page來(lái)實(shí)現(xiàn)文件到物理內(nèi)存的直接映射。完成映射之后你對(duì)物理內(nèi)存的操作會(huì)被同步到硬盤(pán)上。

3. Kafka高效文件存儲(chǔ)設(shè)計(jì)特點(diǎn)

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

Kafka數(shù)據(jù)存儲(chǔ)

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

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

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

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


猜你喜歡:

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

大數(shù)據(jù)的兩種計(jì)算框架對(duì)比,哪個(gè)更適合開(kāi)發(fā)?

黑馬程序員大數(shù)據(jù)基礎(chǔ)視頻教程

黑馬大數(shù)據(jù)培訓(xùn) 

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!