在 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. deleterename 作業都是非原子性的,這表示如果作業中斷,作業結果可能會處於不一致的狀態。

  4. 物件儲存具有不同的授權模式

  • 目錄權限報告為 777。

  • 檔案權限報告為 666。

  • 檔案擁有者報告為本機目前使用者。

  • 檔案群組也報告為本機目前使用者。

  1. 支援分段上傳大型檔案(最大 40TB),但分段數量限制為 10000。

  2. 每次列出的檔案數量限制為 1000。

快速入門

概念

  • 儲存桶:用於在 COS 中儲存資料的容器。其名稱由使用者定義的儲存桶名稱和使用者 appid 組成。

  • Appid:使用者維度唯一的資源識別碼。

  • SecretId:用於驗證使用者的 ID

  • SecretKey:用於驗證使用者的金鑰

  • 區域:儲存桶所在區域。

  • CosN:Hadoop-COS 使用 cosn 作為其 URI 架構,因此 CosN 通常用於指稱 Hadoop-COS。

用法

系統需求

Linux kernel 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 使用 cosn 作為其 URI 架構,並使用儲存桶作為其 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>

使用者驗證屬性

每個使用者都需要正確設定憑證(使用者的 secreteId 和 secretKey),才能存取儲存在 COS 中的物件。這些憑證可以從 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>

整合屬性

您需要明確指定選項 A 和 B,才能讓 Hadoop 正確地將 COS 整合為底層檔案系統

只有正確設定 fs.cosn.implfs.AbstractFileSystem.cosn.impl,才能讓 Hadoop 將 COS 整合為其底層檔案系統。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>

其他執行時期屬性

Hadoop-COS 提供豐富的執行時期屬性可供設定,而其中大部分屬性不需自訂值,因為已提供運作良好的預設值。

請務必注意:

  • Hadoop-COS 會產生一些暫存檔案,並耗用一些磁碟空間。所有暫存檔案都會放置在選項 fs.cosn.tmp.dir 指定的目錄中(預設:/tmp/hadoop_cos);

  • 預設區塊大小為 8MB,表示您只能上傳單一檔案,大小最高為 78GB,至 COS blob 儲存系統。這主要是因為多部分上傳最多只能支援 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.secretIdfs.cosn.userinfo.secretKey 取得秘密 ID 和秘密金鑰;
2. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialsProvider:從名為 COSN_SECRET_IDCOSN_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 產生的暫存檔案會儲存在此處。 /tmp/hadoop_cos
fs.cosn.buffer.size 緩衝區池的總大小。必須大於或等於區塊大小。 33554432
fs.cosn.block.size 檔案區塊大小。考量到每個檔案最多可分割為 10,000 個上傳,此選項必須根據所使用單一檔案的最大大小設定。例如,8MB 的區塊大小可寫入 78GB 的單一檔案。 8388608
fs.cosn.upload_thread_pool 當檔案串流傳輸到 COS 時,用於並行上傳的執行緒數目。 CPU 核心數目 * 3
fs.cosn.read.ahead.block.size 每個先讀取區塊的大小。 524288 (512KB)
fs.cosn.read.ahead.queue.size 先讀取佇列的長度。 10
fs.cosn.maxRetries 在傳送失敗給應用程式之前,讀取或寫入檔案到 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

如果將 CosN 設定為 Hadoop 的預設檔案系統,您可以如下執行

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

測試 hadoop-cos 模組

若要測試 CosN 檔案系統,需要以下兩個傳遞驗證詳細資料至測試執行器的檔案。

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

這兩個檔案需要建立在 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 效能低於 HDFS,即使在 Tencent CVM 上執行的虛擬叢集也是如此。

主要原因可以歸因於以下幾點

  • HDFS 會複製資料以加快查詢速度。

  • HDFS 在許多「元資料」操作方面顯著更快:列出目錄內容、在路徑上呼叫 getFileStatus()、建立或刪除目錄。

  • HDFS 將資料儲存在本機硬碟上,如果程式碼可以在該主機上執行,則可以避免網路流量。但存取 COS 中儲存的物件幾乎每次都需要存取網路。這是損害 IO 效能的關鍵點。Hadoop-COS 也為此做了許多最佳化工作,例如預讀佇列、上傳緩衝池、並行上傳執行緒池等。

  • 執行許多尋查呼叫/定位讀取呼叫的檔案 IO 也會因為所發出的 HTTP 要求大小而遇到效能問題。儘管有預讀快取最佳化,但大量的隨機讀取仍可能導致頻繁的網路要求。

  • 在 HDFS 上,目錄或檔案的 renamemv 都是原子且 O(1) 層級的操作,但在 COS 中,該操作需要依序結合 copydelete。因此,對 COS 物件執行重新命名和移動操作不僅效能低,而且難以保證資料一致性。

目前透過 Hadoop-COS 使用 COS blob 儲存系統,效能約有 20% ~ 25% 的損失,相較於 HDFS。但使用 COS 的成本低於 HDFS,包含儲存與維護成本。