HDFS NFS 게이트웨이

HDFS NFS 게이트웨이 (NFS Gateway)

HDFS를 클라이언트의 로컬 파일 시스템 일부로 마운트할 수 있게 하는 NFS Gateway를 설명하는 문서예요. NFSv3를 지원하며, 구성, 서비스 시작·중지, 마운트, 사용자 인증·매핑을 다룹니다.

출처: 문서

본문

개요 (Overview)

NFS Gateway는 NFSv3를 지원하며 HDFS를 클라이언트의 로컬 파일 시스템 일부로 마운트할 수 있게 해 줍니다. 현재 NFS Gateway는 다음 사용 패턴을 지원하고 활성화합니다.

  • NFSv3 클라이언트 호환 OS의 로컬 파일 시스템을 통해 HDFS 파일 시스템을 탐색할 수 있습니다.
  • HDFS 파일 시스템에서 로컬 파일 시스템으로 파일을 다운로드할 수 있습니다.
  • 로컬 파일 시스템에서 HDFS 파일 시스템으로 파일을 직접 업로드할 수 있습니다.
  • 마운트 지점을 통해 HDFS로 직접 데이터를 스트리밍할 수 있습니다. 파일 append는 지원되지만 임의 쓰기(random write)는 지원되지 않아요.

NFS 게이트웨이 머신에는 HDFS 클라이언트를 실행하는 데 필요한 것(Hadoop JAR 파일, HADOOP_CONF 디렉터리)이 필요합니다. NFS 게이트웨이는 DataNode, NameNode 또는 어떤 HDFS 클라이언트와 같은 호스트에 둘 수 있어요.

구성 (Configuration)

NFS 게이트웨이는 프록시 사용자를 사용해 NFS 마운트에 접근하는 모든 사용자를 프록시합니다. 비보안 모드에서는 게이트웨이를 실행하는 사용자가 프록시 사용자이고, 보안 모드에서는 Kerberos keytab의 사용자가 프록시 사용자입니다. 프록시 사용자가 'nfsserver'이고 'users-group1'과 'users-group2' 그룹에 속한 사용자들이 NFS 마운트를 사용한다고 합시다. 그러면 NameNode의 core-site.xml에 다음 두 속성을 설정해야 하고, 구성 변경 후에는 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" 문자열을 프록시 사용자 이름으로 바꾸고, keytab에 포함된 사용자도 같은 프록시 사용자인지 확인하세요).

<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/[email protected]</value>
</property>

나머지 NFS 게이트웨이 구성은 보안/비보안 모드 모두 선택 사항입니다.

  • AIX NFS 클라이언트는 HDFS NFS Gateway와 기본적으로 올바르게 동작하지 못하게 하는 몇 가지 알려진 문제가 있어요. AIX에서 HDFS NFS Gateway에 접근하려면 다음 설정을 켜서 이런 문제에 대한 우회 조치를 활성화해야 합니다.
<property>
  <name>nfs.aix.compatibility.mode.enabled</name>
  <value>true</value>
</property>

일반적인 비-AIX 클라이언트는 AIX 호환 모드를 켜면 안 됩니다. AIX 호환 모드가 구현하는 우회 조치는 NFS로 디렉터리 내용 나열이 일관된 결과를 돌려주고 NFS 서버로 보낸 모든 데이터가 커밋되었음을 보장하도록 하는 보호 장치를 사실상 비활성화합니다.

  • HDFS 슈퍼유저는 NameNode 프로세스 자신과 같은 정체성을 가진 사용자이며, 권한 검사가 슈퍼유저에겐 절대 실패하지 않으므로 무엇이든 할 수 있어요. 다음 속성을 구성하면 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에 추가하거나 업데이트할 수 있어요.

  • 클라이언트가 접근 시간 업데이트가 허용된 상태로 export를 마운트한다면, 구성 파일에서 다음 속성이 비활성화되지 않았는지 확인하세요. 이 속성을 바꾼 뒤에는 NameNode만 재시작하면 됩니다. 일부 Unix 시스템에서 사용자는 export를 "noatime"으로 마운트해 접근 시간 업데이트를 비활성화할 수 있어요. export가 "noatime"으로 마운트되면 아래 속성을 바꿀 필요가 없고 네임노드를 재시작할 필요도 없습니다.
<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 클라이언트는 특히 export가 "sync" 옵션으로 마운트되지 않았을 때 쓰기 순서를 자주 바꿔요. 순차 쓰기가 NFS 게이트웨이에 무작위 순서로 도착할 수 있습니다. 이 디렉터리는 HDFS에 쓰기 전에 순서가 어긋난 쓰기를 임시로 저장하는 데 사용됩니다. 각 파일에 대해 순서가 어긋난 쓰기가 메모리에서 특정 임계값(예: 1MB)을 초과해 누적되면 덤프됩니다. 이 디렉터리에 충분한 공간이 있는지 확인해야 해요. 예를 들어 애플리케이션이 각 100MB인 파일 10개를 업로드하면, 최악의 쓰기 순서 변경이 모든 파일에 발생할 경우를 대비해 이 디렉터리에 약 1GB 공간이 권장됩니다. 이 속성을 업데이트한 뒤에는 NFS 게이트웨이만 재시작하면 됩니다.
<property>
    <name>nfs.dump.dir</name>
    <value>/tmp/.hdfs-nfs</value>
  </property>
  • 기본적으로 export는 어떤 클라이언트든 마운트할 수 있습니다. 접근을 더 잘 제어하려면 다음 속성을 업데이트할 수 있어요. 값 문자열은 머신 이름과 접근 권한을 공백 문자로 구분해 담고 있습니다. 머신 이름 형식은 단일 호스트, "", Java 정규식, 또는 IPv4 주소가 될 수 있어요. 접근 권한은 rw 또는 ro로 export에 대한 머신의 읽기/쓰기 또는 읽기 전용 접근을 지정합니다. 접근 권한을 주지 않으면 기본은 읽기 전용입니다. 항목은 ";"로 구분됩니다. 예: "192.168.0.0/22 rw ; \\w\.example\.com ; host1.test.org ro;". 이 속성을 업데이트한 뒤에는 NFS 게이트웨이만 재시작하면 됩니다. 여기서 Java 정규식은 Linux NFS export 테이블에 쓰이는 정규식과 다릅니다. 예를 들어 ".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 프로세스 자신과 같은 정체성을 가진 사용자이며, 슈퍼유저에겐 권한 검사가 절대 실패하지 않으므로 무엇이든 할 수 있어요. 다음 속성을 구성하면 NFS 클라이언트의 슈퍼유저가 HDFS의 어떤 파일에도 접근할 수 있습니다. 기본적으로 게이트웨이에는 슈퍼유저가 구성되지 않아요. 슈퍼유저가 구성되어도 "nfs.exports.allowed.hosts"는 여전히 적용됩니다.
<property>
  <name>nfs.superuser</name>
  <value>the_name_of_hdfs_superuser</value>
</property>
  • 메트릭(Metrics). 다른 HDFS 데몬처럼 게이트웨이는 런타임 메트릭을 노출합니다. http://gateway-ip:50079/jmx에서 JSON 문서로 사용할 수 있어요. 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
  • Export 지점. HDFS의 NFS export 지점을 지정할 수 있습니다. 정확히 하나의 export 지점이 지원돼요. export 지점을 구성할 때는 전체 경로가 필요합니다. 기본적으로 export 지점은 루트 디렉터리 "/"입니다.
<property>
  <name>nfs.export.point</name>
  <value>/</value>
</property>

NFS 게이트웨이 서비스 시작·중지 (Start and stop)

NFS 서비스를 제공하려면 rpcbind(또는 portmap), mountd, nfsd의 세 데몬이 필요합니다. NFS 게이트웨이 프로세스는 nfsd와 mountd를 모두 포함해요. HDFS 루트 "/"를 유일한 export로 공유합니다. NFS 게이트웨이 패키지에 포함된 portmap을 사용하는 것이 권장됩니다. NFS 게이트웨이는 대부분 Linux 배포판이 제공하는 portmap/rpcbind와도 동작하지만, RHEL 6.2와 SLES 11 같은 일부 Linux 시스템에서는 패키지에 포함된 portmap이 필요합니다. 전자는 rpcbind 버그 때문이에요. 더 자세한 논의는 HDFS-4763에서 찾을 수 있습니다.

  1. 플랫폼이 제공하는 nfsv3와 rpcbind/portmap 서비스를 중지합니다(명령은 Unix 플랫폼에 따라 다를 수 있음):
[root]> service nfs stop
[root]> service rpcbind stop
  1. Hadoop의 portmap을 시작합니다(root 권한 필요):
[root]> $HADOOP_HOME/bin/hdfs --daemon start portmap
  1. mountd와 nfsd를 시작합니다. 이 명령에는 root 권한이 필요 없어요. 비보안 모드에서는 NFS 게이트웨이를 이 사용자 가이드 시작 부분에서 언급한 프록시 사용자가 시작해야 합니다. 보안 모드에서는 사용자가 "nfs.keytab.file"에 정의된 Kerberos keytab을 읽을 권한만 있으면 누구든 NFS 게이트웨이를 시작할 수 있어요.
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start nfs3
  1. NFS 게이트웨이 서비스를 중지합니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop nfs3
[root]> $HADOOP_HOME/bin/hdfs --daemon stop portmap

선택적으로, NFS Gateway를 root로 시작하면 모든 OS에서 Hadoop 제공 portmap 데몬 대신 시스템 portmap 데몬을 사용할 수 있습니다. 이러면 앞서 언급한 버그를 우회하면서도 시스템 portmap 데몬에 등록할 수 있어요. 이를 위해 NFS 게이트웨이 데몬을 평소처럼 시작하되 반드시 "root" 사용자로 시작하고, "HDFS_NFS3_SECURE_USER" 환경 변수를 권한 없는 사용자로 설정하세요. 이 모드에서 NFS Gateway는 시스템 portmap에 초기 등록을 수행하기 위해 root로 시작한 뒤, 이후 NFS Gateway 프로세스의 수명 동안에는 HDFS_NFS3_SECURE_USER가 지정한 사용자로 권한을 낮춥니다. 이 경로를 택한다면 위 1·2단계를 건너뛰어야 합니다.

NFS 관련 서비스 유효성 확인 (Verify services)

  1. 다음 명령으로 모든 서비스가 실행 중인지 확인합니다:
[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
  1. HDFS 네임스페이스가 export되고 마운트될 수 있는지 확인합니다.
[root]> showmount -e $nfs_server_ip

다음과 비슷한 출력이 보여야 합니다.

Exports list on $nfs_server_ip :

        / (everyone)

export "/" 마운트 (Mount the export)

현재 NFS v3는 전송 프로토콜로 TCP만 사용합니다. NLM은 지원되지 않으므로 마운트 옵션 "nolock"이 필요합니다. 마운트 옵션 "sync"는 쓰기 순서 변경을 최소화·회피해 더 예측 가능한 처리량을 제공하므로 강력히 권장됩니다. sync 옵션을 지정하지 않으면 큰 파일 업로드 시 신뢰할 수 없는 동작이 발생할 수 있어요. hard 마운트를 사용하는 것이 좋습니다. 클라이언트가 모든 데이터를 NFS 게이트웨이에 보낸 뒤에도, NFS 클라이언트 커널이 쓰기 순서를 재배치했을 때 NFS 게이트웨이가 데이터를 HDFS로 옮기는 데 추가 시간이 걸릴 수 있기 때문이에요.

soft 마운트를 써야 한다면 상대적으로 긴 타임아웃(적어도 호스트 기본 타임아웃 이상)을 주어야 합니다.

NFS 네임스페이스는 다음과 같이 마운트할 수 있습니다.

[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"를 업데이트해야 합니다.

비특권 클라이언트의 마운트 허용 (Allow mounts from unprivileged clients)

클라이언트 머신에서 root 접근을 일반적으로 사용할 수 없는 환경에서는, 특권 포트에서 시작한 NFS 클라이언트만 NFS 서버에 연결할 수 있게 보장해 어느 정도 보안을 얻을 수 있습니다. 이 기능을 "port monitoring"이라 합니다. 이 기능은 HDFS NFS Gateway에서 기본적으로 활성화되지 않지만, NFS Gateway 머신의 hdfs-site.xml에 다음 설정을 넣어 선택적으로 활성화할 수 있어요.

<property>
  <name>nfs.port.monitoring.disabled</name>
  <value>false</value>
</property>

사용자 인증과 매핑 (User authentication and mapping)

이 릴리스의 NFS 게이트웨이는 AUTH_UNIX 스타일 인증을 사용합니다. NFS 클라이언트의 사용자가 마운트 지점에 접근하면 NFS 클라이언트가 UID를 NFS 게이트웨이에 전달해요. NFS 게이트웨이는 UID에서 사용자 이름을 찾아내는 조회를 한 뒤, HDFS 요청과 함께 그 사용자 이름을 HDFS에 전달합니다. 예를 들어 NFS 클라이언트의 현재 사용자가 "admin"이면, 사용자가 마운트된 디렉터리에 접근할 때 NFS 게이트웨이는 사용자 "admin"으로 HDFS에 접근합니다. 사용자 "hdfs"로 HDFS에 접근하려면, 마운트된 디렉터리에 접근할 때 클라이언트 시스템에서 현재 사용자를 "hdfs"로 전환해야 해요.

시스템 관리자는 NFS 클라이언트 호스트의 사용자가 NFS 게이트웨이 호스트의 사용자와 같은 이름과 UID를 갖도록 보장해야 합니다. HDFS 노드와 NFS 클라이언트 노드에서 사용자를 만들고 배포하는 데 같은 사용자 관리 시스템(예: LDAP/NIS)을 쓰면 보통 문제가 되지 않습니다. 서로 다른 호스트에 사용자 계정을 수동으로 만든 경우, 양쪽에서 같도록 NFS 클라이언트나 NFS 게이트웨이 호스트에서 UID를 수정해야 할 수 있습니다(예: "usermod -u 123 myusername" 실행). RPC AUTH_UNIX의 더 자세한 기술 내용은 RPC 규격에서 볼 수 있어요.

선택적으로, 완전히 다른 UID/GID 집합을 가진 시스템에서 HDFS NFS Gateway에 접근하려면 관리자가 사용자 정의 정적 매핑 파일을 구성할 수 있습니다. 기본적으로 이 파일은 "/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

더 알아보기 (Learn more)