我最近使用Spark SQL对静态日志文件进行了分析(找出类似ip地址的内容,这些内容出现的次数超过十次)。问题是from this site。但是我使用了自己的实现。我将日志读入RDD,将RDD转换为DataFrame(借助POJO)并使用DataFrame操作。
现在我应该使用Spark Streaming对流媒体日志文件进行类似的分析,以获得30分钟的窗口以及一天的聚合结果。可以再次找到解决方案here,但我想以另一种方式做到这一点。所以我所做的就是这个
使用Flume将日志文件中的数据写入HDFS目录
使用JavaDStream从HDFS读取.txt文件
然后我无法弄清楚如何继续。这是我使用的代码
Long slide = 10000L; //new batch every 10 seconds
Long window = 1800000L; //30 mins
SparkConf conf = new SparkConf().setAppName("StreamLogAnalyzer");
JavaStreamingContext streamingContext = new JavaStreamingContext(conf, new Duration(slide));
JavaDStream<String> dStream = streamingContext.textFileStream(hdfsPath).window(new Duration(window), new Duration(slide));
现在我似乎无法决定是否应该将每个批处理转换为DataFrame并执行我以前使用静态日志文件执行的操作。或者这是耗时且过度的。
我是Streaming和Flume的绝对菜鸟。有人可以指导我吗?
答案 0 :(得分:1)
在Spark的最新版本中使用Spark中的DataFrame(和Dataset)是最常用的方式,因此它是一个正确的选择。我认为当您将文件移动到HDFS而不是从任何事件日志中读取时,由于流的非显式特性而出现一些模糊不清。
这里的要点是选择正确的批次时间大小(或片段中的幻灯片大小),因此应用程序将处理在该时间段下加载的数据,并且不会有批处理队列。