Spark中的textFileStream

时间:2016-02-23 09:23:26

标签: java apache-spark spark-streaming

我有以下代码:

SparkConf sparkConf = new SparkConf().setAppName("My app")
        .setMaster("local[4]")
        .set("spark.executor.memory", "2g")
        .set("spark.driver.allowMultipleContexts", "true");

JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));

JavaDStream<String> trainingData = jssc.textFileStream("filesDirectory");

trainingData.print();

jssc.start();
jssc.awaitTermination();

不幸的是,要流式传输目录中的任何文件,我必须编辑此文件,并在启动流上下文后重命名,否则将无法处理。

我应该编辑和重命名每个文件来处理它,还是有另一种处理现有文件的方法,只需编辑并保存它们。

P.S。当我将新文件移动到此目录时,我还需要编辑并重命名此文件以将其流式传输!!!

2 个答案:

答案 0 :(得分:4)

在移动到目标目录之前尝试触摸文件。 以下是javadoc所说的内容。

  • 确定给定的path是否为currentTime批次的新文件。因为它是
  • 接受,必须通过以下标准。
    • 必须通过用户提供的文件过滤器。
    • 它必须比忽略阈值更新。假设文件早于忽略
  • 阈值已被考虑或在开始之前是现有文件
  • (当newFileOnly = true时)。
    • 它不能出现在此类记得的最近选定的文件中。
    • 它不得比批次的时间更新(即
    • currentTime
  • 文件正在测试中。如果驱动程序已恢复,并且缺少批次
  • ,则会发生这种情况 正在生成
  • (停机期间)。在那种情况下,可以生成一批时间T
  • 在时间T + x。假设x = 5.如果该批次T包含mod时间T + 5的文件,那么坏事可以
  • 发生。让我们说所选文件会被记住60秒。在时间t + 61,
  • 忘记了一批时间t,忽略阈值仍为T + 1。
  • 修改时间为T + 5的文件不会被记住,不能忽略(因为,t + 5&gt; t + 1)。
  • 因此,他们可以再次被选为新文件。为防止这种情况,mod时间更长的文件
  • 不考虑当前的批次时间。 *

答案 1 :(得分:1)

JavaStreamingContext.textFileStream返回FileInputDStream,用于在定期添加/更新文件夹中的文件时监控文件夹。您将在每两秒钟后收到通知,仅在添加/更新新文件时才会收到通知。

如果意图只是阅读文件,则可以使用SparkContext.textFile

查看JavaStreamingContext.textFileStream()

源代码中的文档
/**
   * Create a input stream that monitors a Hadoop-compatible filesystem
   * for new files and reads them as text files (using key as LongWritable, value
   * as Text and input format as TextInputFormat). Files must be written to the
   * monitored directory by "moving" them from another location within the same
   * file system. File names starting with . are ignored.
   */