HDFS 中的記憶體儲存支援

簡介

HDFS 支援寫入資料節點管理的非堆疊記憶體。資料節點會非同步地將記憶體中的資料沖洗至磁碟,因此可以從效能敏感的 IO 路徑中移除昂貴的磁碟 IO 和檢查總和運算,因此我們稱此類寫入為「延遲持久化」寫入。HDFS 提供延遲持久化寫入的盡力而為持久化保證。在複本持久化至磁碟之前,如果節點重新啟動,可能會發生罕見的資料遺失。應用程式可以選擇使用延遲持久化寫入,以犧牲一些耐用性保證來換取降低延遲。

此功能從 Apache Hadoop 2.6.0 開始提供,並在 Jira HDFS-6581 下開發。

Lazy Persist Writes

目標使用案例是受益於寫入相對少量資料(從幾 GB 到數十 GB,視可用記憶體而定)且延遲低的應用程式。記憶體儲存空間適用於在叢集內執行且與 HDFS 資料節點並置的應用程式。我們觀察到網路複制的延遲開銷抵消了寫入記憶體的優點。

使用延遲持久化寫入的應用程式將繼續運作,如果記憶體不足或未設定,則會退回到磁碟儲存空間。

管理員設定

此部分列舉應用程式可以在叢集中開始使用此功能之前所需的管理步驟。

限制用於記憶體中複本的 RAM

首先決定要專用於儲存在記憶體中的複本的記憶體量。在 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 磁碟。選擇 RAM 磁碟可讓資料在資料節點程序重新啟動時持續存在。下列設定適用於大多數 Linux 發行版。目前不支援在其他平台上使用 RAM 磁碟。

選擇 tmpfs(而非 ramfs

Linux 支援使用兩種 RAM 磁碟 - tmpfsramfstmpfs 的大小受限於 Linux 核心,而 ramfs 則會擴充至填滿所有可用的系統記憶體。tmpfs 的缺點是,在記憶體壓力下,其內容可能會換頁至磁碟。然而,許多效能敏感的部署都停用換頁,因此我們預期這在實務上不會造成問題。

HDFS 目前支援使用 tmpfs 分割區。目前正在進行新增 ramfs 的支援(請參閱 HDFS-8584)。

掛載 RAM 磁碟

使用 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 分割區進行延遲持續寫入。

使用 RAM_DISK 儲存類型標記 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 磁碟區視為非揮發性儲存,而資料不會儲存至持續性儲存。您會在節點重新啟動時遺失資料。

確保已啟用儲存政策

請確保已啟用開啟儲存政策的全球設定 如本文檔所述。此設定預設為開啟。

應用程式使用

使用 LAZY_PERSIST 儲存政策

應用程式會指示 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);