我正在尝试使用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功能,但也无效。
答案 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();
}
}