利用腾讯COS清单功能迁移最近三个月的数据至华为云
背景
客户大数据场景,经业务调研,将每日的数据以日期前缀的方式命名并存在对象存储中,因业务需求只需要迁移最近3个月的数据即可 之前的数据可丢弃。同时客户文件夹管理混乱无规则,发现客户文件层级达到7级,且每一级都有几百+的文件夹,导致路径+前缀困难较大,且数据丢失风险较高。
解决办法
梳理文件目录前缀的方式无发实现迁移,整体迁移又浪费时间和成本,且带宽有限。目前oms只有4种迁移方式
- 选择文件/文件夹
- 指定对象列表
- 输入对象前缀 (a:根目录下直接添加 b:非根目录,添加对象文件所在的目录路径)
- 指定URL列表
因客户文件夹路径较多,梳理困难。4种方式中只能选择指定URL列表的方式迁移。URL梳理方式如下:
- 虚机安装cos插件COSCMD工具,然后利用-l 参数输出每一层级的路径,递归。该过程可以使用脚本实现。 COSCOM工具使用见:https://cloud.tencent.com/document/product/436/10976
- 利用cos清单功能导出最近三个月修改的数据,然后利用脚本对导出的CSV进行全路径拼接,然后写入到txt文件。RDA迁移时选择指定URL方式将txt导入完成迁移。(本文针对该方法进行步骤描述)
操作步骤
步骤1:
登陆腾讯云控制台 --> 选择存储桶列表 --> 点击要迁移的桶
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMfdh5i1-1665836751402)(media/16642494579149/16642445305772.jpg)]
步骤2:
点击基础配置 --> 选择清单设置 --> 添加清单 --> 导出清单
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhGq7syk-1665836751403)(media/16642494579149/16642449097258.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDD5Zf3N-1665836751404)(media/16642494579149/16642449662783.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVub7WJT-1665836751404)(media/16642494579149/16642450233899.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ds8mtixn-1665836751405)(media/16642494579149/16642450698102.jpg)]
下载清单 (data路径存放修改信息的csv, 20220927为数据汇总信息)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jhM4mls-1665836751406)(media/16642494579149/16642452398302.jpg)]
清单功能详细见:https://cloud.tencent.com/document/product/436/33703
步骤3:
下载清单,提取csv的路径写入到txt。然后将txt上传至迁移的桶,迁移方式选择列表迁移并选择上传的列表(OMS/RDA迁移比较简单本文不做详细描述 详见:)
注:
- txt的大小不能超过1g,超1g需要分批次写入
- url全路从桶根路径下开始(不带桶名 否则迁移失败)
CSV处理代码如下(python更优,java比较笨重,但笔者不太熟悉):
import com.csvreader.CsvReader;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
public class getObjectList {
public static final String SOURCE_FILE_PATH = "/Users/zjw/Desktop/cosCSV0927.csv";
public static final String TARGET_FILE_PATH = "/Users/zjw/Desktop/test.txt";
// 桶路径写入函数
public static void writeCosTxt(String txtPath,String content){
FileOutputStream fileOutputStream = null;
File file = new File(txtPath);
try {
if(file.exists()){
file.createNewFile();
}
fileOutputStream = new FileOutputStream(file, true);
fileOutputStream.write(content.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//读取cvs
public static void readCosCSV(Character separator, String filePath) {
CsvReader reader = null;
try {
reader = new CsvReader(filePath, separator, Charset.forName("GBK"));
reader.readHeaders();
int i = 0;
while (reader.readRecord()) {
// 对象大小为0忽略,该记录是桶路径。
if (reader.get(3).toString().equals("0")) {
continue;
}
//关键列: 第0列:uuid, 第1列 桶名, 第2列 对象url全路径, 第3列:对象大小,第4列:修改时间, 第6列:对象类型
System.out.println(reader.get(2));
writeCosTxt(TARGET_FILE_PATH,reader.get(2) + "\n");
i ++;
System.out.println("完成" + i + "行写入");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != reader) {
reader.close();
}
}
}
public static void main(String[] args) {
//执行读取cvs函数
readCosCSV(',', SOURCE_FILE_PATH);
}
}
maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>QCloudCosImmigrate</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 腾讯SDK maven地址 -->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.89</version>
</dependency>
<!-- CSV表格处理-->
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dN7497vh-1665836751406)(media/16642494579149/16642473554055.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55Q0E9XS-1665836751407)(media/16642494579149/16642473763001.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-asYqX8pC-1665836751407)(media/16642494579149/16642485861365.jpg)]
迁移完成