《Hadoop权威指南》笔记 第一章&第二章

?
?

?
?

?
?

?
?

?
?

?
?

?
?

使用MapReduce

?
?

?
?

?
?

?
?

import java.io.IOException;

// 是hadoop针对流处理优化的类型

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

// 会继承这个基类

import org.apache.hadoop.mapred.MapReduceBase;

// 会实现这个接口

import org.apache.hadoop.mapred.Mapper;

// 处理后数据由它来收集

import org.apache.hadoop.mapred.OoutputCollector;

import org.apache.hadoop.mapred.Reporter;

?
?

// 虽然还没有开始系统学习java语法, 我猜测, extends是继承基类,

// implements 是实现接口, java把它们语法上分开了

public class MaxTemperatureMapper extends MapReduceBase

// Mapper是一个泛型接口

implements Mapper<LongWritable, Text, Text, IntWritable> {

?
?

?
?

Mapper是一个泛型接口:

?
?

Mapper<LongWritable, Text, Text, IntWritable>

它有4个形参类型, 分别是map函数的输入键, 输入值, 输出键和输出值的类型.

?
?

就目前来说, 输入键是长整数偏移量, 输入值是一行文本, 输出键是年份, 输出值是气温(整数).

?
?

Hadoop提供了一套可优化网络序列化传输的基本类型, 不直接使用java内嵌的类型. 在这里, LongWritable 相当于 Long, IntWritable 相当于 Int, Text 相当于 String.

?
?

map() 方法的输入是一个键和一个值.

?
?

map() 还提供了 OutputCollector 实例用于输出内容的写入.

?
?

?
?

?
?

reduce函数的输入键值对必须与map函数的输出键值对匹配.

第三部分的代码为负责运行MapReduce的作业.

?
?

import java.io.IOException;

?
?

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.FileInputFormat;

import org.apache.hadoop.mapred.FileOutputFormat;

import org.apache.hadoop.mapred.JobClient;

import org.apache.hadoop.mapred.JobConf;

?
?

public class MaxTemperature {

?
?

public static void main(String[] args) throws IOException {

if(args.length !=2 ) {

System.err.println("Usage: MaxTemperature <input path> <output path>");

System.exit(-1);

}

?
?

JobConf conf = new JobConf(MaxTemperatuer.class);

conf.setJobName("Max temperature");

?
?

FileInputFormat.addInputPath(conf, new Path(args[0]));

FileOutputFormat.setOutputPath(conf, new Path(args[1]));

conf.setMapperClass(MaxTemperatuerMapper.class);

conf.setReducerClass(MaxTemperatuerReducer.class);

conf.setOutputKeyClass(Text.class);

conf.setOutputValueClass(IntWritable.class);

?
?

JobClient.runJob(conf);

}

}

?
?

?
?

JobConf 对象制定了作业的执行规范. 构造函数的参数为作业所在的类, Hadoop会通过该类来查找包含给类的JAR文件.

?
?

构造 JobConf 对象后, 制定输入和输出数据的路径. 这里是通过 FileInputFormat 的静态方法 addInputPath() 来定义输入数据的路径, 路径可以是单个文件, 也可以是目录(即目录下的所有文件)或符合特定模式的一组文件. 可以多次调用(从名称可以看出, addInputPath() ).

?
?

同理, FileOutputFormat.setOutputPath() 指定输出路径. 即写入目录. 运行作业前, 写入目录不应该存在, Hadoop会拒绝并报错. 这样设计, 主要是防止数据被覆盖, 数据丢失. 毕竟Hadoop运行的时间是很长的, 丢失了非常恼人.

?
?

FileOutputFormat.setOutputPath() 和 conf.setMapperClass() 指定map和reduce类型.

?
?

接着, setOutputKeyClass 和 setOutputValueClass 指定map和reduce函数的
输出
类型, 这两个函数的输出类型往往相同. 如果不同, map的输出函数类型通过 setMapOutputKeyClass 和 setMapOutputValueClass 指定.

?
?

输入的类型用 InputFormat 设置, 本例中没有指定, 使用的是默认的 TextInputFormat (文本输入格式);

?
?

最后, JobClient.runJob() 会提交作业并等待完成, 将结果写到控制台.

?
?

?
?

?
?

?
?

?
?

新增的java MapReduce API与旧API的区别:

?
?

新API倾向于使用基类而不是接口, 因为更容易扩展.

新API放在 org.apache.hadoop.mapreduce 包中, 旧的在 org.apache.hadoop.mapred 中.

新API充分使用context object, 使用户代码能与MapReduce系统进行通信. ex, MapContext基本具备了JobConf, OutputCollector和Reporter的功能.

新API支持"推"(push)和"拉"(pull)式的迭代. 这两类API, 均可以K/V pair把记录推给mapper, 亦可以从map()方法中pull.pull的好处是, 可以实现数据的批量处理, 而非逐条记录的处理.

新API实现了配置的统一. 不在通过JobConf对象(Hadoop配置的对象的一个扩展)配置, 而是通过Configuration配置.

新API中作业由Job类控制, 而非JobClient类, 它被删除了.

输出文件的命名方式稍有不同. map为part-m-nnnnn, reduce为part-r-nnnnn(nnnnn为分块序列号, 整数, 从0开始).

?
?

?
?

《Hadoop权威指南》笔记 第一章&第二章

时间: 2024-10-03 23:07:16

《Hadoop权威指南》笔记 第一章&第二章的相关文章

javascript权威指南笔记(第6章 对象)

1.对象概述 1.对象常见的用法: create .set .Query .delete .test.enumerate 2.对象的属性特性: 可写.可枚举.可配置 3.每个对象的对象特性: 原型.对象的类.对象的可扩展性 4.对象和属性分类: 内置对象.宿主对象.自定义对象.自由属性.继承属性 2.创建对象 1.对象直接量 2.通过new创建对象 3.原型 4.Object.create() 第一个参数:这个对象的原型 第二个参数:可选.对对象的属性进行进一步描述 var o1 = Objec

javascript权威指南笔记(第8章 函数)

8.1 函数定义: 变量声明提前,但是变量赋值并不会提前 函数声明语句不能出现在循环,条件判断或者try/catch/finally以及with语句中: 8.2 函数调用(函数调用,方法调用,构造函数调用,间接调用(call,apply)) 1.var isStrict = (function() { return !this; }()); 2.this的指向问题(嵌套函数this的指向问题) 可以解决的方法有:var self = this 或者使用 apply //嵌套函数 var o =

javascript权威指南笔记(第10章 正则表达式的模式匹配)

1.非贪婪的重复:如"??" .   "+?"   . "*?"  ."{1,5}?" 例如: 非贪婪匹配 /a+?/去匹配aaa,尽可能的少匹配,只能匹配到第一个a, /a+/去匹配aaa,匹配到了aaa /a+b/去匹配aabb,匹配到aabb 而使用非贪婪匹配/a+?b/,它会匹配尽可能少的a和一个b,但是匹配到了aabb,因为会寻找正则表达式第一个匹配的位置 2.圆括号的作用 1.将单独的项组合成子表达式 2.完整的模

HTML5 WebSocket 权威指南 学习一 (第二章 WebSocket API)

WebSocket 协议两种URL方案 ws 客户端和服务器之间的非加密流量 wss 客户端和服务器之间的加密流量 WebSocket Secure 表示使用传输层安全性(SSL)的WebSocket连接 采用HTTPS安全机制来保证HTTP连接安全 1.WebSocket 的构造函数 var ws = new WebSocket("ws://www.websocket.org"); 2.WebSocket 对象调度4个不同的事件 open message error close 处理

javascript权威指南笔记(第9章 类和模块)

1.工厂函数 function range(from, to) { var r = inherit(range.methods); r.from = from; r.to = to; return r; }; range.methods = { includes: function (x) { return this.from <= x && x <= this.to; }, foreach: function (f) { for (var x = Math.ceil(this

javascript权威指南笔记(第7章 数组)

1.注意: a[-1.23] = true; // This creates a property named "-1.23" a["1000"] = 0; // This the 1001st element of the array a[1.000] // Array index 1. Same as a[1] 2.delete操作符产生稀疏数组 3.设置数组的长度会自动切断或添加undefined 4.javascript不支持真正的多维数组但是可以用数组的数

《Hadoop权威指南》笔记 第一章&第二章 MapReduce初探

? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用MapReduce ? ? ? ? ? ? ? ? import java.io.IOException; // 是hadoop针对流处理优化的类型 import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; // 会继承这个基类 import org.apache

Hadoop权威指南---第二章MaxTemperature例题源码

敲了一下hadoop权威指南第二章的例题,虽然基本上是照着书上敲的,但还是把它放到这方便以后查看. 代码如下: <span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration;

《Hadoop权威指南》读书笔记

<Hadoop权威指南>读书笔记 Day1 第一章 1.MapReduce适合一次写入.多次读取数据的应用,关系型数据库则更适合持续更新的数据集. 2.MapReduce是一种线性的可伸缩编程模型. 3.高性能计算HPC和网格计算比较适合用于计算密集型的作业,但如果几点需要访问的数据量更庞大,很多节点就会因为网络带宽的瓶颈问题不得不闲下等数据.(HPC和网格计算的数据存储与SAN中,数据存储比较集中,数据访问一般通过网络) 4.MapReduce尽量在计算节点上存储数据,以实现数据的本地化快速