Java 使用spark分析日志文件?

Java 使用spark分析日志文件?,java,apache-spark,Java,Apache Spark,我编写了分析日志的程序,目的是过滤/打印日志中的错误语句 String master = "local[*]"; String inputFilePath = "C:/test.log"; SparkConf conf = new SparkConf().setAppName(App.class.getName()) .setMaster(master); JavaSparkContext context = new JavaSpark

我编写了分析日志的程序,目的是过滤/打印日志中的错误语句

    String master = "local[*]";

    String inputFilePath = "C:/test.log";

    SparkConf conf = new SparkConf().setAppName(App.class.getName())
            .setMaster(master);
    JavaSparkContext context = new JavaSparkContext(conf);

    JavaRDD<String> stringRDD = context.textFile(inputFilePath);

    stringRDD.filter(text -> text.contains("ERROR"))
            .collect().forEach(result -> System.out.println(result));
String master=“local[*]”;
字符串inputFilePath=“C:/test.log”;
SparkConf conf=new SparkConf().setAppName(App.class.getName())
.setMaster(master);
JavaSparkContext上下文=新的JavaSparkContext(conf);
JavaRDD stringRDD=context.textFile(inputFilePath);
stringRDD.filter(text->text.contains(“错误”))
.collect().forEach(结果->系统输出.println(结果));
但日志文件是由不同的进程连续写入的。下面是一个时间轴示例

  • 在T1,日志文件中存在10行
  • 在T2(5秒后),再添加5行
  • 在T3(5秒后),又增加了7条线路
  • 现在,我的程序应该在5秒钟后读取文件,并且只打印新添加的行中的错误语句。我应该手动生成持续运行的线程吗 每隔5秒阅读一次,还是spark中有更好的方法

    更新:-

    基于谷歌,我在下面尝试过,但没有任何帮助

    SparkConf conf = new SparkConf().setAppName(App.class.getName())
                    .setMaster(master);
            //JavaSparkContext context = new JavaSparkContext(conf);
            JavaStreamingContext streamingContext = new JavaStreamingContext(conf, Durations.seconds(10));
    
            JavaDStream<String> stringRDD = streamingContext.textFileStream(inputFilePath);
                stringRDD.filter(text -> text.contains("ERROR")).foreachRDD(result -> System.out.println(result));
    
    SparkConf conf=new SparkConf().setAppName(App.class.getName())
    .setMaster(master);
    //JavaSparkContext上下文=新的JavaSparkContext(conf);
    JavaStreamingContext streamingContext=新的JavaStreamingContext(conf,Durations.seconds(10));
    JavaDStream stringRDD=streamingContext.textFileStream(inputFilePath);
    stringRDD.filter(text->text.contains(“ERROR”)).foreachRDD(result->System.out.println(result));
    
    这是Spark结构化流媒体的主要使用案例。观看Michael Armbrust在2017年波士顿Spark Summit上的演示,他展示了一个几乎相同的使用结构化流媒体跟踪错误的用例。此外,如果您的日志很小,Spark可能根本不是一个好的选择。Scala更适合spark而不是Java,但这最终取决于您。@Garren您指的是视频吗?Ragrding Scala事实上,我在Scala中没有任何经验:(是的,这是视频。Scala非常容易获取。IntelliJ甚至可以为您自动将Java代码转换为Scala代码(当然需要一些手动改进)。-这是一个关于Databricks(“spark的创建者”)的高度相关的开放性问题).Java本身可以使用Apache Commons Tailer类继续阅读:Thank Garren.中的新文件内容。我的问题与您在databricks论坛上指出的问题完全相同?但我真的很惊讶,我没有在google上找到答案,因为这是spark的基本用例?将等待该问题的回答。我也没有了解如何在JavaSpark中在多个节点上分发处理(基本上是集群的简单示例)?这是Spark结构化流媒体的主要使用案例。观看Michael Armbrust在2017年波士顿Spark峰会上的演示,他展示了一个几乎相同的使用结构化流媒体跟踪错误的使用案例。此外,如果您的日志很小,Spark可能根本不是一个好的选择。Scala更适合Spark而不是Java,但这是最好的选择iMaty由你决定。@Garren你指的是视频吗?Ragrding Scala事实上我在Scala中没有任何经验:(是的,这是视频。Scala很容易掌握。IntelliJ甚至可以为你自动将Java代码转换为Scala代码(当然还有一些手动改进)。-这是关于Databricks(“spark的创建者”)的一个高度相关的开放性问题.Java本身可以使用Apache Commons Tailer类继续阅读:Thank Garren.中的新文件内容。我的问题与您在databricks论坛上指出的问题完全相同?但我真的很惊讶,我没有在google上找到答案,因为这是spark的基本用例?将等待该问题的回答。我也没有了解如何在JavaSpark中在多个节点上分发处理(基本上是集群的简单示例)?