HDFS 数据格式 : 

举例单条数据:02-26 08:01:56 [qtp512249001-42] INFO  async-statistics - class com.spring.aop.StorageManagerStatAspect${"method":"com.systoon.scloud.master.controller.ImageController.download","ip":"172.28.6.131","port":"38001","father":"sun.reflect.GeneratedMethodAccessor8.invoke/null/-1","requestIp":"106.39.33.246","argsMap":{"org.eclipse.jetty.server.Request:0":{"requestURI":"/f/KZ0wxxbvFz924VaHS8JN1Fk42jV9OBMCHYoLtuc9sAkfF.jpg"},"org.eclipse.jetty.server.Response:1":1462183982},"processTime":50,"time":1456444916225,"retValMap":{":":"this object is null"}}

是写出的一行日志。  日志结构是时间 + 打印的类 + JSON
那么现在是要进行一个统计 MR 分析。

那么开始上代码:
        
  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.rocky.util.TimeUtils;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.LongWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapred.*;
  10. import org.apache.hadoop.mapred.lib.MultipleOutputFormat;
  11. import org.apache.hadoop.util.Progressable;
  12. import java.io.IOException;
  13. import java.net.URI;
  14. import java.util.Iterator;
  15. public class MulOutput {
  16. public static final String clazz = "com.spring.aop.StorageManagerStatAspect";
  17. public static final String m_download = "com.systoon.scloud.master.controller.ImageController.download";
  18. public static final String m_upload = "com.systoon.scloud.master.controller.DirectUploadFile.directUploadFile";
  19. public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable>{
  20. private final static IntWritable one = new IntWritable(1);
  21. Text word = new Text();
  22. @Override
  23. public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output,
  24. Reporter reporter) throws IOException {
  25. String line = value.toString();
  26. if(line.contains(clazz)){
  27. if(line.contains(m_download)){
  28. String tempObject = line.split(clazz)[1];
  29. String tmp = tempObject.substring(1,tempObject.length());
  30. JSONObject jsonObject = JSON.parseObject(tmp);
  31. String method = jsonObject.get("method").toString();
  32. if( method.equals(m_download) ){
  33. word.set("download");
  34. output.collect(word, one);
  35. }
  36. } else if(line.contains(m_upload)) {
  37. String tempObject = line.split(clazz)[1];
  38. String tmp = tempObject.substring(1,tempObject.length());
  39. JSONObject jsonObject = JSON.parseObject(tmp);
  40. String method = jsonObject.get("method").toString();
  41. if( method.equals(m_upload) ){
  42. word.set("upload");
  43. output.collect(word, one);
  44. }
  45. } else {
  46. word.set("debug");
  47. output.collect(word,one);
  48. }
  49. } else {
  50. word.set("others");
  51. output.collect(word, one);
  52. }
  53. }
  54. }
  55. public static class Reduce extends MapReduceBase
  56. implements Reducer<Text, IntWritable, Text, IntWritable> {
  57. public void reduce(Text key, Iterator<IntWritable> values,
  58. OutputCollector<Text, IntWritable> output, Reporter reporter)
  59. throws IOException{
  60. int sum = 0;
  61. while (values.hasNext()) {
  62. sum += values.next().get();
  63. }
  64. output.collect(key, new IntWritable(sum));
  65. }
  66. }
  67. public static void main(String[] args) throws Exception{
  68. JobConf jobConf = new JobConf(MulOutput.class);
  69. jobConf.setJobName("rocky_test");
  70. String outPath = "/test/mapReduce/statis"+TimeUtils.getStringDate();
  71. final FileSystem filesystem = FileSystem.get(new URI(outPath), jobConf);
  72. if(filesystem.exists(new Path(outPath))){
  73. filesystem.delete(new Path(outPath), true);
  74. }
  75. jobConf.setMapperClass(Map.class); //为job设置Mapper类
  76. jobConf.setMapOutputKeyClass(Text.class); //输出数据设置Key类
  77. jobConf.setMapOutputValueClass(IntWritable.class); //输出数据设置Key类
  78. jobConf.setCombinerClass(Reduce.class); // 为job设置Combiner类
  79. jobConf.setReducerClass(Reduce.class); // 为job设置Reduce类
  80. jobConf.setOutputKeyClass(Text.class); // 输出数据设置Key类
  81. jobConf.setOutputValueClass(IntWritable.class); // 输出数据设置Key类
  82. FileInputFormat.setInputPaths(jobConf, new Path("/test/mapReduce/statistics.log.2016-02-26"));
  83. // // 扫描组合path
  84. // FileInputFormat.addInputPath();
  85. jobConf.setOutputFormat(MyMultipleFilesTextOutputFormat.class);
  86. FileOutputFormat.setOutputPath(jobConf, new Path(outPath));
  87. JobClient.runJob(jobConf); //运行一个job
  88. }
  89. }


简单来讲就是 Map 按行读, Reduce 进行汇总。   也是统计中最最常用的。  轻松解决问题。









附件列表

仿分词统计的MapReduce 程序。的更多相关文章

  1. 在Hadoop上运行基于RMM中文分词算法的MapReduce程序

    原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...

  2. 大数据学习——mapreduce程序单词统计

    项目结构 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  3. 从零开始学习Hadoop--第2章 第一个MapReduce程序

    1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...

  4. Eclipse下使用Hadoop单机模式调试MapReduce程序

    在单机模式下Hadoop不会使用HDFS,也不会开启任何Hadoop守护进程,所有程序将在一个JVM上运行并且最多只允许拥有一个reducer 在Eclipse中新创建一个hadoop-test的Ja ...

  5. 使用Python实现Hadoop MapReduce程序

    转自:使用Python实现Hadoop MapReduce程序 英文原文:Writing an Hadoop MapReduce Program in Python 根据上面两篇文章,下面是我在自己的 ...

  6. 用PHP编写Hadoop的MapReduce程序

    用PHP编写Hadoop的MapReduce程序     Hadoop流 虽然Hadoop是用Java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编 ...

  7. HADOOP之MAPREDUCE程序应用二

    摘要:MapReduce程序进行单词计数. 关键词:MapReduce程序  单词计数 数据源:人工构造英文文档file1.txt,file2.txt. file1.txt 内容 Hello   Ha ...

  8. Hadoop之MapReduce程序应用三

    摘要:MapReduce程序进行数据去重. 关键词:MapReduce   数据去重 数据源:人工构造日志数据集log-file1.txt和log-file2.txt. log-file1.txt内容 ...

  9. 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行

    [TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...

随机推荐

  1. SPOJ 1029 Matrix Summation【 二维树状数组 】

    题意:二维树状数组,更改值的时候有一点不一样, 是将a[x][y]设置为一个值,所以add的时候要将它和以前的值作差一下 #include<iostream> #include<cs ...

  2. Matlab--从入门到精通(chapter2 matlab 基础知识)

    Chapter2 Matlab 基础知识 1.基本数学运算符号 注:矩阵的右除是一般意义的除法,但是左除具有对称意义,即A./B=B.\A 2. 命令行中的常用标点 3.常见的操作命令 4.输出数据显 ...

  3. shell编程, 100文钱买100只鸡, 简单实现

    今天碰到一个有趣的问题: 群友用shell写的一个: #!/bin/bash # 百元买百鸡,每种鸡至少买一只 all= # 公鸡每只多少元 read -p '公鸡多少文一只: ' gongji # ...

  4. [转载]PyCharm创建.py自动添加文件头注释

    转自:https://blog.csdn.net/qq_36482772/article/details/67218214 创建.py文件时 顺便自动添加作者.时间.文件名信息…… mac系统打开编辑 ...

  5. wackoPicko 渗透平台的安装

    2016-05-17 wackoPicko 的介绍及下载地址        https://github.com/adamdoupe/WackoPicko#from=codefrom.com 首先我们 ...

  6. 洛谷P4894 GodFly求解法向量

    如果没有学过向量相关知识请出门右转高中数学必修四~~~ 当然如果你和我一样也是小学生我也不反对 首先说结论:\(\vec{z}=(y1z2-y2z1,z1x2-z2x1,x1y2-x2y1)\) 其实 ...

  7. Maven学习总结(22)——Maven常用插件介绍

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  8. 成都磨子桥技工学校 / 2016届练习区 0003:jubeeeeeat

    0003:jubeeeeeat 总时间限制:  1000ms 内存限制:  256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐 ...

  9. &quot;duplicate symbol for architecture i386&quot; 解决的方法

    我在写项目的过程中,碰到了这个错误,我在网上查了一下,发现这个错误的原因是,project里面有反复的类. 解决方式:找到反复的类,然后删除掉就好了. 分析一下, 如图. 能够看出, 错误类型是 du ...

  10. Precision and recall From Wiki

    Precision.全部推断为正样本的数量里面,有多少是真正的正样本.就是精确率 Recall.所有的正样本里面,检測到了多少真正的正样本,又称查全率.即所有正样本查找到了多少的比率.