spark进行日志解析有两种方式:
一、flume(日志采集)将采集到的日志保存到硬盘的日志文件中,spark每隔一段时间汇总分析一次(我们在用的是这种方式,每一个小时通过自定义的sink生成一个日志文件,spark的汇总每隔一个小时被调用一次,汇总上个小时采集的日志)。
二、flume将采集到的日志保存在内存中,spark通过流每隔几秒获取一次内存中数据,汇总分析保存。
第二种实现:
SparkConf conf = new SparkConf().set("spark.executor.memory",573240000);
JavaStreamingContext sc = new JavaStreamingContext(conf.setMaster("spark.master").setAppName(appName), Durations.seconds(seconds));
//Durations.seconds(seconds): 每隔seconds秒拉去一次。
JavaReceiverInputDStream<SparkFlumeEvent> flumeStream = FlumeUtils.createPollingStream(sc, "spark.host", "spark.port");
JavaDStream<SparkFlumeEvent> datas = flumeStream.filter(s -> new String(s.event().getBody().array(), "UTF-8").contains("healthIndex@"));
JavaDStream<JSONObject> lines = flumeStream.map(new resultMap());
JavaPairDStream<String, Integer[]> siteCodes = lines.mapToPair(m -> new Tuple2<>(m.get("sd") + "_" + m.get("sc").toString(), new Integer[]{m.getInteger("loadspeed"), 1, DeadLinkNum(m.getInteger("httpCode"))}));
JavaPairDStream<String, Integer[]> counts = siteCodes.reduceByKey((i1, i2) -> new Integer[]{(i1[0] + i2[0]), (i1[1] + i2[1]), (i1[2] + i2[2])});
static class resultMap implements Function<SparkFlumeEvent, JSONObject> {
@Override
public JSONObject call(SparkFlumeEvent event) throws Exception {
String line = new String(event.event().getBody().array(), "UTF-8");
JSONObject jobj = JSONObject.parseObject(AT.split(line)[1]);
Matcher m = DATE_REGX.matcher(line);
while (m.find()) {
jobj.put("sd", m.group());
}
return jobj;
}
}
spark每隔几秒就会从flume自动拉去一部分日志,进行汇总,这种方式spark的汇总代码是一直运行着的,但是第一种方式,每次需要汇总时调用一次spark的汇总即可。