我有一个火花作业,我有一个巨大的文件输出300 gb到S3。 我的要求是重命名所有零件文件,然后我们必须移动到最终文件夹。
我做过研究但是找不到解决方案,在火花作业本身我可以重命名我的火花输出文件。
所以我提出了一个计划,从S3读取火花输出文件,然后重新重命名,然后再次在S3文件夹中回写。
但问题是我的火花作业需要25分钟才能完成,但是如果时间在S3中再次阅读,重命名和复制需要45分钟。
这对我来说太令人沮丧了。
无论如何我可以让这个过程更快吗? 问题是在火花作业之后,这个过程只在核心节点上运行,因此需要很长时间。
这就是我的工作。
val file = fs.globStatus(new Path(outputFileURL + "/*/*/*"))
for (urlStatus <- file) {
val DataPartitionName = urlStatus.getPath.toString.split("=")(1).split("\\/")(0).toString
val StatementTypeCode = urlStatus.getPath.toString.split("=")(2).split("\\/")(0).toString
val finalFileName = finalPrefix + DataPartitionName + "." + StatementTypeCode+ "." + fileVersion + currentTime + fileExtention
val dest = new Path(mainFileURL + "/" + finalFileName)
fs.rename(urlStatus.getPath, dest)
}
println("File renamed and moved to dir now delete output folder")
myUtil.Utility.DeleteOuptuFolder(fs, outputFileURL)
有没有办法利用以下两个选项
S3 DIST CP命令? 据我所研究,我没有发现在S3 dist CP中重命名文件。 我正在基于文件路径重命名。
我可以使用shell命令活动来读取重命名和复制吗?
答案 0 :(得分:1)
问题是S3重命名实际上是作为复制和删除实现的,所以如果你有很多大文件需要更长的时间。
我建议用spark写入HDFS,然后在HDFS本地进行文件名操作,你实际上有原子重命名语义,然后使用S3DistCp将现在正确命名的文件复制到目标位置,然后删除如果你需要空间,HDFS上的文件。