推荐大象教程,介绍Hadoop、HDFS、MapReduce架构和工作原理相对来说非常的清晰。其内容是与《Hadoop the Definitive Guide》基本一致的。讲解的很细致、细节,又带了一些个人的理解和举例子,比较易懂,是比Hadoop官网更值得一看的入门教程。

Hadoop 教程 | Hadoop 教程

HDFS 教程 | HDFS 教程

MapReduce 教程 | MapReduce 教程

或者 51CTO的这个Hadoop专题系列文章:

https://blog.51cto.com/u_12279910/category14/p_1

中文名称/问题基本概念理解/名词解释/个人理解和举例备注
reducer个数怎么计算?

Hive是按照输入的数据量大小来确定reducer个数的。可以通过hadoop fs -count 命令来计算输入量大小。

属性 hive.exec.reducers.bytes.per.reducer的默认值是1GB。所以对于处理一天的分区量 2742992546字节的数据就需要reducer个数 =2742992546 bytes/(1024*1024*1024 byte) = 3个。若设置每个reducer处理字节数少一些,如 set hive.exec.reducers.bytes.per.reducer=750000000(即750MB),则需要reducer个数4个。

当然,有些情况下map阶段会产生比实际输入数据量更多的数据,那么根据原输入数据量来确定reducer个数就会显得少了。同样,如果map阶段过滤掉很多数据,其实也用不到那么多的reducer了。

我们可以设置将reducer个数设置为一个固定的值,无需hive来计算得到这个值。比如 set mapred.reduce.tasks= 3 。这需要在实践中结合业务去看到底设大还是设小才能真正的缩短执行时间。

设置hive.exec.reducers.max来防止任务效果太多的reducer资源,毕竟资源是固定有限的。建议计算公式为(集群总reduce资源个数*1.5经验系数)/(执行中的查询的平均个数)

MapReduce 键值42992546对,什么时候需要自己来定义和处理? 平时拉取数据的时候并没有定义key使用 Hadoop 的时候,键和值并非是数据的固有属性,它只是在对数据做分析时人为选择的一种策略。MapReduce 把处理过程分成两个阶段:Map 阶段和 Reduce 阶段。每个阶段的输入数据和输出数据都是以键值对的形式出现。
1、当模式是静态的时候,我们可以直接使用模式的列,比如Hive表。
2、如果模式是非静态的,就不能用列的,因为没有列的概念了,只能使用键和值来处理数据。比如自己写MapReduce处理方法。

参考博文:https://blog.51cto.com/

u_12279910/category14/p_2

MapReduce 框架是怎么生成键值对的??

InputSplit(拆分键值对) 和RecordReader(存储的就是键值对)相互交互,将数据转成键值对的形式。

MapReduce 过程中,在数据传输给 mapper 之前,数据首先被转换成键值对,因为 mapper 只能处理键值对形式的数据。
Hadoop MapReduce 生成键值对的过程如下:
(1)InputSplit:这个是数据的逻辑表示形式。单个独立的 Mapper 处理的数据就是由 InputSplit 提供的。
(2)RecordReader:它和 InputSplit 交互,并且把数据分片转换成适合 Mapper 读取的记录,这里的记录其实就是数据的键值对形式。默认情况下,RecordReader 使用 TextInputFormat 把数据转换成键值对。RecordReader 和 InputSplit 的交互直到文件读取完成才停止。


在 MapReduce 框架里面,map 函数处理某个键值对并发出一定数量的键值对,Reduce 函数处理按相同键分组的值,并发出另一组键值对作为输出。map 的输出类型应该和 reduce 的输入类型一致。比如:
Map: (K1, V1) -> list (K2, V2)
Reduce: {(K2, list (V2 }) -> list (K3, V3)
K2,V2 数据类型是要保持一致的。
 
Hadoop 中生成键值对需要依赖什么?Hadoop 中键值对的生成取决于数据集和所需的输出。通常,键值对在4个位置指定:Map 输入、Map 输出、Reduce 输入和 Reduce 输出。
1、Map 输入
map 输入默认把数据文件的行数为键(key),数据行对应的内容作为。可以对 InputFormat 进行定制化开发,可以修改这个默认设置。
2、Map 输出
Map 主要负责过滤数据,并为数据基于键分组提供基础。
Key:它可能是字段、文本、对象,Reducer 端会根据 Key 对数据做分组和聚合。
Value:它可能是字段、文本、对象。它会被单独的 reduce 函数处理。
3、Reduce 输入:Map 的输出作为 Reduce的输入,也就是说,Reduce 的输入数据和 Map 输出数据是一样的。
4、Reduce 输出: 这个取决于所需要的输出是怎么样的。
MapReduce 键值对举例
假如有个存储在 HDFS 的文件的内容如下:
John is Mark Joey is John
1.利用 InputFormat,我们就可以知道这个文件是怎么被分片和读取的。默认情况下,RecordReader 使用 TextInputFormat 把这个文件转换成键值对数据。
Key:这个是键值对的键,它是数据行的偏移量(行号)。
Value:值就是数据行具体内容,不包含行终止符。

根据上文件的内容,具体的 Key 和 Value 的内容如下:
Key 是 0
Value 是 John is Mark Joey is John

Hadoop工作原理Hadoop系列之Hadoop工作原理(2)_51CTO博客_hadoop【 
Yarn的职责是什么?
它的直接下属是谁?
为什么这个团队里需要有这么个角色?
它的工作或管理技能手段是什么?
Yarn 一个资源管理系统,其作用就是把资源管理和任务调度/监控功分割成不同的进程。Yarn 有一个全局的资源管理器叫 ResourceManager,每个 application 都有一个 ApplicationMaster 进程。一个 application 可能是一个单独的 job 或者是 job 的 DAG (有向无环图)。

在 Yarn 内部有两个守护进程,分别是 ResourceManager 和 NodeManager。ResourceManager 负责给 application 分配资源,而 NodeManager 负责监控容器使用资源情况,并把资源使用情况报告给 ResourceManager。这里所说的资源一般是指CPU、内存、磁盘、网络等。