在AWS中重命名和移动Spark输出文件的时间非常长

时间:2018-04-11 06:51:59

标签: apache-spark amazon-s3 amazon-emr s3distcp

我有一个火花作业,我有一个巨大的文件输出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)

有没有办法利用以下两个选项

  1. S3 DIST CP命令? 据我所研究,我没有发现在S3 dist CP中重命名文件。 我正在基于文件路径重命名。

  2. 我可以使用shell命令活动来读取重命名和复制吗?

1 个答案:

答案 0 :(得分:1)

问题是S3重命名实际上是作为复制和删除实现的,所以如果你有很多大文件需要更长的时间。

我建议用spark写入HDFS,然后在HDFS本地进行文件名操作,你实际上有原子重命名语义,然后使用S3DistCp将现在正确命名的文件复制到目标位置,然后删除如果你需要空间,HDFS上的文件。