OBSA: Hadoop 지원용 HuaweiCloud OBS 어댑터

OBSA: Hadoop 지원용 HuaweiCloud OBS 어댑터

hadoop-huaweicloud 모듈은 HuaweiCloud Object Storage Service (OBS)와의 통합을 지원해요. 이 지원은 hadoop-huaweicloud.jar JAR 파일로 제공돼요.

출처: 문서

본문

소개 (Introduction)

hadoop-huaweicloud 모듈은 HuaweiCloud Object Storage Service (OBS)와의 통합을 지원해요. 이 지원은 hadoop-huaweicloud.jar JAR 파일을 통해 제공돼요.

기능 (Features)

  • HuaweiCloud OBS 계정에 저장된 데이터를 읽고 씀.
  • obs 스킴을 사용하는 URL로 파일시스템 경로를 참조.
  • 표준 Hadoop FileSystem 인터페이스를 구현해 계층적 파일시스템 뷰를 제시.
  • 대용량 파일에 대한 multipart upload 지원.
  • MapReduce 작업의 데이터 소스 또는 싱크 역할을 할 수 있음.
  • 최신 OBS 기능과 인증 방식을 지원하는 HuaweiCloud OBS의 Java SDK 사용.
  • 규모(scale)에 대해 테스트됨.

제한 사항 (Limitations)

다음 연산에 대한 부분적이거나 없는 지원:

  • 기호 링크(symbolic link) 연산
  • 프록시 사용자 (Proxy users)
  • 파일 잘라내기 (File truncate)
  • 파일 연결 (File concat)
  • 파일 체크섬 (File checksum)
  • 파일 복제 계수 (File replication factor)
  • 확장 속성(XAttrs) 연산
  • 스냅샷 연산
  • 스토리지 정책 (Storage policy)
  • 할당량 (Quota)
  • POSIX ACL
  • 위임 토큰(delegation token) 연산

시작하기 (Getting Started)

패키지 (Packages)

OBSA는 hadoop-common과 그 의존성들과 함께 두 개의 JAR에 의존해요.

  • hadoop-huaweicloud JAR
  • esdk-obs-java JAR

hadoop-common과 hadoop-huaweicloud의 버전은 동일해야 해요. Maven 빌드에 라이브러리를 가져오려면 hadoop-huaweicloud JAR를 빌드 의존성에 추가해요. 그러면 호환되는 esdk-obs-java JAR를 끌어올 거예요. hadoop-huaweicloud JAR는 그 고유 의존성(OBS SDK JAR) 외에 다른 의존성을 선언하지 않아요. 이것은 다운스트림 애플리케이션에서 Hadoop 의존성 JAR을 제외/튜닝하는 것을 단순화해요. hadoop-client 또는 hadoop-common 의존성은 선언해야 해요.

<properties>
 <!-- Your exact Hadoop version here-->
  <hadoop.version>3.4.0</hadoop.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>${hadoop.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-huaweicloud</artifactId>
    <version>${hadoop.version}</version>
  </dependency>
</dependencies>

OBS URL 접근 (Accessing OBS URLs)

URL에 접근하기 전에 Filesystem/AbstractFileSystem의 OBS 구현 클래스와 버킷이 위치한 region 엔드포인트를 다음과 같이 구성해야 해요:

<property>
  <name>fs.obs.impl</name>
  <value>org.apache.hadoop.fs.obs.OBSFileSystem</value>
  <description>The OBS implementation class of the Filesystem.</description>
</property>

<property>
  <name>fs.AbstractFileSystem.obs.impl</name>
  <value>org.apache.hadoop.fs.obs.OBS</value>
  <description>The OBS implementation class of the AbstractFileSystem.</description>
</property>

<property>
  <name>fs.obs.endpoint</name>
  <value>obs.region.myhuaweicloud.com</value>
  <description>OBS region endpoint where a bucket is located.</description>
</property>

그러면 OBS URL을 다음과 같이 접근할 수 있어요:

obs://<bucket_name>/path

obs 스킴은 HuaweiCloud OBS가 지원하는 Hadoop 호환 파일시스템 OBSFileSystem의 URL을 식별해요. 예를 들어 mybucket이라는 버킷에 대한 접근을 보여주는 다음 FileSystem Shell 명령들이 있어요:

hadoop fs -mkdir obs://mybucket/testDir

hadoop fs -put testFile obs://mybucket/testDir/testFile

hadoop fs -cat obs://mybucket/testDir/testFile
test file content

버킷 만드는 방법에 대한 자세한 내용은 Help Center > Object Storage Service > Getting Started > Basic Operation Procedure 를 참고하세요.

OBS 인증 (Authenticating with OBS)

공용 OBS 버킷과의 상호작용을 제외하고, OBSA 클라이언트는 버킷과 상호작용하는 데 필요한 자격 증명이 필요해요. 클라이언트는 여러 인증 메커니즘을 지원해요. 가장 간단한 인증 메커니즘은 다음과 같이 OBS access key와 secret key를 제공하는 것이에요:

<property>
  <name>fs.obs.access.key</name>
  <description>OBS access key.
   Omit for provider-based authentication.</description>
</property>

<property>
  <name>fs.obs.secret.key</name>
  <description>OBS secret key.
   Omit for provider-based authentication.</description>
</property>

access key, secret key, session token을 공유하지 마세요. 반드시 비밀로 유지해야 해요. com.obs.services.IObsCredentialsProvider (Creating an Instance of ObsClient 참고) 또는 org.apache.hadoop.fs.obs.BasicSessionCredential의 사용자 지정 구현도 인증에 사용할 수 있어요.

<property>
  <name>fs.obs.security.provider</name>
  <description>
    Class name of security provider class which implements
    com.obs.services.IObsCredentialsProvider, which will
    be used to construct an OBS client instance as an input parameter.
  </description>
</property>

<property>
  <name>fs.obs.credentials.provider</name>
  <description>
    lass nameCof credential provider class which implements
    org.apache.hadoop.fs.obs.BasicSessionCredential,
    which must override three APIs: getOBSAccessKeyId(),
    getOBSSecretKey(), and getSessionToken().
  </description>
</property>

일반 OBSA 클라이언트 구성 (General OBSA Client Configuration)

모든 OBSA 클라이언트 옵션은 fs.obs. 접두사를 가진 옵션으로 구성돼요.

<property>
  <name>fs.obs.connection.ssl.enabled</name>
  <value>false</value>
  <description>Enable or disable SSL connections to OBS.</description>
</property>

<property>
  <name>fs.obs.connection.maximum</name>
  <value>1000</value>
  <description>Maximum number of simultaneous connections to OBS.</description>
</property>

<property>
  <name>fs.obs.connection.establish.timeout</name>
  <value>120000</value>
  <description>Socket connection setup timeout in milliseconds.</description>
</property>

<property>
  <name>fs.obs.connection.timeout</name>
  <value>120000</value>
  <description>Socket connection timeout in milliseconds.</description>
</property>

<property>
  <name>fs.obs.idle.connection.time</name>
  <value>30000</value>
  <description>Socket idle connection time.</description>
</property>

<property>
  <name>fs.obs.max.idle.connections</name>
  <value>1000</value>
  <description>Maximum number of socket idle connections.</description>
</property>

<property>
  <name>fs.obs.socket.send.buffer</name>
  <value>256 * 1024</value>
  <description>Socket send buffer to be used in OBS SDK. Represented in bytes.</description>
</property>

<property>
  <name>fs.obs.socket.recv.buffer</name>
  <value>256 * 1024</value>
  <description>Socket receive buffer to be used in OBS SDK. Represented in bytes.</description>
</property>

<property>
  <name>fs.obs.threads.keepalivetime</name>
  <value>60</value>
  <description>Number of seconds a thread can be idle before being
    terminated in thread pool.</description>
</property>

<property>
  <name>fs.obs.threads.max</name>
  <value>20</value>
  <description> Maximum number of concurrent active (part)uploads,
    which each use a thread from thread pool.</description>
</property>

<property>
  <name>fs.obs.max.total.tasks</name>
  <value>20</value>
  <description>Number of (part)uploads allowed to the queue before
    blocking additional uploads.</description>
</property>

<property>
  <name>fs.obs.delete.threads.max</name>
  <value>20</value>
  <description>Max number of delete threads.</description>
</property>

<property>
  <name>fs.obs.multipart.size</name>
  <value>104857600</value>
  <description>Part size for multipart upload.
  </description>
</property>

<property>
  <name>fs.obs.multiobjectdelete.maximum</name>
  <value>1000</value>
  <description>Max number of objects in one multi-object delete call.
  </description>
</property>

<property>
  <name>fs.obs.fast.upload.buffer</name>
  <value>disk</value>
  <description>Which buffer to use. Default is `disk`, value may be
    `disk` | `array` | `bytebuffer`.
  </description>
</property>

<property>
  <name>fs.obs.buffer.dir</name>
  <value>dir1,dir2,dir3</value>
  <description>Comma separated list of directories that will be used to buffer file
    uploads to. This option takes effect only when the option 'fs.obs.fast.upload.buffer'
    is set to 'disk'.
  </description>
</property>

<property>
  <name>fs.obs.fast.upload.active.blocks</name>
  <value>4</value>
  <description>Maximum number of blocks a single output stream can have active
    (uploading, or queued to the central FileSystem instance's pool of queued
    operations).
  </description>
</property>

<property>
  <name>fs.obs.readahead.range</name>
  <value>1024 * 1024</value>
  <description>Bytes to read ahead during a seek() before closing and
  re-opening the OBS HTTP connection. </description>
</property>

<property>
  <name>fs.obs.read.transform.enable</name>
  <value>true</value>
  <description>Flag indicating if socket connections can be reused by
    position read. Set `false` only for HBase.</description>
</property>

<property>
  <name>fs.obs.list.threads.core</name>
  <value>30</value>
  <description>Number of core list threads.</description>
</property>

<property>
  <name>fs.obs.list.threads.max</name>
  <value>60</value>
  <description>Maximum number of list threads.</description>
</property>

<property>
  <name>fs.obs.list.workqueue.capacity</name>
  <value>1024</value>
  <value>Capacity of list work queue.</value>
</property>

<property>
  <name>fs.obs.list.parallel.factor</name>
  <value>30</value>
  <description>List parallel factor.</description>
</property>

<property>
  <name>fs.obs.trash.enable</name>
  <value>false</value>
  <description>Switch for the fast delete.</description>
</property>

<property>
  <name>fs.obs.trash.dir</name>
  <description>The fast delete recycle directory.</description>
</property>

<property>
  <name>fs.obs.block.size</name>
  <value>128 * 1024 * 1024</value>
  <description>Default block size for OBS FileSystem.
  </description>
</property>

hadoop-huaweicloud 모듈 테스트 (Testing the hadoop-huaweicloud Module)

hadoop-huaweicloud 모듈은 전체 단위 테스트 제품군을 포함해요. 대부분의 테스트는 HuaweiCloud OBS에 대해 실행돼요. 이 테스트를 실행하려면 위 섹션에 언급된 OBS 계정 정보와 다음 속성으로 src/test/resources/auth-keys.xml을 만들어요:

<property>
    <name>fs.contract.test.fs.obs</name>
    <value>obs://obsfilesystem-bucket</value>
</property>

더 알아보기 (Learn more)