3,剖析
MapReduce
程序
<1>hadoop的数据类型
实现Writable
接口额类可以是值,而实现
WritableComparable
接口的类既可以是键也可以是值。
以下这些是常用的数据类型,均用于实现WritableComparable
借口:
BooleanWritable
ByteWritable
DoubleWritable
FloatWritable
IntWritable
LongWritable
Text
使用UTF8
格式的文本封装
NullWritable
无键值时的占位符
也可以自定义数据类型,但要实现Writable
接口或者
WritableComparable
接口。
<2>Mapper
一个类要作为mapper
,需要继承
MapReduceBase
基类和实现
Mapper
借口。
mapper和
reducer
的基类均为
MapReduceBase
,它包含类的构造和解构方法:
void configure(JobConf job);该函数提取
XML
配置文件或者应用程序主类中的参数,在数据处理之前调用该函。
void close();作为
map
任务结束前的最后一个操作,该函数完成所有的结尾工作,如关闭数据库、打开文件等。
Mapper借口负责数据处理阶段,采用的形式是
Mapper<K1,V1,K2,V2>java
泛型,键类和值类分别实现
WritableComparable
和
Writable
借口。
Mapper只有一个方法
map
用于处理一个单独的键值对。
void map(K1 key,V1 value,OutputCollector<K2,V2> output,Reporter reporter)
该函数处理一个给定的键值对(K1,V1),
生成一个键值对
(K2,V2)
的列表。
OutputCollector接收这个映射过程的输入。
Reporter 可提供对
Mapper
相关附加信息的记录,形成任务进度。
Hadoop预定义的
Mapper
的实现
:
IdentityMapper<K,V>
|
实现Mapper<K,V,K,V>
就输入直接映射到输出
|
InverseMapper<K,V>
|
实现Mapper<K,V,K,V>
发转键值对
|
RegexMapper<K>
|
实现Mapper<K,Text,Text,LongWritable>,
为每个常规表达式的匹配项生成一个
(mathc,1)
对
|
TokenCountMapper<K>
|
实现Mapper<K,Text,Text,LongWritable>,
当输入的值为分词时,生成一个
(token,1)
对
|
<3>Reducer
reducer的实现也必须继承
MapReduceBase
类和实现
Reducer
接口。
Reducer接口只有一个方法,及时
reduce:
Void reduce (K2,key,Iterator<V2> values,OutputCollector<K3,V3> output,Reporter r)
Reducer任务接收来自各个
mapper
的输出时,按照键对输入数据进行排序,并将相同的键的值归并,然后调用
reduce
函数,并通过迭代处理那些与指定键相关联的值,生成一个列表
<K3,V3>
OutputCollector接收
reduce
阶段的输出,并写入输出文件。
Reporter 可提供对
Mapper
相关附加信息的记录,形成任务进度。
Hadoop预定义的
Reducer
的实现
:
IdentityReducer<K,V>
|
实现Reducer<K,V,K,V>
,将输入直接映射到输出
|
LongSumReducer<K>
|
实现<K,LongWritable,K,LongWritable>,
计算与给定键相对应的所有值的和
|
<4>Partitioner:重定向
Mapper
输出
其实在mapper
和
reducer
之间有一个非常重要的环节,就是将
mapper
的结果输出给不同的
reducer
,这就是
Partitioner
的工作:(此工作常被称为:
洗牌
)
一般reducer
是多个,那么
mapper
应该将键值的输出给谁呢?
Hadoop
默认的机制是对键进行散列来确定
reducer
,
Hadoop
通过
HashPartitioner
类强制执行此策略。但是有的时候
HashPartitioner
会使得程序出错,即他的分发策略不符合实际的要求,那么此时就需要我们定制自己的
Partitioner
:
(
例如针对自定义的数据类型
Edge)
public
class
EdgePartitioner
implements
Partitioner<Edge,Writable>
{
@override
public
int
getPartition(Edge key,Writable value,
int
numPartitions)
{
return
key.getDepartureNode().hashCode() % numPartitions;
}
@override
public
void
configure(JobConf conf)
{
}
}
|
自己定制的Partitioner
只需要实现
getPartition
方法和
configure
方法即可。前者将
Hadoop对作业的配置应用在
Partitioner上,而后者返回一个介于
0
和
reducer
任务数之间的整数,指向键值对要发送到的
reducer
。
Partitioner的形象的表达:(如下图)
<5>Combiner
:本地
reduce
在分发mapper
之前先做一下“本地
reduce
”,也被成为合并,后面详细讲述。
<6>预定义
Mapper
和
Reducer
使用预定义Mapper
和
Reducer
改写前面的统计单词数量的程序:
WordCount2.java
public
class
WordCount2 {
public
static
void
main(String args[])
{
JobClient client =
new
JobClient();
JobConf conf =
new
JobConf(WordCount2.
class
);
FileInputFormat.addInputPath(conf,
new
Path(args[0]));
FileOutputFormat.setOutputPath(conf,
new
Path(args[1]));
conf.setOutputKeyClass(Text.
class
);
conf.setOutputValueClass(LongWritable.
class
);
conf.setMapperClass(TokenCountMapper.
class
);
//hadoop自己的TokenCountMapper
conf.setCombinerClass(LongSumReducer.
class
);
//hadoop自己的LongSumReducer
conf.setReducerClass(LongSumReducer.
class
);
client.setConf(conf);
try
{
JobClient.runJob(conf);
}
catch
(Exception e)
{
e.printStackTrace();
}
}
}
|
分享到:
相关推荐
### Hadoop完全分布式集群搭建详解 #### 一、概述 Hadoop是一款开源的大数据处理框架,主要用于处理海量数据...通过这些步骤,可以成功搭建一个功能完备的Hadoop分布式集群,为后续的大数据分析任务提供坚实的基础。
在这个版本中,CDH5.4.3基于Hadoop的核心版本2.6.0,包含了多个关键组件,如HDFS、MapReduce、YARN、HBase、Hive等。 1. **Hadoop分布式文件系统(HDFS)**:HDFS是Hadoop的核心组件,设计为运行在廉价硬件上,提供...
反思实践,整理学习笔记课后作业(1) 在职教云平台上完成相关练习题(2) 写一篇关于 Hadoop 集群搭建的心得体会教师讲解职教云教师:布置作业,提供指导学生:深入思考,完成作业 【知识点详解】 Hadoop 是一个开源...
它主要由两个核心组件构成:Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS为数据提供了高容错性的分布式存储,而MapReduce则用于分布式计算,使得大数据处理变得高效且可靠。 **Hadoop配置**是使用...
6. 测试Hadoop集群:通过hadoop fs -ls 命令检查HDFS是否正常运行,或运行一个简单的MapReduce程序验证计算功能。 四、Hadoop实战应用 1. 数据备份与恢复:Hadoop可以作为企业的数据备份系统,利用其分布式特性...
《Hadoop 2.6.0-cdh5.4.3 源码解析与学习笔记》 在当今大数据处理领域,Hadoop 是一个至关重要的开源框架,它为大规模数据处理提供了分布式计算的能力。本资料主要针对 Hadoop 2.6.0-cdh5.4.3 版本进行源码阅读,...
这些笔记可能包括了对Hadoop核心组件的深度解析,如HDFS(Hadoop分布式文件系统)和MapReduce计算框架,以及可能涵盖YARN(Yet Another Resource Negotiator)资源调度器的使用。 【标签】"hadoop" 明确了这个...
Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce。HDFS是一个分布式文件系统,可以存储海量数据并提供高吞吐量的数据访问能力;而MapReduce则是一种编程模型,用于处理和生成大规模数据集的...
它的核心由两个主要组件组成:Hadoop Distributed File System (HDFS) 和 MapReduce。 2. **HDFS(Hadoop分布式文件系统)**: HDFS是一种高度容错性的文件系统,旨在运行在廉价的硬件上。它将大文件分割成块并...
这个学习资料包含的"笔记"可能涵盖了Hadoop的核心组件、生态系统、安装配置以及实际操作等多个方面。以下是对Hadoop 3.1.3的一些关键知识点的详细说明: 1. **Hadoop核心组件**: - **HDFS(Hadoop Distributed ...
- **hadoop笔记.ppt**:这可能是一个PPT形式的学习笔记,整理了Hadoop的关键概念、核心组件的工作原理以及一些实例分析。 总之,Hadoop作为一个强大的分布式计算框架,对于大数据处理和分析有着至关重要的作用。...
2. Hadoop组件: - HDFS(Hadoop Distributed File System):Hadoop的核心组成部分之一,是一个分布式文件系统,具备高容错性和高吞吐量,用于存储大量数据。 - MapReduce:Hadoop的计算引擎,通过将大规模数据集...
Hive通过将SQL查询转换为MapReduce任务运行在Hadoop上,简化了大数据的分析工作,使得非Java背景的分析师也能处理Hadoop集群上的数据。 在“big-data-101-main”这个压缩包中,可能包含了关于如何安装配置这些工具...
2. **HDFS(Hadoop Distributed File System)**:Hadoop的核心组件之一,是一个高容错性的分布式文件系统。HDFS的设计目标是处理PB级别的数据,通过将数据分布在大量的廉价硬件上,实现高可用性和高吞吐量的数据...
3. **Shuffle过程**:"hadoop的shuffle中1和2的不同.jpg"可能解释了MapReduce中的Shuffle阶段,它是数据从Map阶段到Reduce阶段的中间处理步骤,包括分区、排序和合并,确保相同键值的数据聚集在一起。 4. **...
- **Hadoop简介**: 包括Hadoop的历史背景、核心组件介绍(如HDFS、MapReduce等)以及它们如何协同工作。 - **安装指南**: 提供了详细的步骤来指导用户如何在本地或集群环境中安装和配置Hadoop。 - **API文档**: ...
### Hadoop 安装及详细学习笔记 #### Hadoop 概述 Hadoop 是一个能够对大量数据进行分布式处理的软件框架,它旨在提供高扩展性、可靠性和高效性,适用于处理PB级别的数据集。Hadoop 的核心组件包括 HDFS(Hadoop ...
本笔记将深入探讨Hadoop的相关知识点,包括其设计理念、核心组件、工作原理以及实际应用。 一、Hadoop设计理念 Hadoop的设计源于Google的MapReduce论文和GFS(Google文件系统)。它遵循“廉价硬件”和“容错性”的...