元数据加速能力简介
元数据加速功能采用了云 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
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/6224clientConfig.setRegion(new Region("COS_REGION"));// 设置请求协议, http 或者 https// 5.6.53 及更低的版本,建议设置使用 https 协议// 5.6.54 及更高版本,默认使用了 httpsclientConfig.setHttpProtocol(HttpProtocol.https);// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30sclientConfig.setSocketTimeout(30 * 1000);// 设置建立连接超时,默认 30sclientConfig.setConnectionTimeout(30 * 1000);// 如果需要的话,设置 http 代理,ip 以及 portclientConfig.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 | 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
参数说明
通过 DeleteObject 接口递归删除目录
请求示例
String bucketName = "examplebucket-1250000000";String key = "test";// 创建客户端COSClient cosClient = createCOSClient();DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucket, key);deleteObjectRequest.setRecursive(true); //递归删除目录cosClient.deleteObject(deleteObjectRequest);
参数说明
通过 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 | 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 在这里会返回 404boolean isDir = objectMetadata.isFileModeDir(); // isDir 为 true
参数说明
注意事项
以上代码示例若有处理异常,可参考 Java SDK 文档。
启用元数据加速能力的存储桶暂时不支持如下接口操作: