MapReduce处理PV问题

package com.ibeifeng.hadoop19_copy;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.jboss.netty.util.internal.StringUtil;

//处理用户登录网站的日志信息
//一行日志代表一条信息
//数据的格式由36个字段组成,每个字段用制表符分隔,参考,track字典可以得知每个字段代表的含义,
//我们现在要考察的是一份日志中,统计各个省的PV数据,需要取出url与provinceID这两个字段!url不能为空!provinceID不能为空!url是第二个字段,provinceID是第24个字段

public class WebPV {
 
 public static class PVMap extends Mapper<LongWritable,Text,IntWritable,IntWritable>{
  private final IntWritable mapoutkey = new IntWritable();
  private final IntWritable mapoutvalue = new IntWritable(1);
  
  
  @Override
  protected void map(LongWritable key, Text value, Context context)
    throws IOException, InterruptedException {
   String line = value.toString();
   String[] message = line.split("\t");
   //判断数组的长度是否小于30,小于30的数据不计算
   if(message.length < 30){
    //增加计数器,可以计算出字段少于30的行数!
    context.getCounter("Count_NUMBER", "Length_short_than_30").increment(1L);
    return;    
   }
   //判断url是否为空
   String url = message[1];
   if(StringUtils.isBlank(url)){
    context.getCounter("Count_NUMBER", "url_is_blank").increment(1L);
    return;
   }
   
   //判断provinceID是否为空
   String provinceID = message[23];
   if(StringUtils.isBlank(provinceID)){
    context.getCounter("Count_NUMBER", "provinceID_is_blank").increment(1L);
    return;
   }
   
   //
   Integer i = Integer.MAX_VALUE;
   try {
    i = Integer.parseInt(provinceID);
   } catch (NumberFormatException e) {
    // TODO Auto-generated catch block
    context.getCounter("Count_NUMBER", "Transe").increment(1L);
    e.printStackTrace();
    return;
   }
   
   mapoutkey.set(i);
   context.write(mapoutkey, mapoutvalue);
        
  } 
 }
 
 public static class PVReduce extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable>{
  //private final IntWritable reduceoutkey = new IntWritable();
  private final IntWritable reduceoutvalue = new IntWritable();
  @Override
  protected void reduce(IntWritable key, Iterable<IntWritable> values,
    Context context)
    throws IOException, InterruptedException {
   int sum = 0;
   for(IntWritable value : values){
    sum += value.get();
   }
   reduceoutvalue.set(sum);
   context.write(key, reduceoutvalue);
  }
 
 }
 
 
 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
  //获取Hadoop的默认配置信息
  Configuration conf = new Configuration();
  //设置job
  Job job = Job.getInstance(conf, "JinNan");
  
  //设置打成Jar包
  job.setJarByClass(WebPV.class);
  
  //设置输入路径
  Path inpath = new Path("hdfs://node-1:8020/2015082818");
  FileInputFormat.setInputPaths(job, inpath);
  
  //设置mapper类
  job.setMapperClass(PVMap.class);
  job.setMapOutputKeyClass(IntWritable.class);
  job.setOutputValueClass(IntWritable.class);
  
  //shuffle
  
  //设置reduce类
  job.setReducerClass(PVReduce.class);
  job.setOutputKeyClass(IntWritable.class);
  job.setOutputValueClass(IntWritable.class);
  
  //设置输出路径
  Path outpath = new Path("hdfs://node-1:8020/test");
  FileSystem fs = outpath.getFileSystem(conf);
  if(fs.exists(outpath)){
   fs.delete(outpath, true);
  }
  
  FileOutputFormat.setOutputPath(job, outpath);
  
  System.exit(job.waitForCompletion(true)? 0: 1);
 } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上层应用业务对实时数据的需求,主要包含两部分内容:1、 整体数据的实时分析。2、 AB实验效果的实时监控。这几部分数据需求,都需要进行的下钻分析支持,我们希望能够建立统一的实时OLAP数据仓库,并提供一套安全、可靠的、灵活的实时数据服务。目前每日新增的曝光日志达到几亿条记录,再细拆到AB实验更细维度时,数据量则多达上百亿记录,多维数据组合下的聚合查询要求秒级响应时间,这样的数据量也给团队带来了不小的挑战。OLAP层的技术选型,需要满足以下几点:1:数据延迟在分钟级,查询响应时间在秒级2:标准SQL交互引擎,降低使用成本3:支持join操作,方便维度增加属性信息4:流量数据可以近似去重,但订单行要精准去重5:高吞吐,每分钟数据量在千W级记录,每天数百亿条新增记录6:前端业务较多,查询并发度不能太低通过对比开源的几款实时OLAP引擎,可以发现Doris和ClickHouse能够满足上面的需求,但是ClickHouse的并发度太低是个潜在的风险,而且ClickHouse的数据导入没有事务支持,无法实现exactly once语义,对标准SQL的支持也是有限的。所以针对以上需求Doris完全能解决我们的问题,DorisDB是一个性能非常高的分布式、面向交互式查询的分布式数据库,非常的强大,随着互联网发展,数据量会越来越大,实时查询需求也会要求越来越高,DorisDB人才需求也会越来越大,越早掌握DorisDB,以后就会有更大的机遇。本课程基于真实热门的互联网电商业务场景为案例讲解,具体分析指标包含:AB版本分析,下砖分析,营销分析,订单分析,终端分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。整个课程,会带大家实践一个完整系统,大家可以根据自己的公司业务修改,既可以用到项目中去,价值是非常高的。本课程包含的技术:开发工具为:IDEA、WebStormFlink1.9.0DorisDBHadoop2.7.5Hbase2.2.6Kafka2.1.0Hive2.2.0HDFS、MapReduceFlume、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.8.RELEASESpringCloud Finchley.SR2Vue.js、Nodejs、Highcharts、ElementUILinux Shell编程等课程亮点:1.与企业接轨、真实工业界产品2.DorisDB高性能分布式数据库3.大数据热门技术Flink4.支持ABtest版本实时监控分析5.支持下砖分析6.数据分析涵盖全端(PC、移动、小程序)应用7.主流微服务后端系统8.天级别与小时级别多时间方位分析9.数据库实时同步解决方案10.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS+ElementUI11.集成SpringCloud实现统一整合方案12.互联网大数据企业热门技术栈13.支持海量数据的实时分析14.支持全端实时数据分析15.全程代码实操,提供全部代码和资料16.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值