Saprk初学(二)- 应用-日志解析

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);
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值