有奖捉虫:云通信与企业服务文档专题,速来> HOT

元数据加速能力简介

元数据加速功能采用了云 HDFS 卓越的元数据管理功能,支持用户通过 HDFS 语义访问对象存储(Cloud Object Storage,COS)服务。在存储桶开启元数据加速器后,可以采用原生的 HDFS 接口直接访问对象存储服务。除了省去了 HDFS 协议到对象协议的转换开销外,更能提供原生 HDFS 的一些功能,如目录原子高效 Rename、文件 Atime、Mtime 更新、高效目录 DU 统计、Posix ACL 权限支持等原生特性。有关元数据加速的更多介绍,请参见 元数据加速 文档。
启用元数据加速后,存储桶/文件操作的 Java API(COS Java SDK 版本须 5.6.80 及以上)使用方式与普通存储桶的操作基本一致,具体调用可参考 COS Java SDK。本文重点介绍在启用元数据加速能力后的一些新增操作特性:
判断存储桶是否开启元数据加速能力。
通过HeadObject接口判断是否为目录。
通过DeleteObject接口递归删除目录。
通过Rename接口快速重命名文件。
通过PutObject上传文件到启用元数据加速能力的存储桶。

创建 COSClient

调用 COS 的接口之前,必须先创建一个 COSClient 的实例。本文以 SECRETID 和 SECRETKEY 为例, 如需使用临时密钥创建 COSClient,请参考 临时密钥生成
COSClient createCOSClient() {
// 设置用户身份信息。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
// 1 传入获取到的密钥 (secretId, secretKey, sessionToken)
String secretId = "SECRETID";
String secretKey = "SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// ClientConfig 中包含了后续请求 COS 的客户端设置:
ClientConfig clientConfig = new ClientConfig();

// 设置 bucket 的地域
// COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
clientConfig.setRegion(new Region("COS_REGION"));

// 设置请求协议, http 或者 https
// 5.6.53 及更低的版本,建议设置使用 https 协议
// 5.6.54 及更高版本,默认使用了 https
clientConfig.setHttpProtocol(HttpProtocol.https);

// 以下的设置,是可选的:

// 设置 socket 读取超时,默认 30s
clientConfig.setSocketTimeout(30 * 1000);
// 设置建立连接超时,默认 30s
clientConfig.setConnectionTimeout(30 * 1000);

// 如果需要的话,设置 http 代理,ip 以及 port
clientConfig.setHttpProxyIp("httpProxyIp");
clientConfig.setHttpProxyPort(80);

// 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}

判断存储桶是否开启元数据加速能力

请求示例

String bucketName = "examplebucket-1250000000";
// 创建客户端
COSClient cosClient = createCOSClient();
HeadBucketRequest headBucketRequest = new HeadBucketRequest(bucketName);
HeadBucketResult headBucketResult = cosClient.headBucket(headBucketRequest);
bool isMetaAccBucket = headBucketResult.isMetaAccBucket(); // 如果已经开启元数据加速能力,isMetaAccBucket 为 true

参数说明

参数名称
描述
类型
bucketName
Bucket 的命名规则为 BucketName-APPID,详情请参见 存储桶概述
String

通过 HeadObject 接口判断是否目录

需要先通过查询指定对象的元数据信息(HEAD Object),然后使用如下示例中的方法区分。

请求示例

String bucketName = "examplebucket-1250000000";
String key = "test";
// 创建客户端
COSClient cosClient = createCOSClient();
GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest(bucketName, key);
ObjectMetadata objectMetadata = cosClient.getObjectMetadata(getObjectMetadataRequest);
boolean isDir = objectMetadata.isFileModeDir(); // 如果是目录,isDir 为 true

参数说明

参数名称
描述
类型
bucketName
Bucket 的命名规则为 BucketName-APPID,详情请参见 存储桶概述
String
key
对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg中,对象键为 doc/picture.jpg,详情请参见 对象键
String

通过 DeleteObject 接口递归删除目录

请求示例

String bucketName = "examplebucket-1250000000";
String key = "test";
// 创建客户端
COSClient cosClient = createCOSClient();
DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucket, key);
deleteObjectRequest.setRecursive(true); //递归删除目录
cosClient.deleteObject(deleteObjectRequest);

参数说明

参数名称
描述
类型
bucketName
Bucket 的命名规则为 BucketName-APPID,详情请参见 存储桶概述
String
key
对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg中,对象键为 doc/picture.jpg,详情请参见 对象键
String

通过 Rename 接口快速重命名文件

在启用元数据加速能力的存储桶后,可以对目录重命名,且该接口是针对该类型的存储桶新增的(普通桶不支持此接口)。

请求示例

String bucketName = "examplebucket-1250000000";
String srcKey = "/test/src";
String dstKey = "test/dst"
// 创建客户端
COSClient cosClient = createCOSClient();
RenameRequest renameRequest = new RenameRequest(bucketName, srcKey, dstKey);
cosClient.rename(renameRequest);

参数说明

参数名称
描述
类型
bucketName
Bucket 的命名规则为 BucketName-APPID,详情请参见 存储桶概述
String
srcKey
对象键原始值,须以/开头。
String
dstKey
对象键新值。
String

通过 PutObject 上传文件到启用元数据加速能力的存储桶

启用元数据加速能力的存储桶在上传文件时有如下重要差异:
通过PutObject上传文件到启用元数据加速能力的存储桶时,如果有中间路径,会递归创建中间子目录。
通过PutObject上传文件到普通存储桶时,即使有中间路径,仍然会被看成一个 key,导致 ListObjects 对其做了特殊处理,在控制台上呈现出目录形式。因此,在 Hadoop-Cos 中会使用 HeadObject 和 ListObjects 接口判断中间目录是否存在。

请求示例

// putObject 有中间路径
String bucketName = "examplebucket-1250000000";
// 对象键(Key)是对象在存储桶中的唯一标识。
String key = "/testdemo/test/README.md";

COSClient cosClient = createCOSClient();

// 本地文件
String localFilePath = "README.md";
File localFile = new File(localFilePath);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
PutObjectResult putObjectResult = cosClient.putObject(bucketName, key, file);

// 区分中间路径是文件还是目录
// 中间路径
dirKey = "/testdemo/test";
GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest(bucketName, dirKey);
ObjectMetadata objectMetadata = cosClient.getObjectMetadata(getObjectMetadataRequest); // 普通 bucket 在这里会返回 404
boolean isDir = objectMetadata.isFileModeDir(); // isDir 为 true

参数说明

Put Object 参数说明可参考 Java 上传对象

注意事项

以上代码示例若有处理异常,可参考 Java SDK 文档
启用元数据加速能力的存储桶暂时不支持如下接口操作: