环境:
  Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境,gnuplot,

  数据:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html

方案目标:

  提供的blog数据是简单的文件请求访问数据

205.189.154.54 - - [01/Jul/1995:00:00:29 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310

  每一行如上所示的规则。目标是计算每个文件的访问次数,以及访问次数的频率分布

思路:
  这个目标其实非常容易实现。其中涉及的最大的一个知识点是关于job的依赖。在这个目标的解决方案中,可以使用两套MapReduce,前一个计算出每个文件的访问次数,后一个对频率进行统计,最后利用gnuplot工具绘制分布图形。

 一、MapReduce程序

 在这套程序中,MapReduce的编写很简单,就不写了。主要是主程序的框架写好就行了。

  

package ren.snail;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.util.EnumCounters.Map;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.jobcontrol.JobControl;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLBoundFault; public class Main extends Configured implements Tool { public static void main(String[] args) throws Exception {
int result = ToolRunner.run(new Configuration(), new Main(), args);
} @Override
public int run(String[] arg0) throws Exception {
// TODO Auto-generated method stub
Configuration configuration = getConf(); Job job1 = new Job(configuration, "groupby");
job1.setJarByClass(Main.class); FileInputFormat.addInputPath(job1, new Path(arg0[0]));
FileOutputFormat.setOutputPath(job1, new Path(arg0[1])); job1.setMapperClass(GroupMapper.class);
job1.setReducerClass(GroupReducer.class); job1.setOutputFormatClass(TextOutputFormat.class);
job1.setOutputKeyClass(Text.class);
job1.setOutputValueClass(IntWritable.class); Job job2 = new Job(configuration, "sort");
job2.setJarByClass(Main.class); FileInputFormat.addInputPath(job2, new Path(arg0[1] + "/part-r-00000"));
FileOutputFormat.setOutputPath(job2, new Path(arg0[1]+"/out2")); job2.setMapperClass(SortMapper.class);
job2.setReducerClass(SortReducer.class);
job2.setInputFormatClass(KeyValueTextInputFormat.class); job2.setOutputFormatClass(TextOutputFormat.class);
job2.setOutputKeyClass(IntWritable.class); //这里定义的输出格式是map输出到reduce的格式,不是reduce输出到HDFS的格式
job2.setOutputValueClass(IntWritable.class); ControlledJob controlledJob1 = new ControlledJob(job1.getConfiguration());
ControlledJob controlledJob2 = new ControlledJob(job2.getConfiguration()); controlledJob2.addDependingJob(controlledJob1); //job依赖,使得job2利用Job1产生的数据
JobControl jobControl = new JobControl("JobControlDemoGroup");
jobControl.addJob(controlledJob1);
jobControl.addJob(controlledJob2); Thread jobControlThread = new Thread(jobControl);
jobControlThread.start(); while (!jobControl.allFinished()) {
Thread.sleep(500);
} jobControl.stop(); return 0;
} }

最后,我们得到了想要的数据,还有频率分布的数据。接下来使用gunplot来进行绘制

二、GnuPlot

gnuplot的安装很简单,采用 yum install gunplot就能安装。

安装好后,编写代码如下:

set terminal png
set output "freqdist.png" //输出文件名 set title "Frequnecy Distribution of Hits by Url"; //绘制的图像名称
set ylabel "Number of Hits";
set xlabel "Urls (Sorted by hits)";
set key left top
set log y
set log x plot "~/test/data.txt" using 2 title "Frequency" with linespoints

可能出现问题:

Could not find/open font when opening font "arial", using internal non-scalable font

解决方案:

yum install wqy-zenhei-fonts.noarch  #其实这个是安装字体,但是一般都已经安装了的

进入gnuplot的shell,输入set term png font "/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc" 10   #设置png图片的字体,可能会输出

Options are 'nocrop font /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc 12 ',不用管,在运行程序,其实你已经生成了你想要的图片

不仅可以画散点图,还可以有直方图折线图等等,主要是对plot程序的修改,就不在一一实验了

MapReduce实例-NASA博客数据频度简单分析的更多相关文章

  1. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

    [转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...

  2. (2016春) 作业1:博客和Github简单练习

    0. 博客和Github简单练习 总分:10分 1. 目的 博客使用:注册.发布博客.博客管理练习 Github使用:注册.文件同步等练习 2. 要求 (总体作业要求参考[链接]) 发布一篇博客: 介 ...

  3. [2017BUAA软工]第三次博客作业:案例分析

    第三次博客作业:案例分析 1. 调研和评测 1.1 BUG及设计缺陷描述 主要测试博客园在手机端上的使用情况. [BUG 01] 不能后退到上一界面(IOS) 重现步骤:打开博客首页中任意博文,点击博 ...

  4. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  5. Java使用Jsoup之爬取博客数据应用实例

    导入Maven依赖 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <g ...

  6. 【Django实例】博客1

    (上一篇) 一.概述 Blog是一个博客应用. dbe工程的目录结构,参考<序言>的最后部分.blog应用位于/home/russellluo/Django/dbe/dbe/blog目录下 ...

  7. Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫

    网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...

  8. Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码

    Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...

  9. 博客和Github简单练习

    我的第一篇博客 1.首先是自我介绍 姓名:孙弘毅 班级:网工142 学号:1413042050 兴趣:游戏,看书 至于我写了多少代码我也不清楚,反正不多 2.Github  注册流程 (1)百度Git ...

随机推荐

  1. Java泛型-类型擦除

    一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...

  2. iOS阶段学习第18天笔记(Plist-Archiver-归档与解归档操作)

    iOS学习(OC语言)知识点整理 一.归档与解归档的操作 1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取 将数据对象归档成plist文件 2)plist ...

  3. MySQL: Tree-Hierarchical query

             http://dba.stackexchange.com/questions/30021/mysql-tree-hierarchical-query     No problem. ...

  4. 由一个异常开始思考springmvc参数解析

    首先记录一下异常,以及异常出现的原因和解决方案 异常主要信息: -- ::, ERROR [.jsp] - Name for argument type [java.lang.String] not ...

  5. 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...

  6. [moka同学笔记]MySql语句整理

    更改单个表中的字段属性 content 以前为text类型的,现在改为longtext ALTER TABLE `notice` CHANGE `content` `content` LONGTEXT ...

  7. qt (5.60/5.70) 编译 QOCI 驱动

    转载请注明原文链接http://www.cnblogs.com/majianming/p/5925105.html 在学习qt过程中,遇到了编译oracle驱动的问题,在开源协议下没有编译好的,那就只 ...

  8. 信鸽推送.NET SDK 开源

    github 地址 https://github.com/yeanzhi/XinGePushSDK.NET 传送门如何安装    建议使用nuget安装包,搜索"信鸽"即可    ...

  9. JS json的使用

    json的定义 json能够通过4种基本数据类型以及2种结构化数据表示   字符串 "footbar" 不能使用单引号 数值 125.4 只支持10进制 布尔 true  fals ...

  10. IO流(一)__File对象和字符流FileWriter FileReader

    IO流:IO流用来处理设备之间的数据传输,Java对于流的操作对象都在IO包中将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出 流分为字节流和字符流字符流的由来:其实就是字节流读取文字字节 ...