会引发整个文本文件选择部分创建的文件吗?

时间:2017-06-14 17:18:31

标签: apache-spark apache-spark-sql spark-streaming sparkcore

我使用Spark wholeTextFiles API从源文件夹中读取文件并将其加载到hive表。

文件从远程服务器到达源文件夹。文件大小如1GB-3GB。文件的SCP花了很长时间。

如果我启动spark作业并且文件被SCPd保存到源文件夹并且进程中途,那么会选择文件吗?

如果文件处于中途时选择文件,则会出现问题,因为它会忽略文件的其他内容。

2 个答案:

答案 0 :(得分:1)

如果您正在将文件保存到源文件夹中;然后火花从那个文件夹中读取;可能会发生这样的情况,因为SCP可能需要一些时间才能复制,所以半文写入的文件会被火花挑选。

这肯定会发生。

您的任务是 - 如何不直接在该源文件夹中书写 - 以便Spark不会选择不完整的文件。

可能的解决方法:

  1. 在每个文件副本结束时,SCP ZERO-kb文件表明SCP已完成。
  2. 在火花作业中,当您执行sc.wholeTextFiles(...)时,只选择那些具有零kb对应文件的文件名 - 使用地图。

答案 1 :(得分:1)

可能的解决方法:

  1. 在每个文件副本结束时,SCP ZERO-kb文件表明SCP已完成。
  2. 在spark job中,当你执行sc.wholeTextFiles(...)时,只选择那些具有零kb对应文件的文件名 - 使用map。
  3. 所以,这是检查src文件夹中是否存在Corresponidng .ctl文件的代码。

    val fr = sc.wholeTextFiles("D:\\DATA\\TEST\\tempstatus")
    
    // Get only .ctl file
    val temp1 = fr.map(x => x._1).filter(x => x.endsWith(".ctl"))
    
    // Identify corresponding REAL-FILEs - without .ctl suffix
    val temp2 = temp1.map(x => (x.replace(".ctl", ""),x.replace(".ctl", "")))
    
    val result = fr
      .join(xx)
      .map{
        case (_, (entry, x)) => (x, entry)
      }
    

    ...根据需要处理rdd result

    rdd temp2已从RDD[String]更改为RDD[String, String] - 用于JOIN操作。没关系。