1. 应用环境,项目需要解析日志,通过flume读取不同服务器上的日志并进行初步的过滤(可通过配置完成),由masterFlume将读取到的日志汇总到硬盘的某个文件中,有spark解析日志,并进行汇总。将汇总结果保存到mongo数据库。
1)创建spark的上下文
JavaSparkContext sc = new JavaSparkContext(spark.master, appName, new SparkConf().set("spark.executor.memory", spark.memory));java
spark.memory : spark的计算内存的大小,视服务器内存大小而定。
javaSparkContext:spark的上下文,需要参数spark的地址,spark的名称(自己取),SparkConf
spark.master:sparkmaster的地址 spark.master = spark://ip:端口号 使用本地spark时 spark.master=local[4]
2)创建RDD(弹性分布式数据集)对象
JavaRDD<String> lines = sc.textFile(filepath, 4);
filePath:文件的绝对路径。
RDD的生成途径:来自于内部存储集合和外部存储文件,通过转化操作来自于其他的RDD。
RDD支持两种类型的操作:转化操作:返回结果为RDD的操作,比如:textFile、filter等
行动操作:spark为惰性计算,需要行动操作来触发计算,比如count、take等。每次触发spark进行计算,spark都会从头开始,所以计算中间有需要重用的RDD时,可通过persists将RDD保存到内存中。
3)对RDD进行操作,汇总
JavaRDD<String> objs = datas.map(s -> s.split("healthIndex@")[1]);
JavaPairRDD<String, Integer[]> siteCodes = objs.mapToPair(new mapToPair());
JavaPairRDD<String, Integer[]> counts = siteCodes.reduceByKey((i1, i2) -> new Integer[]{(i1[0] + i2[0]), (i1[1] + i2[1]), (i1[2] + i2[2]), (i1[3] + i2[3])});
List<Tuple2<String, Integer[]>> output = counts.collect();
自定义的分组,根据需求,分组数据。
static class mapToPair implements PairFunction<Document, String, Integer[]>{
@Override
public Tuple2<String, Integer[]> call(Document dou) throws Exception {
//1000 1500 2000 2500 3000 3500
Integer[] result = new Integer[]{0, 0, 0, 0, 0, 0};
if(StringUtils.isNotEmpty(dou.getString("hi1"))){
if(Float.parseFloat(dou.getString("hi1")) <= 1000.00){
result[0] = 1;
}else if(1000.00 < Float.parseFloat(dou.getString("hi1")) && Float.parseFloat(dou.getString("hi1")) <= 1200.00){
result[1] = 1;
}else if(1200.00 < Float.parseFloat(dou.getString("hi1")) && Float.parseFloat(dou.getString("hi1")) <= 1400.00){
result[2] = 1;
}else if(1400.00 < Float.parseFloat(dou.getString("hi1")) && Float.parseFloat(dou.getString("hi1")) <= 1600.00){
result[3] = 1;
}else if(1600.00 < Float.parseFloat(dou.getString("hi1")) && Float.parseFloat(dou.getString("hi1")) <= 1800.00){
result[4] = 1;
}else if(1800.00 < Float.parseFloat(dou.getString("hi1")) && Float.parseFloat(dou.getString("hi1")) <= 2000.00){
result[5] = 1;
}
}
return new Tuple2(dou.getString("bs2"),result);
}
}