NFSゲートウェイはNFSv3をサポートし、HDFSをクライアントのローカルファイルシステムの一部としてマウントできるようにします。現在、NFSゲートウェイは次の使用パターンをサポートし、有効にします。
NFSゲートウェイマシンは、Hadoop JARファイル、HADOOP_CONFディレクトリなどのHDFSクライアントを実行するために同じものを必要とします。NFSゲートウェイは、DataNode、NameNode、または任意のHDFSクライアントと同じホスト上に配置できます。
NFSゲートウェイは、プロキシユーザーを使用して、NFSマウントにアクセスするすべてのユーザーをプロキシします。非セキュアモードでは、ゲートウェイを実行しているユーザーがプロキシユーザーですが、セキュアモードでは、Kerberosキータブのユーザーがプロキシユーザーです。プロキシユーザーが「nfsserver」で、「users-group1」および「users-group2」グループに属するユーザーがNFSマウントを使用するとします。その場合、NameNodeのcore-site.xmlで、次の2つのプロパティを設定する必要があります。設定変更後、NameNodeのみを再起動する必要があります(注:「nfsserver」という文字列をクラスタのプロキシユーザー名に置き換えてください)。
<property> <name>hadoop.proxyuser.nfsserver.groups</name> <value>root,users-group1,users-group2</value> <description> The 'nfsserver' user is allowed to proxy all members of the 'users-group1' and 'users-group2' groups. Note that in most cases you will need to include the group "root" because the user "root" (which usually belonges to "root" group) will generally be the user that initially executes the mount on the NFS client system. Set this to '*' to allow nfsserver user to proxy any group. </description> </property> <property> <name>hadoop.proxyuser.nfsserver.hosts</name> <value>nfs-client-host1.com</value> <description> This is the host where the nfs gateway is running. Set this to '*' to allow requests from any hosts to be proxied. </description> </property>
上記は、非セキュアモードのNFSゲートウェイに必要な唯一の構成です。Kerberos化されたHadoopクラスタの場合、ゲートウェイのhdfs-site.xmlに次の構成を追加する必要があります(注:「nfsserver」という文字列をプロキシユーザー名に置き換え、キータブに含まれるユーザーが同じプロキシユーザーであることを確認してください)。
<property> <name>nfs.keytab.file</name> <value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab --> </property> <property> <name>nfs.kerberos.principal</name> <value>nfsserver/_HOST@YOUR-REALM.COM</value> </property>
残りのNFSゲートウェイ構成は、セキュアモードと非セキュアモードの両方でオプションです。
AIX NFSクライアントには、いくつかの既知の問題があり、デフォルトではHDFS NFSゲートウェイで正しく動作しません。AIXからHDFS NFSゲートウェイにアクセスできるようにするには、次の構成設定を設定して、これらの問題の回避策を有効にする必要があります。
<property> <name>nfs.aix.compatibility.mode.enabled</name> <value>true</value> </property>
通常の非AIXクライアントは、AIX互換モードを有効にしないでください。AIX互換モードで実装されている回避策は、NFSを介したディレクトリの内容のリストが整合性のある結果を返すこと、およびNFSサーバーに送信されたすべてのデータがコミットされていることを保証するための安全対策を事実上無効にします。
HDFSスーパーユーザーは、NameNodeプロセス自体と同じIDを持つユーザーであり、スーパーユーザーはパーミッションチェックがスーパーユーザーに対して失敗することがないため、何でも実行できます。次のプロパティが構成されている場合、NFSクライアントのスーパーユーザーはHDFS上の任意のファイルにアクセスできます。デフォルトでは、スーパーユーザーはゲートウェイで構成されていません。スーパーユーザーが構成されている場合でも、「nfs.exports.allowed.hosts」は引き続き有効です。たとえば、NFSクライアントホストが「nfs.exports.allowed.hosts」で書き込みアクセスを許可されていない場合、スーパーユーザーはゲートウェイを介してHDFSファイルに書き込みアクセスできません。
<property> <name>nfs.superuser</name> <value>the_name_of_hdfs_superuser</value> </property>
ユーザーは、ユースケースに基づいていくつかの構成プロパティを更新することを強くお勧めします。次のすべての構成プロパティは、hdfs-site.xmlに追加または更新できます。
クライアントがアクセス時間更新を許可してエクスポートをマウントする場合、構成ファイルで次のプロパティが無効になっていないことを確認してください。このプロパティが変更された後、NameNodeのみを再起動する必要があります。一部のUnixシステムでは、ユーザーは「noatime」でエクスポートをマウントすることにより、アクセス時間更新を無効にすることができます。エクスポートが「noatime」でマウントされている場合、ユーザーはこのプロパティを変更する必要がないため、namenodeを再起動する必要はありません。
<property> <name>dfs.namenode.accesstime.precision</name> <value>3600000</value> <description>The access time for HDFS file is precise upto this value. The default value is 1 hour. Setting a value of 0 disables access times for HDFS. </description> </property>
ユーザーはファイルダンプディレクトリを更新することが想定されています。NFSクライアントは、特にエクスポートが「sync」オプションでマウントされていない場合、書き込みを並べ替えることがよくあります。順次書き込みは、ランダムな順序でNFSゲートウェイに到着する可能性があります。このディレクトリは、HDFSに書き込む前に、順序が狂った書き込みを一時的に保存するために使用されます。ディレクトリに十分なスペースがあることを確認する必要があります。たとえば、アプリケーションがそれぞれ100MBの10個のファイルをアップロードする場合、最悪の場合の書き込みの並べ替えがすべてのファイルで発生した場合に備えて、このディレクトリに約1GBのスペースを用意することをお勧めします。このプロパティが更新された後、NFSゲートウェイのみを再起動する必要があります。
<property> <name>nfs.dump.dir</name> <value>/tmp/.hdfs-nfs</value> </property>
デフォルトでは、エクスポートは任意のクライアントによってマウントできます。アクセスをより適切に制御するために、ユーザーは次のプロパティを更新できます。値文字列には、空白文字で区切られたマシン名とアクセス権が含まれています。マシン名形式は、単一ホスト、「*」、Java正規表現、またはIPv4アドレスです。アクセス権限は、rwまたはroを使用して、マシンのエクスポートへの読み取り/書き込みまたは読み取り専用アクセスを指定します。アクセス権限が提供されていない場合、デフォルトは読み取り専用です。エントリは「;」で区切られます。例:「192.168.0.0/22 rw ; \\w*\\.example\\.com ; host1.test.org ro;」。このプロパティが更新された後、NFSゲートウェイのみを再起動する必要があります。ここで、Java正規表現は、Linux NFSエクスポートテーブルで使用される正規表現とは異なり、「*.example.com」の代わりに「\\w*\\.example\\.com」、「192.168.0.[11|22]」の代わりに「192\\.168\\.0\\.(11|22)」などを使用することに注意してください。
<property> <name>nfs.exports.allowed.hosts</name> <value>* rw</value> </property>
HDFSスーパーユーザーは、NameNodeプロセス自体と同じIDを持つユーザーであり、スーパーユーザーはパーミッションチェックがスーパーユーザーに対して失敗することがないため、何でも実行できます。次のプロパティが構成されている場合、NFSクライアントのスーパーユーザーはHDFS上の任意のファイルにアクセスできます。デフォルトでは、スーパーユーザーはゲートウェイで構成されていません。スーパーユーザーが構成されている場合でも、「nfs.exports.allowed.hosts」は引き続き有効です。たとえば、NFSクライアントホストが「nfs.exports.allowed.hosts」で書き込みアクセスを許可されていない場合、スーパーユーザーはゲートウェイを介してHDFSファイルに書き込みアクセスできません。
<property> <name>nfs.superuser</name> <value>the_name_of_hdfs_superuser</value> </property>
メトリクス。他のHDFSデーモンと同様に、ゲートウェイはランタイムメトリクスを公開します。JSONドキュメントとしてhttp://gateway-ip:50079/jmx
で利用できます。NFSハンドラ関連のメトリクスは、「Nfs3Metrics」という名前で公開されます。レイテンシヒストグラムは、hdfs-site.xmlファイルに次のプロパティを追加することで有効にできます。
<property> <name>nfs.metrics.percentiles.intervals</name> <value>100</value> <description>Enable the latency histograms for read, write and commit requests. The time unit is 100 seconds in this example. </description> </property>
JVMとログの設定。HDFS_NFS3_OPTSでJVM設定(ヒープサイズ、GCログなど)をエクスポートできます。NFS関連の設定は、hadoop-env.shにあります。NFSデバッグトレースを取得するには、log4j.propertyファイルを編集して以下を追加します。ONCRPCのデバッグトレースは非常に冗長になる可能性があることに注意してください。
ログレベルを変更するには
log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
ONCRPCリクエストの詳細を取得するには
log4j.logger.org.apache.hadoop.oncrpc=DEBUG
エクスポートポイント。HDFSのNFSエクスポートポイントを指定できます。正確に1つのエクスポートポイントがサポートされています。エクスポートポイントを構成する場合は、フルパスが必要です。デフォルトでは、エクスポートポイントはルートディレクトリ「/」です。
<property> <name>nfs.export.point</name> <value>/</value> </property>
NFSサービスを提供するには、rpcbind(またはportmap)、mountd、nfsdの3つのデーモンが必要です。NFSゲートウェイプロセスは、nfsdとmountdの両方を持っています。HDFSルート「/」を唯一のエクスポートとして共有します。NFSゲートウェイパッケージに含まれているportmapを使用することをお勧めします。NFSゲートウェイは、ほとんどのLinuxディストリビューションが提供するportmap/rpcbindで動作しますが、RHEL 6.2やSLES 11などの一部のLinuxシステムでは、パッケージに含まれるportmapが必要です。前者はrpcbindのバグが原因です。より詳細な議論はHDFS-4763にあります。
プラットフォームが提供するnfsv3とrpcbind/portmapサービスを停止します(コマンドはUnixプラットフォームによって異なる場合があります)
[root]> service nfs stop [root]> service rpcbind stop
Hadoopのportmapを起動します(root権限が必要です)
[root]> $HADOOP_HOME/bin/hdfs --daemon start portmap
mountdとnfsdを起動します。
このコマンドにはroot権限は必要ありません。非セキュアモードでは、NFSゲートウェイはこのユーザーガイドの冒頭で述べたプロキシユーザーによって起動される必要があります。セキュアモードでは、「nfs.keytab.file」で定義されたKerberosキータブファイルへの読み取りアクセス権を持つユーザーであれば、誰でもNFSゲートウェイを起動できます。
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start nfs3
NFSゲートウェイサービスを停止します。
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop nfs3 [root]> $HADOOP_HOME/bin/hdfs --daemon stop portmap
オプションとして、NFSゲートウェイをrootとして起動する場合、Hadoopが提供するportmapデーモンの実行を省略し、代わりにすべてのオペレーティングシステムでシステムのportmapデーモンを使用できます。これにより、HDFS NFSゲートウェイは前述のバグを回避し、システムのportmapデーモンを使用して登録できます。そのためには、通常どおりNFSゲートウェイデーモンを起動しますが、「root」ユーザーとして起動するようにしてください。また、「HDFS_NFS3_SECURE_USER」環境変数を権限のないユーザーに設定します。このモードでは、NFSゲートウェイはrootとして起動してシステムのportmapへの初期登録を実行し、その後、HDFS_NFS3_SECURE_USERで指定されたユーザーに権限を落とし、NFSゲートウェイプロセスの残りの期間中はその権限を維持します。この方法を選択する場合は、上記の手順1と2をスキップする必要があることに注意してください。
次のコマンドを実行して、すべてのサービスが起動して実行されていることを確認します
[root]> rpcinfo -p $nfs_server_ip
次のような出力が表示されます
program vers proto port 100005 1 tcp 4242 mountd 100005 2 udp 4242 mountd 100005 2 tcp 4242 mountd 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100005 3 udp 4242 mountd 100005 1 udp 4242 mountd 100003 3 tcp 2049 nfs 100005 3 tcp 4242 mountd
HDFS名前空間がエクスポートされ、マウントできることを確認します。
[root]> showmount -e $nfs_server_ip
次のような出力が表示されます
Exports list on $nfs_server_ip : / (everyone)
現在、NFS v3はトランスポートプロトコルとしてTCPのみを使用しています。NLMはサポートされていないため、マウントオプション「nolock」が必要です。マウントオプション「sync」は、書き込みの順序変更を最小限に抑えるか、回避できるため、スループットの予測可能性が高くなるため、強くお勧めします。syncオプションを指定しないと、大きなファイルをアップロードするときに信頼性の低い動作が発生する可能性があります。ハードマウントを使用することをお勧めします。これは、クライアントがすべてのデータをNFSゲートウェイに送信した後でも、NFSクライアントカーネルによって書き込みの順序が変更された場合、NFSゲートウェイがHDFSにデータを転送するのに追加の時間がかかる場合があるためです。
ソフトマウントを使用する必要がある場合は、比較的長いタイムアウト(少なくともホストのデフォルトのタイムアウト以上)を指定する必要があります。
ユーザーは以下のようにHDFS名前空間をマウントできます
[root]>mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync $server:/ $mount_point
その後、ユーザーはハードリンクとランダム書き込みはまだサポートされていませんが、ローカルファイルシステムの一部としてHDFSにアクセスできます。大きなファイルI/Oのパフォーマンスを最適化するために、マウント中にNFS転送サイズ(rsizeとwsize)を増やすことができます。デフォルトでは、NFSゲートウェイは最大転送サイズとして1MBをサポートしています。より大きなデータ転送サイズの場合は、hdfs-site.xmlで「nfs.rtmax」と「nfs.wtmax」を更新する必要があります。
クライアントマシンでのrootアクセスが一般的に利用できない環境では、特権ポートからのNFSクライアントのみがNFSサーバーに接続できるようにすることで、ある程度のセキュリティを確保できます。この機能は「ポート監視」と呼ばれます。この機能は、HDFS NFSゲートウェイではデフォルトで有効になっていませんが、NFSゲートウェイマシンのhdfs-site.xmlで次の設定を行うことでオプションで有効にできます。
<property> <name>nfs.port.monitoring.disabled</name> <value>false</value> </property>
このリリースのNFSゲートウェイは、AUTH_UNIXスタイルの認証を使用します。NFSクライアントのユーザーがマウントポイントにアクセスすると、NFSクライアントはUIDをNFSゲートウェイに渡します。NFSゲートウェイはUIDからユーザー名を検索し、HDFSリクエストと共にユーザー名をHDFSに渡します。たとえば、NFSクライアントの現在のユーザーが「admin」の場合、ユーザーがマウントされたディレクトリにアクセスすると、NFSゲートウェイはユーザー「admin」としてHDFSにアクセスします。ユーザー「hdfs」としてHDFSにアクセスするには、マウントされたディレクトリにアクセスするときに、クライアントシステムで現在のユーザーを「hdfs」に切り替える必要があります。
システム管理者は、NFSクライアントホストのユーザーがNFSゲートウェイホストと同じ名前とUIDを持っていることを確認する必要があります。同じユーザー管理システム(LDAP/NISなど)を使用してHDFSノードとNFSクライアントノードにユーザーを作成およびデプロイする場合、これは通常問題になりません。ユーザーアカウントが異なるホストで手動で作成された場合は、両側で同じになるように、NFSクライアントまたはNFSゲートウェイホストでUIDを変更する必要がある場合があります(例:「usermod -u 123 myusername」)。RPC AUTH_UNIXの技術的な詳細は、RPC仕様にあります。
オプションとして、システム管理者は、完全に異なるUID/GIDのセットを持つシステムからHDFS NFSゲートウェイにアクセスする場合に、カスタムの静的マッピングファイルを構成できます。デフォルトでは、このファイルは「/etc/nfs.map」にありますが、カスタムの場所は「static.id.mapping.file」プロパティを静的マッピングファイルのパスに設定することで構成できます。静的マッピングファイルの形式は、exports(5)マニュアルページに記載されているものと似ていますが、おおよそ次のとおりです。
# Mapping for clients accessing the NFS gateway uid 10 100 # Map the remote UID 10 the local UID 100 gid 11 101 # Map the remote GID 11 to the local GID 101