如何从Apache Spark中定期附加的日志文件中获取数据?

时间:2015-02-16 13:00:16

标签: apache-spark spark-streaming access-log log-analysis

我有一个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();

此代码不会返回现有文件中的任何数据。这仅在我创建新文件时有效,但是当我更新该新文件时,程序再次不会返回更新的数据。

1 个答案:

答案 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