没有合适的资源?快使用搜索试试~ 我知道了~
MapReduce详解包括配置文件
需积分: 1 0 下载量 125 浏览量
2024-04-18
19:26:02
上传
评论
收藏 185KB DOCX 举报
温馨提示
试读
58页
MapReduce是Hadoop提供的一套用于进行分布式计算的模型,本身是Doug Cutting根据Google的<MapReduce: Simplified Data Processing on Large Clusters>仿照实现的。 MapReduce由两个阶段组成:Map(映射)阶段和Reduce(规约)阶段,用户只需要实现map以及reduce两个函数,即可实现分布式计算,这样做的目的是简化分布式程序的开发和调试周期。 在MapReduce刚开始的时候,会先对文件进行切片(Split)处理。需要注意的是,切片本身是一种逻辑切分而不是物理切分,本质上就是在划分任务量,之后每一个切片会交给一个单独的MapTask来进行处理。默认情况下,Split和Block的大小是一致的。 切片之后,每一个切片(Split)会分配给一个单独的MapTask来处理。而MapTask确定好要处理的切片之后,默认情况下会对切片进行按行处理。需要注意,不同的MapTask之间只是处理的数据不同,但是处理的逻辑是相同的。 MapTask处理完数据之后,会将数据交给ReduceTask进行汇总。Red
资源推荐
资源详情
资源评论
简介
概述
MapReduce 是 Hadoop 提供的一套用于进行分布式计算的模型,本身是 Doug
Cutting 根 据 Google 的 <MapReduce: Simplified Data Processing on
Large Clusters>仿照实现的。
MapReduce 由两个阶段组成:Map(映射)阶段和 Reduce(规约)阶段,用户
只需要实现 map 以及 reduce 两个函数,即可实现分布式计算,这样做的目的是
简化分布式程序的开发和调试周期。
特点
MapReduce 的优点:
1)MapReduce 易于编程:用户只需要简单的实现 MapReduce 提供的一些接
口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机
器上运行。
2)具有良好的扩展性:当当前的集群的计算资源不能得到满足的时候,可以
通过简单的增加机器来扩展它的计算能力。
3)高容错性:MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器
上,这就要求它具有很高的容错性。例如,如果集群中某一台服务器宕机,那么
MapReduce 可以把上面的计算任务转移到另外一个节点上运行,不至于这个任
务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。
4)适合 PB 级以上海量数据的离线处理:可以实现上千台服务器集群并发工
作,提供数据处理能力。
MapReduce 的缺点:
1)不擅长实时计算:MapReduce 的运行速度相对比较低,一般在毫秒或者秒
级内返回结果,因此不适合于实时分析的场景。
2)不擅长流式计算:流式计算的输入数据是动态的,而 MapReduce 要求输
入的数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决
定了数据源必须是静态的。
3)不擅长 DAG(有向图)计算:多个应用程序存在依赖关系,后一个应用程序
的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用
后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,
导致性能非常的低下。
入门案例
思路
案例:统计一个文件中每一个字符出现的次数(处理文件:characters.txt)。
在 MapReduce 刚开始的时候,会先对文件进行切片(Split)处理。需要注意
的是,切片本身是一种逻辑切分而不是物理切分,本质上就是在划分任务量,之
后每一个切片会交给一个单独的 MapTask 来进行处理。默认情况下,Split 和
Block 的大小是一致的。
切片之后,每一个切片(Split)会分配给一个单独的 MapTask 来处理。而
MapTask 确定好要处理的切片之后,默认情况下会对切片进行按行处理。需要注
意,不同的 MapTask 之间只是处理的数据不同,但是处理的逻辑是相同的。
MapTask 处 理 完 数 据 之 后 , 会 将 数 据 交 给 ReduceTask 进 行 汇 总 。
ReduceTask 收到数据之后,会先将相同的键对应的值放到一组去,形成一个迭
代器,这个过程称之为分组(group)。分组之后,再调用 reduce 方法对数据进
行汇总处理,最终将处理结果写出到指定的文件系统中。
实现过程
导入 POM 依赖:
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!--日志打印-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!--Hadoop 通用包-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.4</version>
</dependency>
<!--Hadoop 客户端-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.4</version>
</dependency>
<!--Hadoop HDFS-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
定义 Mapper 类:
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
// 需要继承 Mapper 类
// 需要注意的是,MapReduce 要求被处理的传输的数据能够被序列化
// MapReduce 提供了一套单独的序列化机制
// KEYIN - 输入的键的类型。默认情况下,是行的字节偏移量
// VALUEIN - 输入的值的类型。默认情况下,是输入的一行数据
// KEYOUT - 输出的键的类型。本案例中,输出的是字符,所以类型是 Text
// VALUEOUT - 输出的值的类型。本案例中,输出的是个数,所以类型是 LongWritable
public class CharCountMapper extends Mapper<LongWritable, Text, Text,
LongWritable> {
// 次数
private final LongWritable once = new LongWritable(1);
// 需要覆盖 map 方法,将处理逻辑放入 map 方法中
// key:键。行的字节偏移量
// value:值,读取的一行数据
// context:环境参数,可以利用这个参数将数据传递给 ReduceTask
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable,
Text, Text, LongWritable>.Context context) throws IOException,
InterruptedException {
// 获取一行数据
String line = value.toString();
// 拆分字符
char[] cs = line.toCharArray();
// 遍历数据,写出
for (char c : cs) {
context.write(new Text(String.valueOf(c)), once);
}
}
}
定义 Reducer 类:
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
// 需要继承 Reducer
// KEYIN,VALUEIN - 输入的键值类型。Reducer 的数据从 Mapper 来,所以 Mapper 输出
什么类型,Reducer 就接收什么类型
// KEYOUT,VALUEOUT - 输出的值的类型。本案例中,输出的是字符和次数
public class CharCountReducer extends Reducer<Text, LongWritable, Text,
LongWritable> {
// 覆盖 reduce 方法,将逻辑写到 reduce 方法中
// key:键。本案例中,是字符
// values:值。本案例中,是字符对应的次数
剩余57页未读,继续阅读
资源评论
ZikH~
- 粉丝: 432
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功