我有一个Apache访问日志文件,它有一些数据并且不断增加。我想使用Apache Spark Streaming API分析这些数据。
Spark对我来说是新的,我创建了一个程序,其中我使用jssc.textFileStream(directory)
函数来获取日志数据。但它根据我的要求不起作用。
请建议我使用spark分析该日志文件的一些方法。
这是我的代码。
SparkConf conf = new SparkConf()
.setMaster("spark://192.168.1.9:7077")
.setAppName("log streaming")
.setSparkHome("/usr/local/spark")
.setJars(new String[] { "target/sparkstreamingdemo-0.0.1.jar" });
StreamingContext ssc = new StreamingContext(conf, new Duration(5000));
DStream<String> filerdd = ssc.textFileStream("/home/user/logs");
filerdd.print();
ssc.start();
ssc.awaitTermination();
此代码不会返回现有文件中的任何数据。这仅在我创建新文件时有效,但是当我更新该新文件时,程序再次不会返回更新的数据。
答案 0 :(得分:3)
如果文件是实时修改的,您可以使用Apache Commons IO中的Tailer。 这是最简单的样本:
public void readLogs(File f, long delay) {
TailerListener listener = new MyTailerListener();
Tailer tailer = new Tailer(f, listener, delay);
// stupid executor impl. for demo purposes
Executor executor = new Executor() {
public void execute(Runnable command) {
command.run();
}
};
executor.execute(tailer);
}
public class MyTailerListener extends TailerListenerAdapter {
public void handle(String line) {
System.out.println(line);
}
}
上面的代码可以用作Apache Flume的日志阅读器并作为源应用。然后,您需要配置Flume接收器以将收集的日志重定向到Spark流并应用Spark来分析来自Flume流的数据(http://spark.apache.org/docs/latest/streaming-flume-integration.html)
此帖中有关Flume设置的更多详细信息:real time log processing using apache spark streaming