FileScanRDD.scala中的竞争条件

时间:2016-11-29 22:47:42

标签: apache-spark apache-spark-sql

我正在尝试从单个CSV文件创建一个DataSet:      val ss:SparkSession = ....

LD_LIBRARY_PATH=/usr/java/jdk1.7/jre/lib/amd64/server

df.count()返回CSV文件中行数的2倍。

FileScanRDD.compute中似乎存在问题。 我正在使用带有scala 2.11的spark版本2.0.1。我不会在这里包含FileScanRDD.scala的全部内容。

在FileScanRDD.compute中有以下内容:

 val ddr = ss.read.option("path", path)
 var df = ddr.option("sep", ",")
          .option("quote", "\"")
          .option("escape", "\"") // want to retain backslashes (\) ...
          .option("delimiter", ",")
          .option("comment", "#")
          .option("header", "true")
          .option("format", "csv")
           ddr.csv(path)

如果我在FileScanRDD.compute或FIleScanRDD.nextIterator中放置断点,则生成的数据集具有正确的行数。

此外,FileScanRDD.scala中的代码是:

 private[this] val files = split.asInstanceOf[FilePartition].files.toIterator

如果我在files.hasNext行上设置断点一切都很好;但是,如果我在files.next()行上放置断点,代码将在我继续时失败,因为文件迭代器已变空。禁用断点最终会创建一个数据集,其中csv文件的每一行都是重复的。

因此,似乎多个线程正在使用文件迭代器或下划分值(RDDPartition)并且在我的系统2上工作时间结束处理相同的文件,结果DataSet每个输入有2个副本线。

解析XML文件时,此代码无效。

我无法找到有关此问题的任何问题。 我是否有办法阻止这种行为?

0 个答案:

没有答案