Posts tagged Migrate
海量数据迁移
May 11th
#按照文件的行数拆分文件
split -l 5000 large_file.txt new_file_prefix
#批量重命名文件夹里的文件
find -name 'x*' -printf %f\\n|awk -F'.' '{print $1}'|xargs -i{} mv {} {}.txt
这次迁移Exif信息,数据有4亿的数据,为了不影响另外一个系统,采用单节点数据文件迁移(具体还有很多因素)。
首先是拆分数据文件为小文件,即使程序错误或者其它中断,也只影响少量数据,重新迁移的话,只有少量数据是空转。
当然使用小文件还有个原因是考虑到要记录没有处理的数据,所以这些文件数据是要读到内存中去的。
还有就是可以做到多进程多线程迁移数据,只有你的数据库足够强大,抗得住压力。
此过程中可以以文件为单位,采用多线程操作,可以提高速度。
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(15, 100, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.DiscardOldestPolicy());
这个线程池当处理不过来时,会丢弃任务,所以我是采用这样的方式解决这个问题的。
while (threadPool.getPoolSize() > 80) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
得到Java进程的PID
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
迁移的效率还是比较高,导致数据库扛不住了,必须在白天放慢迁移速度。