1. 查找历年最高的温度。

MapReduce任务过程被分为两个处理阶段:map阶段和reduce阶段。每个阶段都以键/值对作为输入和输出,并由程序员选择它们的类型。程序员还需具体定义两个函数:map函数和reduce函数。

对应的Java MapReduce代码如下:

public class MaxTemperature{
static class MaxTemperatureMapper
extends Mapper<LongWritable,Text,Text,IntWritable>{
public void map(LongWritable key, Text value,Context context)
throws IOException,InterruptedException{
String line = value.toString();
String year = line.substring(15,19);
int airTemperature;
if(line.charAt(87) == '+'){
airTemperature = Integer.parseInt(line.substring(88, 92));
} else {
airTemperature = Integer.parseInt(line.substring(87, 92));
} String quality = line.substring(92, 93);
if(airTemperature != MISSING && quality.matches("[01459]")){
context.write(new Text(year),new IntWritable(airTemperature));
}
}
} static class MaxTemperatureReducer
extends Reduce<Text,IntWritable,Text,IntWritable>{
public void reduce(Text key,Iterable<IntWritable> values,
Context context) throws IOException,InterruptedException{
int maxValue = Inerger.MIN_VALUE;
for(IntWritable value : values){
maxValue = Math.max(maxValue,value.get());
}
context.write(key,new IntWritable(maxValue));
}
} public static void main(String[] args) throws Exception{
if(args.length != 2){
System.out.println("Usage: MaxTemperature <input path> <output path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class); FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1])); job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); System.exit(job.waitForCompletion(true)?0:1);
}
}

2. 为了实现横向扩展,需要把数据存储在分布式文件系统HDFS中,由此允许hadoop将MapReduce计算移到存储有部分数据的各台机器上。

  (1) 一个reduce任务的MapReduce数据流

  MapReduce作业(job)是客户端需要执行的一个工作单元:包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个小任务(task)来执行,其中包括两类任务:map任务和reduce任务。

  有两类节点控制着作业执行过程:一个jobtracker及一系列tasktracker。jobtracker通过调度tasktracker上运行的任务,来协调所有运行在系统上的作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker由此在另外一个tasktracker节点上重新调度该任务。

  Hadoop将MapReduce的输入数据划分成等长的小数据块,成为输入分片(input split)。Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。

  如果我们并行处理每个分片,且每个分片数据比较小,那么整个处理过程将获得更好的负载平衡。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64M。

  Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳的性能,这就是所谓的数据本地化优化(data locality optimization)。最佳分片的大小应该与块大小相同,因为它是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,因此分片中的部分数据需通过网络传输到map任务节点。

  map任务将其输出写入本地硬盘,而非HDFS,因为map的输出结果是中间结果,该中间结果由reduce任务处理后才产生最终输出结果,而一旦作业完成,map的输出结果可以被删除。因此,如果把它存储在HDFS中并实现备份难免有些小题大做。如果该节点上运行的map任务在map中间结果传送给reduce任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。

  reduce任务并不具备数据本地化的优势-单个reduce任务的输入通常来自于所有mapper的输出。因此,上例中排过序的map输出需要通过网络传输发送到运行reduce任务的节点。数据在reduce端合并,然后由用户定义的reduce函数处理。reduce的输出通常存储在HDFS中以实现可靠存储。对于每个reduce输出的HDFS数据块,第一个复本存储在本地节点上,其他复本存储在其他机架节点中。

  (2) 多个reduce任务的数据流

  reduce任务的数量并非由输入数据的大小决定,而是特别指定的。如果有多个reduce任务,则每个map任务都会对其输出进行分区,即为每个reduce任务建一个分区。每个分区有许多键(及其对应值),但每个键对应的键/值对都在同一个分区中,分区由用户定义的分区函数控制,但通常用默认的分区器通过哈希函数来区分。

  (3) 无reduce任务的MapReduce数据流

  在这种情况下,唯一的非本地节点数据传输是map任务将结果写入HDFS。

3. combiner

  集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map任务和reduce任务之间的数据传输。Hadoop允许用户针对map任务的输出指定一个合并函数——合并函数的输出作为reduce函数的输入。Hadoop无法确定针对map任务输出中任一条记录需要调用多少次合并函数。

  例:计算最高温度的例子中,1950年的读数由两个map任务处理。假设第一个map的输出为:(1950,0),(1950,20),(1950,10),第二个map的输出为:(1950,25),(1950,15),reduce函数被调用时,输出:(1950,[0 20 10 25 15]),因此reduce函数的输出为(1950,25)。

  我们可以像使用reduce函数那样,使用合并函数找出每个map任务输出结果中的最高温度,则reduce函数调用时将被传入:(1950,[20,25])

  使用合并函数快速找出最高气温的代码:

public class MaxTemperatureWithCombiner{
public static void main(String[] args) throws IOException{
if(args.length != 2){
System.out.println("Usage: MaxTemperatureWithCombiner <input path> <output path>");
System.exit(-1);
} JobConf conf = new JobConf(MaxTemperatureWithCombiner.class);
conf.setJobName("Max Temperature"); FileInputFormat.addInputPath(conf,new Path(args[0]));
FileOutputFormat.setOutputPath(conf,new Path(args[1])); conf.setMapperClass(MaxTemperatureMapper.class);
conf.setReducerClass(MaxTemperatureReducer.class);
conf.setCombinerClass(MaxTemperatureReducer.class); conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class); JobClient.runJob(conf);
}
}

4. Hadoop的Streaming

  Hadoop的Streaming使用unix标准流作为Hadoop和应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入/输出来写MapReduce程序。

Hadoop学习笔记(2) 关于MapReduce的更多相关文章

  1. Hadoop 学习笔记3 Develping MapReduce

    小笔记: Mavon是一种项目管理工具,通过xml配置来设置项目信息. Mavon POM(project of model). Steps: 1. set up and configure the ...

  2. Hadoop学习笔记—4.初识MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...

  3. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  4. Hadoop学习笔记(7) ——高级编程

    Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...

  5. Hadoop学习笔记(6) ——重新认识Hadoop

    Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功 ...

  6. Hadoop学习笔记(2)

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  7. Hadoop学习笔记(5) ——编写HelloWorld(2)

    Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...

  8. Hadoop学习笔记(2) ——解读Hello World

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  9. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

随机推荐

  1. 【BZOJ-3553】三叉神经树 树链剖分

    3553: [Shoi2014]三叉神经树 Time Limit: 160 Sec  Memory Limit: 256 MBSubmit: 347  Solved: 112[Submit][Stat ...

  2. Git for Windows - The Program can't start because libiconv2.dll is missing

    今天在新装的win10 预览版上面,发现git不能启动了,提示信息主要是: The Program can't start because libiconv2.dll is missing 于是我在网 ...

  3. 分析移动端APP的网络请求抓包

    为了方便,本文以 iOS 系统来进行演示. 使用代理 移动操作系统中都有可以设定系统代理的设置,比如在 iOS 中可以通过 Settings->WLAN 看到很多 Networks,通过点击它们 ...

  4. struts2+hibernate 项目实战:图书管理系统

    经典项目,练手必备. 图书管理系统 需求分析(大致,并不专业):1.需要有用户管理: 1.1 用户注册: 1.2 用户登录: 1.3 用户信息修改: 1.4 用户修改密码: 2.需要有书本管理: 2. ...

  5. 一个ERP项目实施工程师的若干体会

    本人在多年的工作中,参与了ERP的研发和实施,对ERP有较深的认识.在这里,根据自已的实施过程中的一些经历,把自已在实践中的一些体会贡献出来和大家共享,由于时间和精力所限,内容难免有不当之处,挂一漏万 ...

  6. Linux下长时间ping网络加时间戳并记录到文本

    Linux下长时间ping网络加时间戳并记录到文本   由于一些原因,比如需要检查网络之间是否存在掉包等问题,会长时间去ping一个地址,由于会输出大量的信息而且最好要有时间戳,因此我们可以使用简单的 ...

  7. PHP 图片上传

    PHP上传的简单案例: Html文件: <html> <form action="index.php" name="form" method= ...

  8. IntersectionObserver API

    温馨提示:本文目前仅适用于在 Chrome 51 及以上中浏览. 2016.11.1 追加,Firefox 52 也已经实现. 2016.11.29 追加,Firefox 的人担心目前规范不够稳定,未 ...

  9. Effective Java Second Edition --- Builder Pattern

    如果类的构造器或者静态工厂中有多个参数,设计这种类时,Builder模式是一种不错的选择,特别是当大多数参数是可选的时候. 与使用传统的重载构造函数模式相比,使用Builder模式的客户端代码更易于阅 ...

  10. CMake命令/函数汇总(翻译自官方手册)

    查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...