腾讯 COS 是腾讯公司提供的著名对象存储系统。Hadoop-COS 是一款客户端,它使基于 HDFS 的上层计算系统能够将 COS 用作其底层存储系统。已确定支持的大数据处理系统包括:Hadoop MR、Spark、Alluxio 等。此外,Druid 还可以通过配置与 HADOOP-COS 集成的 HDFS 加载插件,将 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:用于对用户维度进行唯一资源标识的 ID。
SecretId:用于对用户进行身份验证的 ID
SecretKey:用于对用户进行身份验证的密钥
区域:存储桶所在的区域。
CosN:Hadoop-COS 使用 cosn
作为其 URI 方案,因此 CosN 通常用于指代 Hadoop-COS。
Linux 内核 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>
每个用户都需要正确配置凭证(用户的 SecretId 和 SecretKey)才能访问存储在 COS 中的对象。这些凭证可以从腾讯云提供的官方控制台获取。
<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,这意味着您只能将单个文件上传到 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 生成的临时文件将存储在此处。 | /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,即使在腾讯 CVM 上运行的虚拟集群上也是如此。
主要原因可以归因于以下几点
HDFS 复制数据以实现更快的查询。
对于许多“元数据”操作,HDFS 明显更快:列出目录的内容、在路径上调用 getFileStatus()、创建或删除目录。
HDFS 将数据存储在本地硬盘上,如果代码可以在该主机上执行,则可以避免网络流量。但访问存储在 COS 中的对象几乎每次都需要访问网络。这是损害 IO 性能的关键点。Hadoop-COS 也为此做了很多优化工作,比如预读队列、上传缓冲池、并发上传线程池等。
执行许多 seek 调用/定位读取调用的文件 IO 也将遇到性能问题,这是由于发出的 HTTP 请求的大小。尽管有预读缓存优化,但大量的随机读取仍然会导致频繁的网络请求。
在 HDFS 上,目录或文件的 rename
和 mv
都是原子且 O(1) 级别的操作,但在 COS 中,该操作需要按顺序组合 copy
和 delete
。因此,对 COS 对象执行重命名和移动操作不仅性能低,而且难以保证数据一致性。
目前,与 HDFS 相比,通过 Hadoop-COS 使用 COS Blob 存储系统会损失约 20% ~ 25% 的性能。但是,使用 COS 的成本低于 HDFS,其中包括存储和维护成本。