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)
- 원문: 문서