Hadoop에서 Tencent COS 통합

Hadoop에서 Tencent COS 통합

Tencent COS는 Tencent Corp의 유명한 객체 스토리지 시스템이에요. Hadoop-COS는 HDFS 기반 상위 컴퓨팅 시스템이 COS를 기본 스토리지 시스템으로 사용할 수 있게 하는 클라이언트예요. 지원이 확인된 빅데이터 처리 시스템은 Hadoop MR, Spark, Alluxio 등이에요. 또한 Druid도 HDFS-Load-Plugin을 HADOOP-COS와 통합해 구성하면 COS를 deep storage로 사용할 수 있어요.

출처: 문서

본문

소개 (Introduction)

Tencent COS는 Tencent Corp가 제공하는 유명한 객체 스토리지 시스템이에요. Hadoop-COS는 HDFS 기반 상위 컴퓨팅 시스템이 COS를 기본 스토리지 시스템으로 사용할 수 있게 하는 클라이언트예요. 지원이 확인된 빅데이터 처리 시스템은 Hadoop MR, Spark, Alluxio 등이에요. 또한 Druid도 HDFS-Load-Plugin을 HADOOP-COS와 통합해 구성하면 COS를 deep storage로 사용할 수 있어요.

기능 (Features)

  • Hadoop MapReduce와 Spark가 COS에 데이터를 직접 쓰고 읽을 수 있게 지원.
  • Hadoop 파일시스템의 인터페이스를 구현하고 HDFS와 동일한 의사-계층적(pseudo-hierarchical) 디렉터리 구조를 제공.
  • 대용량 파일에 대한 multipart upload 지원. 단일 파일은 최대 19TB까지 지원.
  • 고성능과 고가용성. Hadoop-COS와 HDFS의 성능 차이는 30% 이내.

참고 (Notes): 객체 스토리지는 파일시스템이 아니며 몇 가지 제한이 있어요:

  • 객체 스토리지는 키-값 스토리지이며 자연스럽게 계층적 디렉터리를 지원하지 않아요. 보통 객체 키의 디렉터리 구분자를 사용해 계층적 디렉터리를 시뮬레이션해요. 예: "/hadoop/data/words.dat"
  • COS 객체 스토리지는 현재 객체의 append 연산을 지원하지 않아요. 즉 기존 객체(파일) 끝에 내용을 추가할 수 없어요.
  • delete와 rename 연산 모두 비-원자적(non-atomic)이에요. 즉 연산이 중단되면 연산 결과가 일관성 없는 상태일 수 있어요.
  • 객체 스토리지는 다른 권한 모델을 가져요: 디렉터리 권한은 777로 보고되고, 파일 권한은 666으로 보고되며, 파일 소유자는 로컬 현재 사용자로, 파일 그룹도 로컬 현재 사용자로 보고돼요.
  • 대용량 파일(최대 40TB)에 대한 multipart upload를 지원하지만 part 수는 10000으로 제한돼요.
  • 한 번에 나열되는 파일 수는 1000으로 제한돼요.

빠른 시작 (Quick Start)

개념 (Concepts)

  • Bucket: COS에서 데이터를 저장하는 컨테이너. 이름은 사용자 정의 bucketname과 사용자 appid로 구성돼요.
  • Appid: 사용자 차원의 고유 리소스 식별자.
  • SecretId: 사용자를 인증하는 데 사용되는 ID.
  • SecretKey: 사용자를 인증하는 데 사용되는 키.
  • Region: bucket이 위치한 지역.
  • CosN: Hadoop-COS는 URI 스킴으로 cosn을 사용하므로 CosN은 종종 Hadoop-COS를 가리키는 데 사용돼요.

사용법 (Usage)

시스템 요구사항 (System Requirements)

  • Linux 커널 2.6+

의존성 (Dependencies)

  • cos_api (버전 5.4.10 이상)
  • cos-java-sdk (버전 2.0.6 권장)
  • joda-time (버전 2.9.9 권장)
  • httpClient (버전 4.5.1 이상 권장)
  • Jackson: jackson-core, jackson-databind, jackson-annotations (버전 2.9.8 이상)
  • bcprov-jdk18on (버전 1.82 권장)

속성 구성 (Configure Properties)

URI와 Region 속성 (URI and Region Properties)

Hadoop 또는 다른 빅데이터 시스템의 기본 파일시스템으로 COS를 사용하려면 core-site.xml에서 fs.defaultFS를 Hadoop-COS의 URI로 구성해야 해요. Hadoop-COS는 URI 스킴으로 cosn을, URI 호스트로 bucket을 사용해요. 동시에 bucket이 위치한 region을 나타내도록 fs.cosn.userinfo.region을 명시적으로 설정해야 해요.

참고: Hadoop-COS에서 fs.defaultFS는 선택 사항이에요. COS를 Hadoop의 데이터 소스로 잠깐만 사용한다면 이 속성을 설정할 필요 없이 사용할 때 전체 URI만 지정하면 돼요. 예: hadoop fs -ls cosn://testBucket-125236746/testDir/test.txt.

fs.cosn.userinfo.region은 Hadoop-COS의 필수 속성이에요. 그 이유는 Hadoop-COS가 접근할 정확한 URL을 구성하기 위해 사용 중인 bucket의 region을 알아야 하기 때문이에요. COS는 멀티-region 스토리지를 지원하며, region마다 기본적으로 다른 접근 도메인이 있어요. 업로드·다운로드 속도를 높이기 위해 자신의 비즈니스 시나리오에 따라 가장 가까운 스토리지 region을 선택하는 것을 권장해요. 사용 가능한 region은 https://intl.cloud.tencent.com/document/product/436/6224 에서 찾을 수 있어요.

다음은 예시예요:

<property>
    <name>fs.defaultFS</name>
    <value>cosn://<bucket-appid></value>
    <description>
        Optional: If you don't want to use CosN as the default file system, you don't need to configure it.
    </description>
</property>

<property>
    <name>fs.cosn.bucket.region</name>
    <value>ap-xxx</value>
    <description>The region where the bucket is located</description>
</property>

사용자 인증 속성 (User Authentication Properties)

각 사용자는 COS에 저장된 객체에 접근하기 위해 자격 증명(사용자의 secretId와 secretKey)을 올바르게 구성해야 해요. 이 자격 증명은 Tencent Cloud가 제공하는 공식 콘솔에서 얻을 수 있어요.

<property>
    <name>fs.cosn.credentials.provider</name>
    <value>org.apache.hadoop.fs.auth.SimpleCredentialsProvider</value>
    <description>

        This option allows the user to specify how to get the credentials.
        Comma-separated class names of credential provider classes which implement
        com.qcloud.cos.auth.COSCredentialsProvider:

        1.org.apache.hadoop.fs.auth.SimpleCredentialsProvider: Obtain the secret id and secret key from fs.cosn.userinfo.secretId and fs.cosn.userinfo.secretKey in core-site.xml
        2.org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider: Obtain the secret id and secret key from system environment variables named COS_SECRET_ID and COS_SECRET_KEY

        If unspecified, the default order of credential providers is:
        1. org.apache.hadoop.fs.auth.SimpleCredentialsProvider
        2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider

    </description>
</property>

<property>
    <name>fs.cosn.userinfo.secretId</name>
    <value>xxxxxxxxxxxxxxxxxxxxxxxxx</value>
    <description>Tencent Cloud Secret Id </description>
</property>

<property>
    <name>fs.cosn.userinfo.secretKey</name>
    <value>xxxxxxxxxxxxxxxxxxxxxxxx</value>
    <description>Tencent Cloud Secret Key</description>
</property>

통합 속성 (Integration Properties)

Hadoop이 COS를 기본 파일시스템으로 올바르게 통합하려면 A와 B 옵션을 명시적으로 지정해야 해요. Hadoop이 COS를 기본 파일시스템으로 통합할 수 있게 하려면 fs.cosn.impl과 fs.AbstractFileSystem.cosn.impl을 올바르게 설정해야 해요. fs.cosn.impl은 org.apache.hadoop.fs.cos.CosFileSystem으로, fs.AbstractFileSystem.cosn.impl은 org.apache.hadoop.fs.cos.CosN으로 설정해야 해요.

<property>
    <name>fs.cosn.impl</name>
    <value>org.apache.hadoop.fs.cosn.CosNFileSystem</value>
    <description>The implementation class of the CosN Filesystem</description>
</property>

<property>
    <name>fs.AbstractFileSystem.cosn.impl</name>
    <value>org.apache.hadoop.fs.cos.CosN</value>
    <description>The implementation class of the CosN AbstractFileSystem.</description>
</property>

기타 실행 속성 (Other Runtime Properties)

Hadoop-COS는 풍부한 런타임 속성을 제공하며, 대부분은 잘 동작하는 기본값이 제공되므로 사용자 지정 값이 필요하지 않아요. 중요하게 주의할 점:

  • Hadoop-COS는 일부 임시 파일을 생성하고 디스크 공간을 소비해요. 모든 임시 파일은 옵션 fs.cosn.tmp.dir이 지정하는 디렉터리에 배치돼요 (기본값: /tmp/hadoop_cos).
  • 기본 블록 크기는 8MB이며, 이것은 COS blob 스토리지 시스템에 단일 파일을 최대 78GB까지만 업로드할 수 있다는 뜻이에요. 이것은 주로 multipart-upload가 최대 10,000블록까지만 지원하기 때문이에요. 더 큰 단일 파일을 지원해야 한다면 fs.cosn.block.size 속성을 설정해 블록 크기를 그에 맞게 늘려야 해요. 예를 들어 가장 큰 단일 파일 크기가 1TB라면 블록 크기는 최소한 (1 * 1024 * 1024 * 1024 * 1024)/10000 = 109951163 이상이어야 해요. 현재 최대 지원 파일은 19TB (블록 크기: 2147483648)예요.
<property>
    <name>fs.cosn.tmp.dir</name>
    <value>/tmp/hadoop_cos</value>
    <description>Temporary files would be placed here.</description>
</property>

<property>
    <name>fs.cosn.buffer.size</name>
    <value>33554432</value>
    <description>The total size of the buffer pool.</description>
</property>

<property>
    <name>fs.cosn.block.size</name>
    <value>8388608</value>
    <description>
    Block size to use cosn filesysten, which is the part size for MultipartUpload. Considering the COS supports up to 10000 blocks, user should estimate the maximum size of a single file. For example, 8MB part size can allow  writing a 78GB single file.
    </description>
</property>

<property>
    <name>fs.cosn.maxRetries</name>
    <value>3</value>
    <description>
      The maximum number of retries for reading or writing files to COS, before throwing a failure to the application.
    </description>
</property>

<property>
    <name>fs.cosn.retry.interval.seconds</name>
    <value>3</value>
    <description>The number of seconds to sleep between each COS retry.</description>
</property>

속성 요약 (Properties Summary)

properties description default value required
fs.defaultFS Hadoop이 사용하는 기본 파일시스템을 구성. None NO
fs.cosn.credentials.provider 사용자가 자격 증명을 얻는 방법을 지정. com.qcloud.cos.auth.COSCredentialsProvider를 구현하는 자격 증명 제공자 클래스의 쉼표 구분 클래스 이름: 1. org.apache.hadoop.fs.cos.auth.SimpleCredentialsProvider: core-site.xml의 fs.cosn.userinfo.secretId와 fs.cosn.userinfo.secretKey에서 secret id와 secret key를 얻음; 2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider: COSN_SECRET_ID와 COSN_SECRET_KEY라는 시스템 환경 변수에서 secret id와 secret key를 얻음. 지정하지 않으면 기본 순서는: 1. org.apache.hadoop.fs.auth.SimpleCredentialsProvider; 2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider. None NO
fs.cosn.userinfo.secretId/secretKey 계정의 API 키 정보 None YES
fs.cosn.bucket.region bucket이 위치한 region None YES
fs.cosn.impl CosN 파일시스템의 구현 클래스 None YES
fs.AbstractFileSystem.cosn.impl CosN AbstractFileSystem의 구현 클래스 None YES
fs.cosn.tmp.dir 프로그램 실행 중 cosn이 생성한 임시 파일이 여기에 저장됨 /tmp/hadoop_cos NO
fs.cosn.buffer.size 버퍼 풀의 총 크기. 블록 크기보다 크거나 같아야 함 33554432 NO
fs.cosn.block.size 파일 블록 크기. 각 파일은 최대 10,000개로 나눠 업로드할 수 있다는 제한을 고려해, 사용하는 단일 파일의 최대 크기에 따라 옵션을 설정해야 함. 예: 8MB part 크기로 78GB 단일 파일을 쓸 수 있음 8388608 NO
fs.cosn.upload_thread_pool 파일을 COS로 스트리밍할 때 동시 업로드에 사용되는 스레드 수 CPU 코어 수 * 3 NO
fs.cosn.read.ahead.block.size 각 read-ahead 블록의 크기 524288 (512KB) NO
fs.cosn.read.ahead.queue.size 각 read-ahead 큐의 길이 10 NO

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

CosN 파일시스템을 테스트하려면 테스트 러너에 인증 세부 정보를 전달하는 다음 두 파일이 필요해요:

  • auth-keys.xml
  • core-site.xml

이 두 파일은 hadoop-cloud-storage-project/hadoop-cos/src/test/resource 디렉터리 아래에 만들어야 해요.

auth-keys.xml

COS 자격 증명은 auth-keys.xml에 지정할 수 있어요. 동시에 이것은 CosN 파일시스템 테스트의 트리거이기도 해요. COS bucket URL은 test.fs.cosn.name 옵션을 지정해 제공해야 해요. auth-keys.xml의 예는 다음과 같아요:

<configuration>
    <property>
        <name>test.fs.cosn.name</name>
        <value>cosn://testbucket-12xxxxxx</value>
    </property>
    <property>
        <name>fs.cosn.bucket.region</name>
        <value>ap-xxx</value>
        <description>The region where the bucket is located</description>
    </property>
    <property>
        <name>fs.cosn.userinfo.secretId</name>
        <value>AKIDXXXXXXXXXXXXXXXXXXXX</value>
    </property>
    <property>
        <name>fs.cosn.userinfo.secretKey</name>
        <value>xxxxxxxxxxxxxxxxxxxxxxxxx</value>
    </property>
</configuration>

이 파일이 없으면 이 모듈의 모든 테스트는 건너뛰어져요.

core-site.xml

이 파일은 사전에 존재하며 auth-keys.xml에 만든 구성을 소스로 참조해요. 대부분의 경우 수정이 필요 없어요. 테스트 중에 특정 비-기본 속성을 설정해야 하는 경우를 제외하고요.

contract-test-options.xml

conctract 테스트 지원과 관련된 모든 구성은 contract-test-options.xml에 지정해야 해요. 다음은 contract-test-options.xml의 예시예요:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <include xmlns="http://www.w3.org/2001/XInclude"
             href="auth-keys.xml"/>
    <property>
        <name>fs.contract.test.fs.cosn</name>
        <value>cosn://testbucket-12xxxxxx</value>
    </property>

    <property>
        <name>fs.cosn.bucket.region</name>
        <value>ap-xxx</value>
        <description>The region where the bucket is located</description>
    </property>

</configuration>

파일에서 fs.contract.test.fs.cosn 옵션이 정의되지 않으면 모든 contract 테스트가 건너뛰어져요.

기타 이슈 (Other issues)

성능 저하 (Performance Loss)

COS의 IO 성능은 원칙적으로 HDFS보다 낮아요. Tencent CVM에서 실행되는 가상 클러스터에서도 마찬가지예요. 주된 이유는 다음 지점들로 귀결돼요:

  • HDFS는 더 빠른 쿼리를 위해 데이터를 복제해요.
  • HDFS는 많은 "메타데이터" 연산(디렉터리 내용 나열, 경로에서 getFileStatus() 호출, 디렉터리 생성·삭제)에서 훨씬 빠르지만 secondary name node의 기여도 있어요.
  • HDFS는 데이터를 로컬 하드 디스크에 저장해, 코드가 그 호스트에서 실행될 수 있다면 네트워크 트래픽을 피할 수 있어요. 하지만 COS에 저장된 객체에 대한 접근은 거의 매번 네트워크 접근이 필요해요. 이것은 IO 성능을 떨어뜨리는 결정적 지점이에요.
  • Hadoop-COS는 이를 위해 pre-read 큐, 업로드 버퍼 풀, 동시 업로드 스레드 풀 등 많은 최적화 작업을 수행해요.

많은 seek 호출/위치 지정 읽기(positioned read) 호출을 수행하는 파일 IO는 만들어지는 HTTP 요청의 크기 때문에 성능 문제를 겪을 수도 있어요. pre-read 캐시 최적화에도 불구하고 많은 수의 랜덤 읽기는 여전히 빈번한 네트워크 요청을 유발할 수 있어요.

HDFS에서 디렉터리나 파일의 rename과 mv는 모두 원자적이고 O(1) 수준의 연산이지만, COS에서는 복사와 삭제를 순차적으로 결합해야 해요. 따라서 COS 객체에 대한 rename·move 연산을 수행하는 것은 성능이 낮을 뿐만 아니라 데이터 일관성을 보장하기도 어려워요.

현재 Hadoop-COS를 통해 COS blob 스토리지 시스템을 사용하면 HDFS에 비해 약 20%~25%의 성능 손실이 발생해요. 하지만 COS 사용 비용은 스토리지 비용과 유지보수 비용을 모두 포함해 HDFS보다 낮아요.

더 알아보기 (Learn more)