HDFS Provided Storage

HDFS Provided Storage

HDFS 밖에 있는 데이터를 HDFS에 매핑하고 주소 지정할 수 있게 하는 provided storage 기능을 설명하는 문서예요. 데이터노드 미디어 집합에 새 저장소 유형 PROVIDED를 도입해서, 클러스터가 영속할 수 있는 것보다 더 많은 데이터를 주소 지정하고 클라우드처럼 일시적인 클러스터 시나리오에 유용합니다. 실험 기능입니다.

출처: 문서

본문

소개 (Introduction)

이 글을 쓰는 시점에 외부 저장소를 PROVIDED 블록으로 마운트하는 지원은 org.apache.hadoop.fs.FileSystem 인터페이스를 구현하는 원격 네임스페이스의 읽기 전용 이미지를 만들고, 그 이미지를 서빙하는 NameNode를 시작하는 것으로 제한됩니다. 구체적으로 원격 네임스페이스 스냅샷에서의 읽기가 지원됩니다. 실행 중인 네임노드에 원격 네임스페이스를 추가하거나, 원격 스냅샷을 갱신하거나, 마운트를 해제하거나, 쓰는 것은 이 릴리스에서 지원하지 않아요. ViewFs와 RBF를 사용해 PROVIDED 저장소 네임스페이스를 기존 배포에 통합할 수 있습니다.

PROVIDED 저장소로 HDFS 클러스터 만들기

fs2img 도구로 원격 네임스페이스의 스냅샷을 만들 수 있어요. 원격 FileSystem 경로가 주어지면, 도구는 네임스페이스를 반영하는 이미지(image)와, 생성된 이미지의 블록 ID를 원격 파일 시스템의 FileRegion에 매핑하는 별칭 맵(alias map)을 만듭니다. FileRegion은 원격 FileSystem의 고정 바이트 시퀀스를 주소 지정하기에 충분한 정보(예: file, offset, length)와, 이미지 생성 이후 해당 영역이 변하지 않았는지 검증하는 nonce를 담고 있어요.

NameNode 이미지와 별칭 맵이 만들어지면, NameNode와 DataNode가 이 주소 공간을 일관되게 참조하도록 구성해야 합니다. DataNode가 연결된 PROVIDED 저장소로 등록하면 NameNode는 모든 외부 블록이 그 DataNode를 통해 주소 지정 가능하다고 간주하고 클라이언트를 그쪽으로 안내하기 시작할 수 있어요. 마찬가지로 DataNode는 PROVIDED 저장소의 모든 블록을 원격 데이터에 매핑할 수 있어야 합니다.

배포 세부 사항은 구성된 별칭 맵 구현에 따라 달라집니다.

PROVIDED 구성 (Configuration)

각 NameNode는 별칭 맵 하나를 지원합니다. PROVIDED 저장소를 활성화하면 NameNode와 DataNode에 구성된 저장소 ID가 일치해야 해요. 그 외 세부 사항은 별칭 맵 구현 내부로 처리됩니다.

PROVIDED 저장소를 활성화하는 구성은 다음과 같습니다. 별칭 맵 구현에 사용 가능한 구성 옵션은 아래에 있습니다.

<configuration>

  <property>
    <name>dfs.namenode.provided.enabled</name>
    <value>true</value>
    <description>Enabled provided storage on the Namenode</description>
  </property>

  <property>
     <name>dfs.datanode.data.dir</name>
     <value>[DISK]/local/path/to/blocks/, [PROVIDED]remoteFS://remoteFS-authority/path/to/data/</value>
  </property>

  <property>
      <name>dfs.provided.storage.id</name>
      <value>DS-PROVIDED</value>
      <description>The storage ID used for provided storages in the cluster.</description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.class</name>
    <value>org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.TextFileRegionAliasMap</value>
  </property>

</configuration>

fs2img 도구

fs2img 도구는 원격 URI의 자식들을 재귀적으로 열거하며 원격 네임스페이스를 "걸어서" FSImage를 만듭니다. 일부 속성은 플러그인으로 제어할 수 있어요. 예를 들어 원격 파일 시스템에서 HDFS로의 owner/group 매핑과 파일-블록 매핑이 있습니다.

도구 실행 시 사용할 수 있는 옵션은 다음과 같습니다.

옵션 속성 기본값 설명
-o, --outdir dfs.namenode.name.dir <file://${hadoop.tmp.dir}/dfs/name> 출력 디렉터리
-b, --blockclass dfs.provided.aliasmap.class NullBlocksMap 블록 출력 클래스
-u, --ugiclass hdfs.image.writer.ugi.class SingleUGIResolver UGI 리졸버 클래스
-i, --blockidclass hdfs.image.writer.blockresolver.class FixedBlockResolver 블록 리졸버 클래스
-c, --cachedirs hdfs.image.writer.cache.entries 100 최대 활성 dirent 수
-cid, --clusterID 클러스터 ID
-bpid, --blockPoolID 블록 풀 ID
예시 (Examples)

모든 파일의 소유자를 "rmarathe"로 지정하고 gzip 압축 텍스트로 쓰기:

hadoop org.apache.hadoop.hdfs.server.namenode.FileSystemImage \
  -Dhdfs.image.writer.ugi.single.user=rmarathe \
  -Ddfs.provided.aliasmap.text.codec=gzip \
  -Ddfs.provided.aliasmap.text.write.dir=file:///tmp/ \
  -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.TextFileRegionAliasMap \
  -u org.apache.hadoop.hdfs.server.namenode.SingleUGIResolver \
  -o file:///tmp/name \
  hdfs://afreast/projects/ydau/onan

사용자 정의 UGIResolver를 기반으로 LevelDB에 소유권 지정:

hadoop org.apache.hadoop.hdfs.server.namenode.FileSystemImage \
  -Ddfs.provided.aliasmap.leveldb.path=/path/to/leveldb/map/dingos.db \
  -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.LevelDBFileRegionAliasMap \
  -o file:///tmp/name \
  -u CustomResolver \
  hdfs://enfield/projects/ywqmd/incandenza

별칭 맵 구현 (Alias Map Implementations)

사용할 별칭 맵 구현은 dfs.provided.aliasmap.class 파라미터로 구성합니다. 현재 다음 두 가지 유형의 별칭 맵이 지원돼요.

InMemoryAliasMap

NameNode에서 별도 서버로 실행되는 LevelDB 기반 별칭 맵입니다. 별칭 맵 자체는 위 예시처럼 -Ddfs.provided.aliasmap.leveldb.path=file:///path/to/leveldb/map/dingos.db -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.LevelDBFileRegionAliasMap 옵션으로 fs2img 도구를 사용해 만들 수 있어요.

DataNode는 org.apache.hadoop.hdfs.server.aliasmap.InMemoryAliasMapProtocol 프로토콜로 이 별칭 맵에 접속합니다.

구성 (Configuration)
<configuration>
  <property>
    <name>dfs.provided.aliasmap.inmemory.batch-size</name>
    <value>500</value>
    <description>
      The batch size when iterating over the database backing the aliasmap
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.inmemory.dnrpc-address</name>
    <value>namenode:rpc-port</value>
    <description>
      The address where the aliasmap server will be running
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.inmemory.leveldb.dir</name>
    <value>/path/to/leveldb/map/dingos.db</value>
    <description>
      The directory where the leveldb files will be kept
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.inmemory.enabled</name>
    <value>true</value>
    <description>Enable the inmemory alias map on the NameNode. Defaults to false.</description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.class</name>
    <value>org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.InMemoryLevelDBAliasMapClient</value>
  </property>
</configuration>

TextFileRegionAliasMap

이 별칭 맵 구현은 blockID에서 FileRegion으로의 매핑을 구분자로 나눈 텍스트 파일에 저장합니다. 이 형식은 테스트 환경, 특히 단일 노드 환경에 유용합니다.

구성 (Configuration)
<configuration>
  <property>
    <name>dfs.provided.aliasmap.text.delimiter</name>
    <value>,</value>
    <description>
        The delimiter used when the alias map is specified as
        a text file.
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.text.read.file</name>
    <value>file:///path/to/aliasmap/blocks_blocPoolID.csv</value>
    <description>
        The path specifying the alias map as a text file,
        specified as a URI.
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.text.codec</name>
    <value></value>
    <description>
        The codec used to de-compress the alias map. Default value is empty.
    </description>
  </property>

  <property>
    <name>dfs.provided.aliasmap.text.write.dir</name>
    <value>file:///path/to/aliasmap/</value>
    <description>
        The path to which the alias map should be written as a text
        file, specified as a URI.
    </description>
  </property>
</configuration>

더 알아보기 (Learn more)