HDFSは、DataNodeによって管理されるオフヒープメモリへの書き込みをサポートしています。DataNodeは、メモリ内のデータを非同期的にディスクにフラッシュするため、パフォーマンスに敏感なIOパスからコストのかかるディスクIOとチェックサム計算が削除されます。したがって、このような書き込みをレイジー永続化書き込みと呼びます。HDFSは、レイジー永続化書き込みに対してベストエフォートの永続性保証を提供します。レプリカがディスクに永続化される前にノードが再起動した場合、まれにデータ損失が発生する可能性があります。アプリケーションは、レイジー永続化書き込みを使用して、レイテンシーを短縮するために耐久性の保証を一部トレードオフすることを選択できます。
この機能はApache Hadoop 2.6.0から利用可能であり、Jira HDFS-6581に基づいて開発されました。
対象となるユースケースは、低レイテンシーで比較的少量のデータ(利用可能なメモリに応じて数GBから数十GB)を書き込むことでメリットが得られるアプリケーションです。メモリストレージは、クラスター内で実行され、HDFS DataNodeと同じ場所に配置されるアプリケーションを対象としています。ネットワークレプリケーションによるレイテンシーのオーバーヘッドは、メモリへの書き込みのメリットを打ち消すことが観察されています。
レイジー永続化書き込みを使用するアプリケーションは、メモリが不十分または構成されていない場合、DISKストレージにフォールバックすることで引き続き動作します。
このセクションでは、アプリケーションがクラスターでこの機能の使用を開始する前に必要な管理手順を列挙します。
まず、メモリに格納されるレプリカ専用のメモリ量を決定します。hdfs-site.xml
でdfs.datanode.max.locked.memory
を適切に設定します。これは、集中型キャッシュ管理機能で使用されるのと同じ設定です。DataNodeは、レイジー永続化書き込みと集中型キャッシュ管理で使用されるメモリの合計が、dfs.datanode.max.locked.memory
で構成された量を超えないようにします。
例:インメモリレプリカ用に32 GBを予約するには
<property> <name>dfs.datanode.max.locked.memory</name> <value>34359738368</value> </property>
このメモリは、起動時にDataNodeによって割り当てられません。
Unixのようなシステムでは、DataNodeユーザーの「メモリにロックされたサイズ」ulimit (ulimit -l
)も、このパラメーターと一致するように増やす必要があります(OS制限に関する関連セクションを参照してください)。この値を設定するときは、DataNodeやアプリケーションJVMヒープ、オペレーティングシステムのページキャッシュなど、他のものにもメモリ領域が必要になることを忘れないでください。DataNodeと同じノードでYARN Node Managerプロセスが実行されている場合は、YARNコンテナ用のメモリも必要になります。
各DataNodeにRAMディスクを初期化します。RAMディスクを選択すると、DataNodeプロセスを再起動してもデータ永続性が向上します。次の設定は、ほとんどのLinuxディストリビューションで機能します。他のプラットフォームでのRAMディスクの使用は、現在サポートされていません。
tmpfs
の選択(対ramfs
)Linuxは、tmpfs
とramfs
の2種類のRAMディスクの使用をサポートしています。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/
ノードの再起動時にRAMディスクが自動的に再作成されるように、/etc/fstab
にエントリを作成することをお勧めします。別のオプションとして、ほとんどのLinuxディストリビューションでデフォルトで使用可能なtmpfs
マウントである/dev/shm
の下のサブディレクトリを使用することもできます。マウントのサイズがdfs.datanode.max.locked.memory
の設定以上であることを確認するか、/etc/fstab
でオーバーライドしてください。レイジー永続化書き込み用にDataNodeごとに複数のtmpfs
パーティションを使用することはお勧めしません。
tmpfs
ボリュームをタグ付けhdfs-site.xml
のdfs.datanode.data.dir
構成設定を介して、tmpfs
ディレクトリにRAM_DISKストレージタイプをタグ付けします。例:3つのハードディスクボリューム/grid/0
、/grid/1
、/grid/2
とtmpfs
マウント/mnt/dn-tmpfs
を持つDataNodeでは、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がファイルにレイジー永続化書き込みを使用できることを示します。ポリシーを設定するために管理特権は不要であり、3つの方法のいずれかで設定できます。
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);