HDFS 支援寫入資料節點管理的非堆疊記憶體。資料節點會非同步地將記憶體中的資料沖洗至磁碟,因此可以從效能敏感的 IO 路徑中移除昂貴的磁碟 IO 和檢查總和運算,因此我們稱此類寫入為「延遲持久化」寫入。HDFS 提供延遲持久化寫入的盡力而為持久化保證。在複本持久化至磁碟之前,如果節點重新啟動,可能會發生罕見的資料遺失。應用程式可以選擇使用延遲持久化寫入,以犧牲一些耐用性保證來換取降低延遲。
此功能從 Apache Hadoop 2.6.0 開始提供,並在 Jira HDFS-6581 下開發。
目標使用案例是受益於寫入相對少量資料(從幾 GB 到數十 GB,視可用記憶體而定)且延遲低的應用程式。記憶體儲存空間適用於在叢集內執行且與 HDFS 資料節點並置的應用程式。我們觀察到網路複制的延遲開銷抵消了寫入記憶體的優點。
使用延遲持久化寫入的應用程式將繼續運作,如果記憶體不足或未設定,則會退回到磁碟儲存空間。
此部分列舉應用程式可以在叢集中開始使用此功能之前所需的管理步驟。
首先決定要專用於儲存在記憶體中的複本的記憶體量。在 hdfs-site.xml
中相應地設定 dfs.datanode.max.locked.memory
。這是 集中式快取管理 功能使用的相同設定。資料節點將確保延遲持久化寫入和集中式快取管理使用的組合記憶體不會超過在 dfs.datanode.max.locked.memory
中設定的量。
例如要保留 32 GB 給記憶體中的複本
<property> <name>dfs.datanode.max.locked.memory</name> <value>34359738368</value> </property>
資料節點在啟動時不會配置此記憶體。
在類 Unix 系統上,資料節點使用者的「鎖定在記憶體中的大小」ulimit(ulimit -l
)也需要增加以符合此參數(請參閱 作業系統限制 上的相關部分)。設定此值時,請記住您也需要記憶體空間來執行其他作業,例如資料節點和應用程式 JVM 堆積和作業系統頁面快取。如果與資料節點在同一個節點上執行 YARN 節點管理員程序,您也需要 YARN 容器的記憶體。
在每個資料節點上初始化 RAM 磁碟。選擇 RAM 磁碟可讓資料在資料節點程序重新啟動時持續存在。下列設定適用於大多數 Linux 發行版。目前不支援在其他平台上使用 RAM 磁碟。
tmpfs
(而非 ramfs
)Linux 支援使用兩種 RAM 磁碟 - tmpfs
和 ramfs
。tmpfs
的大小受限於 Linux 核心,而 ramfs
則會擴充至填滿所有可用的系統記憶體。tmpfs
的缺點是,在記憶體壓力下,其內容可能會換頁至磁碟。然而,許多效能敏感的部署都停用換頁,因此我們預期這在實務上不會造成問題。
HDFS 目前支援使用 tmpfs
分割區。目前正在進行新增 ramfs
的支援(請參閱 HDFS-8584)。
使用 Unix mount
指令掛載 RAM 磁碟分割區。例如,要在 /mnt/dn-tmpfs/
下掛載 32 GB 的 tmpfs
分割區
sudo mount -t tmpfs -o size=32g tmpfs /mnt/dn-tmpfs/
建議您在 /etc/fstab
中建立一個項目,以便在節點重新啟動時自動重新建立 RAM 磁碟。另一個選項是使用 /dev/shm
下的子目錄,這是大多數 Linux 發行版預設提供的 tmpfs
掛載。請確定掛載的大小大於或等於您的 dfs.datanode.max.locked.memory
設定,否則請在 /etc/fstab
中覆寫它。不建議每個資料節點使用多個 tmpfs
分割區進行延遲持續寫入。
tmpfs
磁碟區透過 hdfs-site.xml
中的 dfs.datanode.data.dir
設定,使用 RAM_DISK 儲存類型標記 tmpfs
目錄。例如,在具有三個硬碟磁碟區 /grid/0
、/grid/1
和 /grid/2
以及 tmpfs
掛載 /mnt/dn-tmpfs
的資料節點上,dfs.datanode.data.dir
必須設定如下
<property> <name>dfs.datanode.data.dir</name> <value>/grid/0,/grid/1,/grid/2,[RAM_DISK]/mnt/dn-tmpfs</value> </property>
此步驟至關重要。如果沒有 RAM_DISK 標記,HDFS 會將 tmpfs
磁碟區視為非揮發性儲存,而資料不會儲存至持續性儲存。您會在節點重新啟動時遺失資料。
請確保已啟用開啟儲存政策的全球設定 如本文檔所述。此設定預設為開啟。
應用程式會指示 HDFS 可以使用 LAZY_PERSIST
儲存政策對檔案進行延遲持續寫入。設定政策不需要管理員權限,且有下列三種方式可以設定。
hdfs storagepolicies
指令在目錄上設定政策會讓政策對目錄中的所有新檔案生效。hdfs storagepolicies
指令可依 儲存政策文件所述設定政策。
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
setStoragePolicy
方法從 Apache Hadoop 2.8.0 開始,應用程式可以用程式設定儲存政策,方法是使用 FileSystem.setStoragePolicy
。例如:
fs.setStoragePolicy(path, "LAZY_PERSIST");
LAZY_PERSIST
CreateFlag
給新檔案應用程式可以在使用 FileSystem#create
API 建立新檔案時傳遞 CreateFlag#LAZY_PERSIST
。例如:
FSDataOutputStream fos = fs.create( path, FsPermission.getFileDefault(), EnumSet.of(CreateFlag.CREATE, CreateFlag.LAZY_PERSIST), bufferLength, replicationFactor, blockSize, null);