【问题标题】:How to get data from regularly appended log file in Apache Spark?如何从 Apache Spark 中定期附加的日志文件中获取数据?
【发布时间】:2015-04-16 23:55:01
【问题描述】:

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

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

【问题讨论】:

  • 您能提供您的代码吗?否则很难找出问题的根源。
  • 嗨@MikelUrkia 我在这里添加了我的代码。请给出一些分析日志文件的指导。
  • Spark 将处理您的新文件,但无法看到您已更新已处理的文件之一。 Spark 处理文件一次,仅此而已。如果要再次处理,可以更改文件的名称。
  • 有没有办法处理像日志文件这样的连续附加文件?

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


【解决方案1】:

如果文件被实时修改,您可以使用来自 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 sink 将收集到的日志重定向到 Spark 流,并应用 Spark 分析来自 Flume 流的数据 (http://spark.apache.org/docs/latest/streaming-flume-integration.html)

有关 Flume 设置的更多详细信息请参阅这篇文章:real time log processing using apache spark streaming

【讨论】:

  • 谢谢@VictorBashurov。
  • 我如何将这些行发送到流媒体模块?
  • 例如流模块可以配置为从控制台输出获取数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2019-10-01
相关资源
最近更新 更多