HDFSにおけるメモリストレージサポート

はじめに

HDFSは、DataNodeによって管理されるオフヒープメモリへの書き込みをサポートしています。DataNodeは、メモリ内のデータを非同期的にディスクにフラッシュするため、パフォーマンスに敏感なIOパスからコストのかかるディスクIOとチェックサム計算が削除されます。したがって、このような書き込みをレイジー永続化書き込みと呼びます。HDFSは、レイジー永続化書き込みに対してベストエフォートの永続性保証を提供します。レプリカがディスクに永続化される前にノードが再起動した場合、まれにデータ損失が発生する可能性があります。アプリケーションは、レイジー永続化書き込みを使用して、レイテンシーを短縮するために耐久性の保証を一部トレードオフすることを選択できます。

この機能はApache Hadoop 2.6.0から利用可能であり、Jira HDFS-6581に基づいて開発されました。

Lazy Persist Writes

対象となるユースケースは、低レイテンシーで比較的少量のデータ(利用可能なメモリに応じて数GBから数十GB)を書き込むことでメリットが得られるアプリケーションです。メモリストレージは、クラスター内で実行され、HDFS DataNodeと同じ場所に配置されるアプリケーションを対象としています。ネットワークレプリケーションによるレイテンシーのオーバーヘッドは、メモリへの書き込みのメリットを打ち消すことが観察されています。

レイジー永続化書き込みを使用するアプリケーションは、メモリが不十分または構成されていない場合、DISKストレージにフォールバックすることで引き続き動作します。

管理者設定

このセクションでは、アプリケーションがクラスターでこの機能の使用を開始する前に必要な管理手順を列挙します。

メモリ内のレプリカに使用されるRAMの制限

まず、メモリに格納されるレプリカ専用のメモリ量を決定します。hdfs-site.xmldfs.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コンテナ用のメモリも必要になります。

データノードへのRAMディスクのセットアップ

各DataNodeにRAMディスクを初期化します。RAMディスクを選択すると、DataNodeプロセスを再起動してもデータ永続性が向上します。次の設定は、ほとんどのLinuxディストリビューションで機能します。他のプラットフォームでのRAMディスクの使用は、現在サポートされていません。

tmpfsの選択(対ramfs

Linuxは、tmpfsramfsの2種類のRAMディスクの使用をサポートしています。tmpfsのサイズは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/

ノードの再起動時にRAMディスクが自動的に再作成されるように、/etc/fstabにエントリを作成することをお勧めします。別のオプションとして、ほとんどのLinuxディストリビューションでデフォルトで使用可能なtmpfsマウントである/dev/shmの下のサブディレクトリを使用することもできます。マウントのサイズがdfs.datanode.max.locked.memoryの設定以上であることを確認するか、/etc/fstabでオーバーライドしてください。レイジー永続化書き込み用にDataNodeごとに複数のtmpfsパーティションを使用することはお勧めしません。

RAM_DISKストレージタイプでtmpfsボリュームをタグ付け

hdfs-site.xmldfs.datanode.data.dir構成設定を介して、tmpfsディレクトリにRAM_DISKストレージタイプをタグ付けします。例:3つのハードディスクボリューム/grid/0/grid/1/grid/2tmpfsマウント/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ストレージポリシーの使用

アプリケーションは、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);