Hadoop에서 VolcanoEngine TOS 통합

Hadoop에서 VolcanoEngine TOS 통합 (Integration of VolcanoEngine TOS in Hadoop)

ByteDance가 만든 클라우드 벤더 Volcano Engine의 객체 저장소 서비스 TOS를 Hadoop과 연결하는 hadoop-tos 커넥터를 설명하는 문서예요. Hadoop MR, Hive, Spark가 HDFS 대신 TOS를 기반 저장소로 사용할 수 있게 해 줍니다.

출처: 문서

본문

개요 (Overview)

TOS는 ByteDance가 만든 클라우드 벤더인 Volcano Engine의 객체 저장소 서비스입니다. Hadoop-tos는 컴퓨팅 시스템과 기저 저장소 사이의 커넥터예요. Hadoop MR, Hive(mr과 tez 모두), Spark 같은 시스템에서 hadoop-tos는 HDFS 대신 TOS를 기저 저장소로 사용할 수 있게 해 줍니다.

빠른 시작 (Quick Start)

빠른 시작에서는 hadoop 셸 명령으로 tos 버킷에 접근합니다.

요구 사항 (Requirements)

  1. Volcano Engine 계정. 계정으로 TOS 버킷을 만듭니다.
  2. TOS에 접근할 수 있는 dev 환경. 예: 로컬 서버나 volcano engine 클라우드 서버.
  3. dev 환경에 hadoop 설치. Hadoop은 $HADOOP_HOME에 설치됩니다.

사용법 (Usage)

  • hadoop-tos 번들 tar를 컴파일합니다. hadoop-tos 번들은 hadoop 최종 tar 파일에 패키징되지 않습니다. 그래서 수동으로 컴파일해야 해요. hadoop 프로젝트를 다운로드하고 아래 명령으로 빌드합니다.
mvn package -DskipTests -pl org.apache.hadoop:hadoop-tos
  • 번들 jar 파일은 $HADOOP_HOME/hadoop-cloud-storage-project/hadoop-tos/target/hadoop-tos-{VERSION}.jar에 배치됩니다.
  • 번들 jar를 hdfs lib 경로로 복사합니다. hdfs lib 경로는 $HADOOP_HOME/share/hadoop/hdfs/lib입니다. 모든 hadoop 노드에 복사하는 것을 잊지 마세요.
cp hadoop-tos-{VERSION}.jar $HADOOP_HOME/share/hadoop/hdfs/lib/
  • 아래 속성들을 구성합니다.
<properties>
  <property>
    <name>fs.defaultFS</name>
    <value>tos://{your_bucket_name}/</value>
    <description>
      The name of the default file system. Make it your tos bucket.
    </description>
  </property>

  <property>
    <name>fs.tos.endpoint</name>
    <value></value>
    <description>
      Object storage endpoint to connect to, which should include both region and object domain name.
      e.g. 'fs.tos.endpoint'='tos-cn-beijing.volces.com'.
    </description>
  </property>

  <property>
    <name>fs.tos.impl</name>
    <value>org.apache.hadoop.fs.tosfs.TosFileSystem</value>
    <description>
      The implementation class of the tos FileSystem.
    </description>
  </property>

  <property>
    <name>fs.AbstractFileSystem.tos.impl</name>
    <value>org.apache.hadoop.fs.tosfs.TosFS</value>
    <description>
      The implementation class of the tos AbstractFileSystem.
    </description>
  </property>

  <property>
    <name>fs.tos.access-key-id</name>
    <value></value>
    <description>
      The access key of volcano engine's user or role.
    </description>
  </property>

  <property>
    <name>fs.tos.secret-access-key</name>
    <value></value>
    <description>
      The secret key of the access key specified by 'fs.tos.access-key-id'.
    </description>
  </property>
</properties>
  • hadoop 셸 명령으로 TOS에 접근합니다.
# 1. List root dir.
hadoop fs -ls /

# 2. Make directory.
hadoop fs -mkdir /hadoop-tos

# 3. Write and read.
echo "hello tos." > hello.txt
hadoop fs -put hello.txt /hadoop-tos/
hadoop fs -cat /hadoop-tos/hello.txt

# 4. Delete file and directory.
hadoop fs -rm -r /hadoop-tos/

소개 (Introduction)

hadoop-tos의 설계·기본 기능에 대한 간략한 소개입니다. 다음 내용은 기본적으로 flat 모드를 기준으로 하며, hierarchy 모드와의 차이는 각 절 끝에서 설명합니다.

TOS

TOS는 Volcano Engine의 객체 저장소 서비스입니다. AWS S3, Azure Blob Storage, Aliyun OSS와 비슷하며, 객체 빠른 복사, 객체 빠른 이름 변경, CRC32C 체크섬 같은 고유한 기능이 있습니다. TOS에 대한 자세한 내용은 https://www.volcengine.com/product/TOS에서 확인하세요.

TOS에는 flat 모드와 hierarchy 모드의 두 가지 모드가 있습니다. flat 모드에는 디렉터리가 없고 모든 객체는 객체 이름으로 인덱스된 파일입니다. 사용자는 객체 이름에 'slash'를 사용해 객체들을 서로 다른 "디렉터리"로 논리적으로 나눌 수 있지만, "슬래시로 나눈 디렉터리"는 실제가 아닙니다. 논리 디렉터리를 정리하는 것은 "디렉터리 경로"를 접두어로 가진 모든 파일을 정리하는 것입니다.

hierarchy 모드에는 디렉터리와 파일이 있습니다. 디렉터리 객체는 이름이 슬래시로 끝나는 객체입니다. 디렉터리 객체 이름으로 시작하는 모든 객체는 디렉터리 객체의 연속 객체이며, 함께 디렉터리 트리를 이룹니다. 디렉터리 객체는 어떤 데이터도 담을 수 없어요. 디렉터리 객체를 삭제·이름 변경하면 디렉터리 트리 아래의 모든 객체가 원자적으로 정리·이름 변경됩니다.

TOS는 빅데이터 시나리오에서 매우 유용한 몇 가지 특징적인 기능이 있습니다.

  1. fast copy 기능은 데이터를 복사하지 않고 객체를 복제할 수 있게 해 줍니다. 거대한 객체도 수십 밀리초 안에 복사할 수 있어요.
  2. fast rename 기능은 데이터를 복사하지 않고 객체를 새 이름으로 이름 변경할 수 있게 합니다.
  3. TOS는 CRC32C 체크섬을 지원합니다. 사용자가 HDFS와 TOS 사이의 파일 체크섬을 비교할 수 있게 합니다.

디렉터리와 파일 (Directory and file)

이 절은 hadoop-tos가 TOS를 hadoop FileSystem으로 변환하는 방법을 설명합니다. TOS는 객체 이름이 슬래시로 시작하지 않고, 연속 슬래시를 포함하지 않으며, 비어있지 않아야 한다고 요구합니다. 변환 규칙은 다음과 같습니다.

  • 객체 이름은 슬래시로 나눠 계층을 이룹니다.
  • 이름이 슬래시로 끝나는 객체는 디렉터리입니다.
  • 이름이 슬래시로 끝나지 않는 객체는 파일입니다.
  • 파일의 부모는 부모가 존재하는지와 관계없이 디렉터리입니다.

예를 들어 "user/table/"과 "user/table/part-0"의 2개 객체가 있다고 합시다. 첫 객체는 hadoop에서 "/user/table"에 매핑되고 디렉터리입니다. 두 번째 객체는 "/user/table/part-0"에 파일로 매핑됩니다. 존재하지 않는 객체 "user/"는 파일 "/user/table/part-0"의 부모이므로 "/user"에 디렉터리로 매핑됩니다.

객체 이름 객체 존재 FileSystem 경로 FileSystem 유형
user/table/ yes /user/table Directory
user/table/part-0 yes /user/table/part-0 File
user/ no /user Directory

위 FileSystem 요구사항은 flat 모드에서 강제 규칙이 아니며, 사용자가 위 요구사항을 위반하는 경우를 만들 수 있어요. 예: 부모가 파일인 파일 생성. hierarchy 모드에서는 요구사항이 TOS 서비스가 제어하는 강제 규칙이라 의미 위반이 없습니다.

나열, 이름 변경, 삭제 (List, Rename and Delete)

List, rename, delete는 flat 모드에서 비용이 큰 연산입니다. 네임스페이스가 평면이므로 디렉터리를 나열하려면 클라이언트가 디렉터리를 접두어로 가진 모든 객체를 스캔하고 구분자로 필터링해야 합니다. 디렉터리 rename·delete의 경우 클라이언트가 먼저 디렉터리를 나열해 모든 객체를 얻은 뒤 객체를 하나씩 이름 변경·삭제해야 합니다. 그래서 이들은 원자 연산이 아니며 hdfs에 비해 비용이 많이 듭니다.

hierarchy 모드의 특성은 디렉터리를 지원한다는 것입니다. 그래서 매우 빠르게 나열할 수 있고 디렉터리 rename·delete를 원자적으로 지원합니다. flat 모드의 rename·delete 실패는 버킷을 불일치 상태로 남길 수 있지만 hierarchy 모드는 이 문제가 없습니다.

파일 읽기와 쓰기 (Read and write file)

hadoop-tos의 읽기 동작은 HDFS 파일 읽기와 매우 비슷합니다. 과제는 입력 스트림을 객체와 일관되게 유지하는 것입니다. 파일을 연 뒤 객체가 바뀌면 입력 스트림이 실패해야 해요. 이는 파일을 열 때 파일 체크섬을 저장해 구현됩니다. 읽는 동안 파일이 바뀌면 입력 스트림이 체크섬을 비교해 예외를 트리거합니다.

hadoop-tos의 쓰기 동작은 hdfs와 약간 다릅니다. 첫째, append 인터페이스가 지원되지 않습니다. 둘째, 파일은 성공적으로 닫힐 때까지 보이지 않습니다. 마지막으로, 2개 클라이언트가 한 파일을 쓰려 하면 파일을 마지막으로 닫는 클라이언트가 이전 것을 덮어씁니다.

읽기·쓰기 모두 많은 성능 최적화가 있습니다. 예: 범위 읽기, 연결 재사용, 로컬 쓰기 버퍼, 작은 파일의 put, 큰 파일의 multipart-upload 등.

권한 (Permissions)

TOS 권한 모델은 hadoop filesystem 권한 모델과 다릅니다. TOS는 IAM, Bucket Policy, Bucket·Object ACL 기반 권한을 지원하는 반면, hadoop filesystem 권한 모델은 mode와 acl을 사용합니다. tos 권한을 hadoop filesystem 권한으로 매핑할 방법이 없으므로, TosFileSystem과 TosFS에서 가짜 권한(fake permissions)을 사용해야 합니다. 사용자는 파일 시스템 권한을 읽고 변경할 수 있지만, 그것은 보이기만 할 뿐 실효가 없습니다. 권한 제어는 결국 TOS 권한 모델에 달려 있습니다.

시간 (Times)

Hadoop-tos는 마지막 수정 시간을 지원하고 접근 시간은 지원하지 않습니다. 파일의 경우 마지막 수정 시간은 객체의 수정 시간입니다. 디렉터리의 경우 디렉터리 객체가 없으면 마지막 수정 시간은 현재 시스템 시간입니다. 디렉터리 객체가 있으면 getFileStatus 시 객체의 수정 시간, listStatus 시 현재 시스템 시간입니다.

파일 체크섬 (File checksum)

TOS는 기본적으로 CRC64ECMA 체크섬을 지원하며, Hadoop FileChecksum에 매핑됩니다. FileSystem#getFileChecksum 호출로 검색할 수 있습니다. HDFS와 호환되도록 TOS는 선택적 CRC32C 체크섬을 제공합니다. HDFS와 TOS 사이에서 distcp할 때 distcp 체크섬 메커니즘에 의존해 데이터를 일관되게 유지할 수 있어요. CRC32C를 사용하려면 아래 키를 구성합니다.

<configuration>
   <property>
      <name>fs.tos.checksum.enabled</name>
      <value>true</value>
   </property>
   <property>
      <name>fs.tos.checksum-algorithm</name>
      <value>COMPOSITE-CRC32C</value>
   </property>
   <property>
      <name>fs.tos.checksum-type</name>
      <value>CRC32C</value>
   </property>
</configuration>

자격 증명 (Credential)

TOS 클라이언트는 access key id와 secret access key로 tos 서비스에 인증합니다. 구성하는 두 가지 방법이 있습니다. 첫째는 core-site.xml에 추가하거나 -D 파라미터로 구성하는 등 hadoop 구성에 추가하는 것입니다. 둘째는 환경 변수를 설정하는 것인데, hadoop-tos가 환경 변수를 자동으로 검색합니다.

hadoop 구성에서 ak, sk를 구성하려면 아래 키를 사용합니다.

<configuration>
  <!--Set global ak, sk for all buckets.-->
  <property>
    <name>fs.tos.access-key-id</name>
    <value></value>
    <description>
      The accessKey key to access the tos object storage.
    </description>
  </property>
  <property>
    <name>fs.tos.secret-access-key</name>
    <value></value>
    <description>
      The secret access key to access the object storage.
    </description>
  </property>
  <property>
    <name>fs.tos.session-token</name>
    <value></value>
    <description>
      The session token to access the object storage.
    </description>
  </property>

  <!--Set ak, sk for specified bucket. It has higher priority then the global keys.-->
  <property>
    <name>fs.tos.bucket.{bucket_name}.access-key-id</name>
    <value></value>
    <description>
      The access key to access the object storage for the configured bucket.
    </description>
  </property>
  <property>
    <name>fs.tos.bucket.{bucket_name}.secret-access-key</name>
    <value></value>
    <description>
      The secret access key to access the object storage for the configured bucket.
    </description>
  </property>
  <property>
    <name>fs.tos.bucket.{bucket_name}.session-token</name>
    <value></value>
    <description>
      The session token to access the object storage for the configured bucket.
    </description>
  </property>
</configuration>

환경 변수의 ak, sk는 최우선 순위를 가지며 없으면 hadoop 구성으로 자동 폴백합니다. 우선 순위는 fs.tos.credential.provider.custom.classes로 바꿀 수 있습니다.

커미터 (Committer)

Hadoop-tos는 더 나은 성능을 위한 MapReduce 작업 커미터를 제공합니다. 기본적으로 hadoop은 FileOutputCommitter를 사용하는데, 파일을 여러 번 이름 변경합니다. 먼저 작업들이 커밋할 때 파일이 출력 경로로 이름 변경됩니다. 그런 다음 작업이 커밋할 때 파일이 출력 경로에서 최종 경로로 이름 변경됩니다. hdfs를 사용할 때 rename은 메타만 바꾸므로 문제가 되지 않습니다. 하지만 TOS에서는 기본적으로 rename이 복사와 삭제로 구현되어 비용이 많이 들어요.

TOS committer는 객체 저장소를 위해 최적화된 구현입니다. 작업 커밋 시 파일들에 대해 multipart-upload를 완료하지 않고, multipart-upload 완료에 필요한 모든 정보를 포함한 pending set 파일을 씁니다. 그런 다음 작업 커밋 시 모든 pending 파일을 읽고 모든 multipart-upload를 완료합니다.

대안 방법은 TOS renameObject 스위치를 켜고 여전히 FileOutputFormat을 사용하는 것입니다. 객체는 메타 변경만으로 이름 변경됩니다. 성능은 hadoop-tos committer보다 약간 느린데, TOS rename 객체를 사용하면 각 파일이 먼저 커밋된 뒤 최종 경로로 이름 변경되기 때문입니다. TOS에 커밋 요청 1개와 rename 요청 2개가 있습니다. 하지만 hadoop-tos committer를 쓰면 객체 커밋이 지연되고 rename 요청 오버헤드가 없습니다.

hadoop-tos committer를 활성화하려면 아래 키 값을 구성합니다.

<configurations>
   <!-- mapreduce v1 -->
   <property>
      <name>mapred.output.committer.class</name>
      <value>org.apache.hadoop.fs.tosfs.commit.mapred.Committer</value>
   </property>
   <!-- mapreduce v2 -->
   <property>
      <name>mapreduce.outputcommitter.factory.scheme.tos</name>
      <value>org.apache.hadoop.fs.tosfs.commit.CommitterFactory</value>
   </property>
</configurations>

tos objectRename을 활성화하려면 먼저 tos에서 object rename 스위치를 켠 뒤 아래 키 값을 구성합니다.

<configurations>
   <property>
      <name>fs.tos.rename.enabled</name>
      <value>true</value>
   </property>
</configurations>

속성 요약 (Properties Summary)

속성 설명 기본값 필수
fs.tos.access-key-id tos 객체 저장소에 접근할 accessKey 키 NONE YES
fs.tos.secret-access-key 객체 저장소에 접근할 secret access key NONE YES
fs.tos.session-token 객체 저장소에 접근할 session token NONE NO
fs.%s.endpoint 접속할 객체 저장소 endpoint(region과 객체 도메인 이름 모두 포함) NONE NO
fs.%s.region 객체 저장소의 region. 예: fs.tos.region. "fs.%s.endpoint"를 파싱해 region 파악 NONE NO
fs.tos.bucket.%s.access-key-id 구성된 버킷(%s는 버킷 이름)의 객체 저장소 접근 키 NONE NO
fs.tos.bucket.%s.secret-access-key 구성된 버킷(%s는 버킷 이름)의 secret access key NONE NO
fs.tos.bucket.%s.session-token 구성된 버킷(%s는 버킷 이름)의 session token NONE NO
fs.tos.credentials.provider SimpleCredentialsProvider, EnvironmentCredentialsProvider 순으로 자격 증명을 찾는 기본 자격 증명 프로바이더 체인 org.apache.hadoop.fs.tosfs.object.tos.auth.DefaultCredentialsProviderChain NO
fs.tos.credential.provider.custom.classes 사용자 정의 자격 증명 프로바이더 클래스. 여러 프로바이더면 클래스 이름을 쉼표로 구분 org.apache.hadoop.fs.tosfs.object.tos.auth.EnvironmentCredentialsProvider,org.apache.hadoop.fs.tosfs.object.tos.auth.SimpleCredentialsProvider NO
fs.tos.http.maxConnections 클라이언트가 TOS 서비스에 만들 수 있는 최대 연결 수 1024 NO
fs.tos.http.idleConnectionTimeMills 연결 스레드가 유휴 상태일 수 있는 시간. 이보다 크면 스레드 종료 60000 NO
fs.tos.http.connectTimeoutMills tos 클라이언트가 TOS 서비스에 연결하려 시도하는 연결 타임아웃 10000 NO
fs.tos.http.readTimeoutMills tos에서 데이터를 읽을 때의 읽기 타임아웃. tos 클라이언트 sdk용으로 구성됨(hadoop-tos 아님) 30000 NO
fs.tos.http.writeTimeoutMills tos에 데이터를 업로드할 때의 쓰기 타임아웃. tos 클라이언트 sdk용으로 구성됨(hadoop-tos 아님) 30000 NO
fs.tos.http.enableVerifySSL TOS에 대한 SSL 연결 활성화 여부 true NO
fs.tos.http.dnsCacheTimeMinutes tos 클라이언트에서 사용하는 dns 캐시의 타임아웃(분) 0 NO
fs.tos.rmr.server.enabled 디렉터리 버킷용. TOS 서버에서 재귀 삭제 능력을 활성화할지 여부. 주어진 디렉터리 아래 모든 객체를 원자적으로 삭제. 아니면 클라이언트가 모든 하위 객체를 나열하고 TOS에 배치 삭제 요청 false NO
fs.tos.rmr.client.enabled true면 클라이언트가 주어진 디렉터리 아래 모든 객체를 나열해 배치로 삭제. true로 설정하면 TOS SDK의 재귀 삭제 능력 사용, 아니면 전위 트리 순회로 객체를 하나씩 삭제 true NO
fs.tos.user.agent.prefix TOS SDK에서 제품 이름으로 사용될 접두어. 최종 user agent 패턴은 '{prefix}/TOS_FS/{hadoop tos version}' HADOOP-TOS NO
fs.tos.max-drain-bytes get object의 tos 객체 inputstream 닫기 중 소켓 연결 재사용 여부를 최적화하는 임계값. 닫는 동안 남은 바이트가 최대 drain 바이트보다 적으면 소켓 연결을 닫는 대신 바이트를 건너뜀 1024 * 1024L NO
fs.tos.client.disable.cache 현재 JVM에서 tos http 클라이언트 캐시를 비활성화할지 여부 false NO
fs.tos.batch.delete.objects-count 객체를 배치로 삭제할 때의 배치 크기 1000 NO
fs.tos.batch.delete.max-retries 객체 배치 삭제 실패 시 최대 재시도 횟수 20 NO
fs.tos.batch.delete.retry-codes TOS deleteMultiObjects 응답의 코드. 응답에 이 코드만 있으면 클라이언트가 실패한 키를 다시 삭제하기 위해 배치 삭제 요청을 재전송. 아니면 더 이상 요청 안 함 ExceedAccountQPSLimit,ExceedAccountRateLimit,ExceedBucketQPSLimit,ExceedBucketRateLimit,InternalError,ServiceUnavailable,SlowDown,TooManyRequests NO
fs.tos.batch.delete.retry.interval 배치 삭제 실패 시 재시도 간격(밀리초) 1000 NO
fs.tos.list.objects-count 주어진 객체 저장소에 대한 요청당 객체 나열 배치 크기(디렉터리 나열, 디렉터리 경로로 시작하는 모든 객체 검색 등) 1000 NO
fs.tos.request.max.retry.times TOS 클라이언트를 통한 요청 전송의 최대 재시도 횟수. SocketException, UnknownHostException, SSLException, InterruptedException, SocketTimeoutException 같은 재시도 가능 예외나 TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR http 코드를 받으면 재전송 20 NO
fs.tos.fast-fail-409-error-codes fast-fail 오류 코드는 재시도로 해결할 수 없는 오류를 의미. 409 http 상태와 오류 코드가 구성된 비재시도 오류 코드 목록에 있으면 재시도 안 함 0026-00000013,0026-00000020,0026-00000021,0026-00000025,0026-00000026,0026-00000027 ,0017-00000208,0017-00000209 NO
fs.tos.inputstream.max.retry.times TOS 클라이언트로 객체 내용을 읽는 최대 재시도 횟수. 읽는 중 예기치 않은 스트림 끝 오류를 받으면 새 입력 스트림을 만들도록 재전송 5 NO
fs.tos.crc.check.enable tos에 파일을 업로드할 때 crc 검사 활성화 여부 true NO
fs.tos.get-file-status.enabled tos getFileStatus API 활성화 여부. 한 번의 RPC 요청으로 객체 정보를 직접 반환. 아니면 객체 정보를 얻기 위해 RPC 요청 3개를 보내야 할 수 있음. 예: TOS에 'a/b/c' 키가 있고 'a/b' 객체 상태를 얻으려 할 때 GetFileStatus('a/b')는 접두어 'a/b/'를 디렉터리 객체로 직접 반환. 비활성화하면 먼저 head('a/b'), 그다음 head('a/b/'), 마지막으로 list('a/b/', limit=1) 호출 필요. GetFileStatus API로 RPC 호출 수를 줄일 수 있음 true NO
fs.tos.checksum-algorithm tos 체크섬 알고리즘 이름 키. 서로 다른 저장 시스템 간 체크섬을 비교하기 위해 알고리즘 이름 지정. 예: hdfs와 tos 간 체크섬 비교에는 COMPOSITE-CRC32C로 구성 TOS-CHECKSUM NO
fs.tos.checksum-type tos에서 파일 체크섬을 검색하는 방법 키. 구성한 체크섬 유형을 tos가 지원하지 않으면 오류 발생. 지원 체크섬 유형: CRC32C, CRC64ECMA CRC64ECMA NO
fs.objectstorage.%s.impl 정의된 스킴의 객체 저장소 구현. 예: 'abc' 스킴을 TOS(또는 다른 객체 저장소)로 위임해 'abc://bucket/path/to/key'로 TOS 객체 저장소 접근 NONE NO
fs.%s.delete.batch-size 주어진 객체 저장소의 요청당 여러 객체 삭제 배치 크기. 예: fs.tos.delete.batch-size 250 NO
fs.%s.multipart.size 주어진 객체 저장소의 multipart upload 파트 크기. 예: fs.tos.multipart.size 8388608 NO
fs.%s.multipart.copy-threshold 주어진 객체 저장소에서 객체 복사 중 multipart upload를 활성화할 임계값(이보다 크면). 복사 데이터 크기가 임계값보다 작으면 uploadPartCopy 대신 copyObject로 복사. 예: fs.tos.multipart.copy-threshold 5242880 NO
fs.%s.multipart.threshold 주어진 객체 저장소에 데이터 쓰기 중 multipart upload 활성화를 제어하는 임계값. 쓰기 데이터 크기가 임계값보다 작으면 multipart upload 대신 simple put으로 기록. 예: fs.tos.multipart.threshold 10485760 NO
fs.%s.multipart.staging-buffer-size 스테이징 데이터를 staging 파일로 플러시하기 전에 메모리에 버퍼링할 최대 바이트 크기. 작은 파일을 많이 쓸 때 로컬 staging 디스크의 임의 쓰기를 극적으로 줄임 4096 NO
fs.%s.multipart.staging-dir 주어진 객체 저장소의 multipart upload 파트 staging 디렉터리. staging 디렉터리가 여러 개면 쉼표로 구분 ${java.io.tmpdir}/multipart-staging-dir NO
fs.%s.missed.parent.dir.async-create 파일·디렉터리 삭제·이름 변경 중 누락된 부모 디렉터리를 비동기로 만들려면 true true NO
fs.%s.rename.enabled rename 파일 중 객체 저장소의 rename 의미 사용 여부. 아니면 copy + delete 사용. 객체 저장소가 rename 의미를 지원·활성화했는지 확인하고, 요청자에게 rename 권한을 부여해야 함. TOS를 쓰면 rename 요청 전에 putBucketRename 요청을 보내야 함. 아니면 MethodNotAllowed 예외 발생 false NO
fs.%s.task.thread-pool-size 객체 저장소 입력 스트림을 열 때의 범위 크기. 양수여야 함. 주어진 객체 fs에서 삭제 객체, 파일 복사 같은 작업을 병렬 실행하는 데 사용하는 스레드 풀 크기 Long.MAX_VALUE NO
fs.%s.multipart.thread-pool-size 주어진 객체 저장소의 multipart 병렬 업로드에 사용되는 스레드 풀 크기. 예: fs.tos.multipart.thread-pool-size 2와 사용 가능 프로세서 중 최대값 NO
fs.%s.checksum.enabled 주어진 객체의 상태를 가져오는 동안 체크섬 활성화 여부 토글. 예: fs.tos.checksum.enabled 2와 사용 가능 프로세서 중 최대값 NO
fs.filestore.checksum-algorithm filestore 체크섬 알고리즘 이름 키. 서로 다른 저장 시스템에 맞게 알고리즘 이름 지정. 예: hdfs 스타일 이름은 COMPOSITE-CRC32, COMPOSITE-CRC32C TOS-CHECKSUM NO
fs.filestore.checksum-type filestore에서 파일 체크섬을 검색하는 방법 키. 구성한 체크섬 유형을 지원하지 않으면 오류 발생. 지원 체크섬 유형: MD5 MD5 NO

hadoop-tos 모듈에서 유닛 테스트 실행

유닛 테스트는 tos 서비스에 연결해야 합니다. 유닛 테스트를 실행하려면 아래 6개 환경 변수를 설정하세요.

export TOS_ACCESS_KEY_ID={YOUR_ACCESS_KEY}
export TOS_SECRET_ACCESS_KEY={YOUR_SECRET_ACCESS_KEY}
export TOS_ENDPOINT={TOS_SERVICE_ENDPOINT}
export FILE_STORAGE_ROOT=/tmp/local_dev/
export TOS_BUCKET={YOUR_BUCKET_NAME}
export TOS_UNIT_TEST_ENABLED=true

그런 다음 hadoop 프로젝트 루트 디렉터리로 이동해 아래 테스트 명령을 실행합니다.

mvn -Dtest=org.apache.hadoop.fs.tosfs.** test -pl org.apache.hadoop:hadoop-tos

더 알아보기 (Learn more)