Hadoop 中腾讯 COS 的集成

简介

腾讯 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%。

注意

对象存储不是文件系统,它有一些限制

  1. 对象存储是键值存储,它天然不支持分层目录。通常,使用对象键中的目录分隔符来模拟分层目录,例如“/hadoop/data/words.dat”。

  2. COS 对象存储目前不支持对象的追加操作。这意味着您不能将内容追加到现有对象(文件)的末尾。

  3. deleterename 操作都是非原子的,这意味着如果操作中断,操作结果可能会处于不一致状态。

  4. 对象存储具有不同的授权模型

  • 目录权限报告为 777。

  • 文件权限报告为 666。

  • 文件所有者报告为本地当前用户。

  • 文件组也报告为本地当前用户。

  1. 支持大文件(高达 40TB)的分块上传,但分块数限制为 10000。

  2. 每次列出的文件数限制为 1000。

快速入门

概念

  • 存储桶:用于在 COS 中存储数据的容器。其名称由用户定义的存储桶名称和用户 AppID 组成。

  • AppID:用于对用户维度进行唯一资源标识的 ID。

  • SecretId:用于对用户进行身份验证的 ID

  • SecretKey:用于对用户进行身份验证的密钥

  • 区域:存储桶所在的区域。

  • CosN:Hadoop-COS 使用 cosn 作为其 URI 方案,因此 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 使用 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.implfs.AbstractFileSystem.cosn.impl 才能使 Hadoop 将 COS 集成作为其底层文件系统。fs.cosn.impl 必须设置为 org.apache.hadoop.fs.cos.CosFileSystemfs.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.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,即使在腾讯 CVM 上运行的虚拟集群上也是如此。

主要原因可以归因于以下几点

  • HDFS 复制数据以实现更快的查询。

  • 对于许多“元数据”操作,HDFS 明显更快:列出目录的内容、在路径上调用 getFileStatus()、创建或删除目录。

  • HDFS 将数据存储在本地硬盘上,如果代码可以在该主机上执行,则可以避免网络流量。但访问存储在 COS 中的对象几乎每次都需要访问网络。这是损害 IO 性能的关键点。Hadoop-COS 也为此做了很多优化工作,比如预读队列、上传缓冲池、并发上传线程池等。

  • 执行许多 seek 调用/定位读取调用的文件 IO 也将遇到性能问题,这是由于发出的 HTTP 请求的大小。尽管有预读缓存优化,但大量的随机读取仍然会导致频繁的网络请求。

  • 在 HDFS 上,目录或文件的 renamemv 都是原子且 O(1) 级别的操作,但在 COS 中,该操作需要按顺序组合 copydelete。因此,对 COS 对象执行重命名和移动操作不仅性能低,而且难以保证数据一致性。

目前,与 HDFS 相比,通过 Hadoop-COS 使用 COS Blob 存储系统会损失约 20% ~ 25% 的性能。但是,使用 COS 的成本低于 HDFS,其中包括存储和维护成本。