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%。
注意事項
物件儲存不是檔案系統,它有一些限制
物件儲存是一種鍵值儲存,它自然不支援階層目錄。通常使用物件金鑰中的目錄分隔符號模擬階層目錄,例如「/hadoop/data/words.dat」。
COS 物件儲存目前無法支援物件的追加作業。這表示您無法將內容追加到現有物件(檔案)的結尾。
delete
和rename
作業都是非原子性的,這表示如果作業中斷,作業結果可能會處於不一致的狀態。物件儲存具有不同的授權模式
目錄權限報告為 777。
檔案權限報告為 666。
檔案擁有者報告為本機目前使用者。
檔案群組也報告為本機目前使用者。
支援分段上傳大型檔案(最大 40TB),但分段數量限制為 10000。
每次列出的檔案數量限制為 1000。
儲存桶:用於在 COS 中儲存資料的容器。其名稱由使用者定義的儲存桶名稱和使用者 appid 組成。
Appid:使用者維度唯一的資源識別碼。
SecretId:用於驗證使用者的 ID
SecretKey:用於驗證使用者的金鑰
區域:儲存桶所在區域。
CosN:Hadoop-COS 使用 cosn
作為其 URI 架構,因此 CosN 通常用於指稱 Hadoop-COS。
Linux kernel 2.6+
如果您計畫將 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.impl
和 fs.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.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 產生的暫存檔案會儲存在此處。 | /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
若要測試 CosN 檔案系統,需要以下兩個傳遞驗證詳細資料至測試執行器的檔案。
這兩個檔案需要建立在 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 上,目錄或檔案的 rename
和 mv
都是原子且 O(1) 層級的操作,但在 COS 中,該操作需要依序結合 copy
和 delete
。因此,對 COS 物件執行重新命名和移動操作不僅效能低,而且難以保證資料一致性。
目前透過 Hadoop-COS 使用 COS blob 儲存系統,效能約有 20% ~ 25% 的損失,相較於 HDFS。但使用 COS 的成本低於 HDFS,包含儲存與維護成本。