HadoopにおけるTencent COSの統合

はじめに

Tencent COSは、Tencent Corp.が提供する有名なオブジェクトストレージシステムです。Hadoop-COSは、HDFSベースの上位コンピューティングシステムがCOSを基盤となるストレージシステムとして使用できるようにするクライアントです。サポートが確認されているビッグデータ処理システムは、Hadoop MR、Spark、Alluxioなどです。さらに、DruidはHADOOP-COSと統合されたHDFS-Load-Pluginを設定することで、COSをディープストレージとして使用することもできます。

機能

  • Hadoop MapReduceおよびSparkがCOSにデータを書き込み、そこから直接読み取ることをサポートします。

  • Hadoopファイルシステムのインターフェースを実装し、HDFSと同じ擬似階層ディレクトリ構造を提供します。

  • 大きなファイル用のマルチパートアップロードをサポートします。単一ファイルは最大19TBまでサポートします。

  • 高パフォーマンスと高可用性。Hadoop-COSとHDFSのパフォーマンスの差は30%以内です。

注記

オブジェクトストレージはファイルシステムではなく、いくつかの制限があります。

  1. オブジェクトストレージはキーバリューストレージであり、自然に階層ディレクトリをサポートしません。通常、オブジェクトキーのディレクトリ区切り文字を使用して、「/hadoop/data/words.dat」のように階層ディレクトリをシミュレートします。

  2. COSオブジェクトストレージは現在、オブジェクトの追加操作をサポートしていません。つまり、既存のオブジェクト(ファイル)の末尾にコンテンツを追加することはできません。

  3. deleteおよびrename操作はどちらもアトミックではありません。つまり、操作が中断された場合、操作結果が矛盾した状態になる可能性があります。

  4. オブジェクトストレージには異なる認証モデルがあります。

  • ディレクトリのアクセス権は777として報告されます。

  • ファイルのアクセス権は666として報告されます。

  • ファイルの所有者は、ローカルの現在のユーザーとして報告されます。

  • ファイルグループも、ローカルの現在のユーザーとして報告されます。

  1. 大きなファイル(最大40TB)用のマルチパートアップロードをサポートしますが、パート数は10000に制限されています。

  2. 一度にリストされるファイル数は1000に制限されています。

クイックスタート

概念

  • バケット: COSにデータを格納するためのコンテナ。名前は、ユーザー定義のバケット名とユーザーのappidで構成されます。

  • Appid: ユーザーディメンションの一意のリソース識別子。

  • SecretId: ユーザーの認証に使用されるID

  • SecretKey: ユーザーの認証に使用されるキー

  • リージョン: バケットが配置されているリージョン。

  • CosN: Hadoop-COSはURIスキームとしてcosnを使用するため、CosNはHadoop-COSを指すためにしばしば使用されます。

使用法

システム要件

Linuxカーネル2.6以上

依存関係

  • 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-jdk15on (バージョン1.59を推奨)

プロパティの設定

URIおよびリージョンプロパティ

COSをHadoopまたはその他のビッグデータシステムのデフォルトファイルシステムとして使用する場合は、core-site.xmlでfs.defaultFSをHadoop-COSのURIとして設定する必要があります。Hadoop-COSはURIスキームとしてcosnを使用し、バケットをURIホストとして使用します。同時に、バケットが配置されているリージョンを示すために、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を正確に構築する必要があるためです。

  • COSはマルチリージョンストレージをサポートしており、デフォルトではリージョンごとに異なるアクセスドメインがあります。オブジェクトのアップロードとダウンロードの速度を向上させるために、自分のビジネスシナリオに応じて最も近いストレージリージョンを選択することをお勧めします。利用可能なリージョンは、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>

ユーザー認証プロパティ

COSに格納されたオブジェクトにアクセスするには、各ユーザーが資格情報(ユーザーのsecreteIdと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>

統合プロパティ

HadoopがCOSを基盤となるファイルシステムとして正しく統合するには、AおよびBオプションを明示的に指定する必要があります。

HadoopがCOSを基盤となるファイルシステムとして統合できるようにするには、fs.cosn.implfs.AbstractFileSystem.cosn.implを正しく設定する必要があります。fs.cosn.implorg.apache.hadoop.fs.cos.CosFileSystemとして設定する必要があり、fs.AbstractFileSystem.cosn.implorg.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>

その他のランタイムプロパティ

Hadoop-COSは設定するための豊富なランタイムプロパティを提供しており、ほとんどの場合、適切に動作するデフォルト値が提供されているため、カスタム値を指定する必要はありません。

注意すべき重要な点は次のとおりです。:

  • Hadoop-COSはいくつかの一時ファイルを生成し、ディスクスペースを消費します。すべての一時ファイルは、オプションfs.cosn.tmp.dir(デフォルト: /tmp/hadoop_cos)で指定されたディレクトリに配置されます。

  • デフォルトのブロックサイズは8MBであり、COS blobストレージシステムに最大78GBの単一ファイルをアップロードできることを意味します。これは主に、マルチパートアップロードが最大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>

プロパティの概要
プロパティ 説明 デフォルト値 必須
fs.defaultFS Hadoopが使用するデフォルトのファイルシステムを設定します。 なし いいえ
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からシークレットIDとシークレットキーを取得します。
2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider: COSN_SECRET_IDおよびCOSN_SECRET_KEYという名前のシステム環境変数からシークレットIDとシークレットキーを取得します。

指定されていない場合、資格情報プロバイダーのデフォルトの順序は次のとおりです。
1. org.apache.hadoop.fs.auth.SimpleCredentialsProvider;
2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider.
なし いいえ
fs.cosn.userinfo.secretId/secretKey アカウントのAPIキー情報 なし はい
fs.cosn.bucket.region バケットが配置されているリージョン。 なし はい
必須 fs.cosn.impl なし はい
CosNファイルシステムの実装クラス。 必須 なし はい
fs.AbstractFileSystem.cosn.impl CosN AbstractFileSystemの実装クラス。 必須 いいえ
fs.cosn.tmp.dir cosnによって生成された一時ファイルは、プログラムの実行中にここに保存されます。 33554432 いいえ
/tmp/hadoop_cos fs.cosn.buffer.size 8388608 いいえ
バッファプールの合計サイズ。ブロックサイズ以上である必要があります。 fs.cosn.block.size ファイルブロックのサイズ。各ファイルを最大10,000個に分割してアップロードできるという制限を考慮して、使用する単一ファイルの最大サイズに応じてオプションを設定する必要があります。たとえば、8MBのパートサイズでは、78GBの単一ファイルを書き込むことができます。 いいえ
8388608(8MB) fs.cosn.upload_thread_pool ファイルがCOSにストリーミングされるときに、並行アップロードに使用されるスレッド数。 いいえ
CPUコア数 * 3 fs.cosn.read.ahead.block.size 10 いいえ
各先読みブロックのサイズ。 アプリケーションに失敗をスローする前に、COSへのファイルの読み取りまたは書き込みを再試行する最大回数。 3 いいえ
fs.cosn.retry.interval.seconds 各再試行の間隔(秒単位)。 3 いいえ

コマンドの使用法

コマンド形式: hadoop fs -ls -R cosn://bucket-appid/<path> または hadoop fs -ls -R /<path>。後者の場合、defaultFs オプションを cosn に設定する必要があります。

CosNを基盤ファイルシステムとして使用して、WordCountルーチンを実行します。

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-x.x.x.jar wordcount cosn://example/mr/input.txt cosn://example/mr/output

HadoopのデフォルトファイルシステムとしてCosNを設定する場合は、次のように実行できます。

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-x.x.x.jar wordcount /mr/input.txt /mr/output

hadoop-cosモジュールのテスト

CosNファイルシステムをテストするには、テストランナーに認証情報を渡す次の2つのファイルが必要です。

  1. auth-keys.xml
  2. core-site.xml

これら2つのファイルは、hadoop-cloud-storage-project/hadoop-cos/src/test/resourceディレクトリの下に作成する必要があります。

auth-key.xml

COSの認証情報は、auth-key.xmlで指定できます。同時に、これはCosNファイルシステムのテストのトリガーでもあります。COSバケット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

コントラクトテストのサポートに関連するすべての構成は、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が定義されていない場合、すべてのコントラクトテストはスキップされます。

その他の問題

パフォーマンスの低下

COSのIOパフォーマンスは、Tencent CVM上で実行されている仮想クラスターであっても、原則としてHDFSよりも低くなります。

主な理由は、以下の点に起因すると考えられます。

  • HDFSは、クエリを高速化するためにデータを複製します。

  • HDFSは、ディレクトリの内容のリスト表示、パスでのgetFileStatus()の呼び出し、ディレクトリの作成または削除など、多くの「メタデータ」操作において大幅に高速です。

  • HDFSはローカルハードディスクにデータを保存するため、コードがそのホスト上で実行できる場合はネットワークトラフィックを回避できます。しかし、COSに保存されているオブジェクトへのアクセスは、ほとんど毎回ネットワークへのアクセスが必要です。これは、IOパフォーマンスを損なう重要な点です。Hadoop-COSも、プリリードキュー、アップロードバッファプール、同時アップロードスレッドプールなど、多くの最適化作業を行っています。

  • 多数のシーク呼び出し/位置指定された読み取り呼び出しを実行するファイルIOも、HTTPリクエストのサイズが原因でパフォーマンスの問題が発生します。プリリードキャッシュの最適化にもかかわらず、多数のランダム読み取りは依然として頻繁なネットワークリクエストを引き起こす可能性があります。

  • HDFSでは、ディレクトリまたはファイルのrenamemvの両方がアトミックでO(1)レベルの操作ですが、COSでは、操作はcopydeleteを順番に組み合わせる必要があります。したがって、COSオブジェクトでリネームおよび移動操作を実行することは、パフォーマンスが低いだけでなく、データの整合性を保証することも困難です。

現在、Hadoop-COSを介してCOS BLOBストレージシステムを使用すると、HDFSと比較して約20%〜25%のパフォーマンス損失が発生します。ただし、COSの使用コストは、ストレージコストとメンテナンスコストの両方を含めて、HDFSよりも低くなります。