Spark FileStreaming问题

时间:2015-11-14 01:55:39

标签: apache-spark spark-streaming

我正在尝试使用Sparkstreaming的简单文件流示例(spark-streaming_2.10,版本:1.5.1)

public class DStreamExample {

    public static void main(final String[] args) {

        final SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("SparkJob");
        sparkConf.setMaster("local[4]"); // for local

        final JavaSparkContext sc = new JavaSparkContext(sparkConf);

        final JavaStreamingContext ssc = new JavaStreamingContext(sc,
            new Duration(2000));

        final JavaDStream<String> lines = ssc.textFileStream("/opt/test/");
        lines.print();

        ssc.start();
        ssc.awaitTermination();
    }
}

当我在单个文件或导演上运行此代码时,它不会从文件中打印任何内容,我在日志中看到它不断轮询,但没有打印任何内容。我尝试在程序运行时将文件移动到目录。

我有什么遗失的吗?我尝试在行RDD上应用map功能,但也无效。

1 个答案:

答案 0 :(得分:1)

API textFileStream 不应该读取现有目录内容,相反,它的目的是监视给定的Hadoop兼容文件系统路径以进行更改,文件必须写入受监视的位置通过&#34;移动&#34;它们来自同一文件系统中的其他位置。   简而言之,您正在订阅目录更改,并将在受监控位置内接收新出现文件的内容 - 在监视快照时出现文件的状态(即在你的情况下2000毫秒的持续时间),任何进一步的文件更新将不会到达流,只有目录更新(新文件)将。

您可以模拟更新的方法是在监控会话期间创建新文件:

import org.apache.commons.io.FileUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class DStreamExample {

public static void main(final String[] args) throws IOException {

    final SparkConf sparkConf = new SparkConf();
    sparkConf.setAppName("SparkJob");
    sparkConf.setMaster("local[4]"); // for local

    final JavaSparkContext sc = new JavaSparkContext(sparkConf);

    final JavaStreamingContext ssc = new JavaStreamingContext(sc,
            new Duration(2000));

    final JavaDStream<String> lines = ssc.textFileStream("/opt/test/");

    // spawn the thread which will create new file within the monitored directory soon
    Runnable r = () -> {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            FileUtils.write(new File("/opt/test/newfile1"), "whatever");
        } catch (IOException e) {
            e.printStackTrace();
        }
    };

    new Thread(r).start();


    lines.foreachRDD((Function<JavaRDD<String>, Void>) rdd -> {
        List<String> lines1 = rdd.collect();
        lines1.stream().forEach(l -> System.out.println(l));
        return null;
    });

    ssc.start();
    ssc.awaitTermination();
}

}