hadoop知识点总结(一)hadoop架构以及mapreduce工作机制
阅读原文时间:2023年07月11日阅读:1

1,为什么需要hadoop

数据分析者面临的问题

数据日趋庞大,读写都出现性能瓶颈;

用户的应用和分析结果,对实时性和响应时间要求越来越高;

使用的模型越来越复杂,计算量指数级上升。

期待的解决方案

解决性能瓶颈,在可见的未来不会出现新瓶颈之前的技术可以平稳过渡,如SQL;

转移成本,如软硬件成本,开发成本,技能培养成本,维护成本

2,关系型数据库和MapReduce的比较:

传统关系型数据库

MapReduce

数据大小

GB

PB

访问

交互式和批处理

批处理

更新

多次读写

一次写入多次读写

结构

静态模式

动态模式

完整性

横向扩展

非线性

线性

3,Hadoop 的优势与特点:

  (1)Hadoop基于Java开发,为应用程序提供一组稳定可靠的API接口,实现具有高可靠性和良好扩展性的分布式系统,运行于大量廉价硬件设备组成的集群系统上。

  (2)分布式文件系统(HDFS):针对大规模数据的高容错性和高吞吐的分布式文件系统;它可以构建从几台到几千台由常规服务器组成的集群中,并提供高聚合输入输出的文件读写访问。

  (3)并行计算框架(MapReduce):适用于大数据量处理的分布式框架,是为离线数据分析而设计,利用数据的并行性进行分布运算,而后汇总结果的计算框架。

  (4)NameNode是一个中心服务器,负责管理文件系统的namespace和客户端对文件的访问;Datanode在集群中会有多个,一般是一个节点存在一个,负责管理其自身节点上它们附带的存储。在内部,一个大文件分成一个或多个block,这些block存储在Datanode集合里。Namenode执行文件系统的namespace相关操作,例如打开、关闭、重命名文件和目录,同时决定了Block到具体Datanode节点的映射。Datanode在Namenode的指挥下进行block的创建、删除和复制工作。

  单一节点的Namenode大大简化了系统的架构。Namenode负责保管和管理所有的HDFS元数据,因而在请求Namenode得到文件的位置后就不需要通过Namenode参与而直接从Datanode进行。

  (5)分布式数据库(HBase):是一个分布式的、按列存储的、多维表结构的实时分布式数据库,它可以提供大数据量架构化和非结构化数据高速读写操作,为高速在线数据服务而设计。

支持每秒数万条级别的高速并发写入和高速查询;可扩展,数据自动切分和分布,可动态扩容,无需停机;数据存放在HDFS文件系统上,不会丢失;灵活的表结构,可动态增加或改变;面向列,可压缩,有效降低磁盘I/O,提高磁盘利用率。多维表,四个维度,其中三个维度可变,适合描述复杂嵌套关系。

  (6)并行计算框架(MapReduce):适用于大数据量处理的分布式框架,是为离线数据分析而设计,利用数据的并行性进行分布运算,而后汇总结果的计算框架。

将任务拆分、分布、汇总,开发人员只需要实现业务逻辑;分布任务自动失败重试,单个任务失败不会造成整个任务退出;和HDFS整合,使计算移到数据所在的节点运行。…

4,hadoop体系下的分析手段

  主流:Java 程序

  轻量级的脚本语言:Pig 

  SQL技巧平稳:Hive

  NoSQL:Hbase

5,hadoop的定义

  Hadoop是Apache软件基金会旗下的一个开源分布式计算平台(框架)——Nutch

  包含HDFS和MapReduce两大核心模块

  为用户提供系统底层细节透明的分布式基础架构。

6,hadoop项目结构

    

7,hadoop各个节点角色的划分:

   1)hadoop1.x

Hadoop角度:Master(主结点)和Slave(从结点)

   HDFS角度:NameNode和DataNode

   MapReduce角度:JobTracker和TaskTracker

2)hadoop 2.x

HDFS角度:NameNode和DataNode

YARN角度:nodemanager和ResourceManager

8,nameNode和dataNode的特点及作用,(详细可以参考我的另外一篇文章)NameNode和DataNode详细解说

  1)NameNode

作用——HDFS的守护程序;记录文件如何分割成数据块的,以及这些数据块被存储到哪些节

点上;对内存和I/O进行集中管理,负责文件元数据的操作.Namenode是主节点,存储

文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限)

以及每个文件的块列表,以及块所在的DataNode等等。

特点——单点(一个集群只有唯一一个NameNode),因此发生故障将使集群崩溃.

  2)DataNode

介绍:-----Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检

索数据,并且定期向namenode发送他们所存储的块(block)的列表。

作用----- 负责把HDFS数据库读写到本地文件系统,提供真实文件数据的存储服务。

          特点:——多点(一个集群可以有多个datanode),因此发生故障将使集群崩溃.

9。SecondaryNamenode介绍

     监控HDFS状态的辅助后台程序

     每个集群可以有一个或多个

     与NameNode进行通讯,定期保存HDFS元数据快照

     当NameNode故障可以作为备用NameNode 使用

JobTracker介绍

    用于处理作业(用户提交代码)的后台程序

    决定有哪些文件参与处理,然后切割task并分配节点

    监控task,重启失败的task

    每个集群只有唯一一个JobTracker,位于Master节点

TaskTracker介绍

    位于slave节点上,与DataNode结合(代码与数据一起)

    管理各自节点由JobTracker分配的Task

    每个节点只有一个TaskTracker,一个TaskTracker可以启动多个JVM,来并行执行     map或reduce任务

    与JobTracker交互

问题:1,什么是Hadoop,你理解中的Hadoop是什么,请举例说明?

   2,请阐述Hadoop架构中各个进程的作用?

MapReduce编程模型:

  在Hadoop中,每一个MapReduce任务都被初始化为一个Job。

  每一个Job又可以分为两个阶段:

  Map:Map函数,接收一个形式的输入,然后产生同样为形式的   中间输出;

  Reduce:Reduce函数接收一个形式的输入,然后对这个value 集合进行处理并输出结果。

10,数据预处理与输入分片的大小

MapReduce任务擅长处理少量的大数据

若是大量的小数据,则选择先对数据进行一次预处理,将数据合并以提高MapReduce任务  的执行效率。

或当一个Map任务运行只需几秒时,考虑多分配些数据,让其处理

通常,一个Map任务运行60秒左右是比较合适的

11,  Map和Reduce任务的数量

Map/Reduce任务槽:这个集群能够同时运行的Map/Reduce任务的最大数量。

任务槽帮助对任务调度进行设置。

设置Map数量主要参考Map运行的时间,设置Reduce任务的数据量参考任务槽的设置,即Reduce任务数是任务槽的0.95或1.75倍。

12,Combine函数   用于本地合并数据的函数。

作用:某些数据在本地会产生很多相同重复的数据,若此时一个一个传递给Reduce任务是非常耗时的;因此,MapReduce框架运行Combine函数用于本地合并,这会大大减少IO操作的消耗。合理设计该函数能有效减少网络传输的数据量,提高MapReduce的效率。

13,  压缩:对Map的中间结果输出和最终结果输出,进行压缩

作用:减少网络传输。有副作用,请根据实际情况来选择。

14, 自定义Comparator 自定义Hadoop数据类型,以实现更加复杂的目的

作用:节省数据序列化和反序列化的时间。

MapReduce工作机制

1.JobConf常用可定制参数

参数

作用

缺省值

其他实现

InputFormat

将输入的数据集切割成小数据集InputSplits,每一个InputSplits将由一个Mapper负责处理。此外,InputFormat提供一个RecordReader的实现,将一个InputSplits解析成对提供给map函数

TextInputFormat(针对文本文件,按行将文本文件切割成InputSplits,并用LineRecordReader将InputSplits解析成对,key是行在文件中的位置,value是文件中的一行)

SequenceFileInputForm

SequenceFileInputForm

提供一个RecordWriter的实现,负责输出最终结果

TextOutputFormat(用LineRecordWriter将最终结果写成纯文本文件,每个对一行,key和value之间用tab分隔)

SequenceFileOutputForm

OutputKeyClass

输出的最终结果中key的类型

LongWritable

OutputValueClass

输出的最终结果中value的类型

Text

MapperClass

Mapper类,实现map函数,完成输入的到中间结果的映射

IdentityMapper(将输入的原封不动的输出为中间结果)

LongSumReducer,

LogRegexMapper,

InverseMapper

CombinerClass

实现combine函数,将中间结果中的重复key做合并

Null(不对中间结果中的重复key做合并)

ReducerClass

实现reduce函数,对中间结果做合并,形成最终结果

IdentityReducer(将中间结果直接输出为最终结果)

AccumulatingReducer,LongSumReducer

InputPath

设定Job的输入目录,Job运行时会处理输入目录下的所有文件

Null

OutputPath

设定Job的输出目录,Job的最终结果会写入输出目录之下

Null

MapOutputKeyClass

设定map函数输出的中间结果中key的类型

如果用户没有设定,使用OutputKeyClass

MapOutputValueClass

设定Map函数输出的中间结果中value的类型

如果用户没有设定,使用OutputValueClass

OutputKeyComparator

对结果中的key进行排序时,使用的比较器

WritableComparable

PartitionerClass

对中间结果key排序后,用Partition函数将其划分为R份,每一份由一个Reducer负责处理。

HashPartitioner(使用Hash函数做partition)

KeyFieldBasedPartitioner

PipesPartitioner

2, Hadoop运行MapReduce作业的工作原理

(1)作业的提交

  作业提交后,用户不能对作业进行修改,只能监控或强制终止;

在作业提交之前,用户需做好所有参数的配置工作。(配置工作包括:

程序代码map和reduce,Map和Reduce接口的配置,配置四个参数;

Map接口的输出类型和Reduce接口的输入类型一致;输入输出路径

必须保证输出路径下不存在该文件夹;其他类型设置)

(2)作业的初始化

  当JobTracker接收到对其submitJob()方法的调用后,会把此调用放入一个内部的队列中,交由作业调度器进行调度,并对其进行初始化;初始化包括创建一个表示正在运行作业的对象,封装任务和记录信息,以便跟踪任务的状态和进程。

  初始化步骤:作业调度器从HDFS中读取已经计算好的输入分片   信息;

  为每个分片创建一个map任务; 

  创建Reduce任务的数量根据输入数据划分信息来设定个数;

  调度器创建相应数量的要运行的Reduce任务;

  任务在此时被指定ID。

(3)任务分配

  TaskTracker和JobTracker之间的通信和任务的分配是通过“心跳”机制来完成的。

(4)任务执行

  通过从HDFS中把作业的JAR文件复制到taskTracker所在的文件系统,从而实现作业的JAR文件本地化;

  taskTracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘;

  taskTracker为任务新建一个本地工作目录,并把JAR文件中的内容解压到这个文件夹下;

  taskTracker新建一个TaskRunner实例来运行该任务。

(5)进度和状态的更新

当提交作业后,Hadoop会进入完全自动化的执行过程;但用户往往需要能够知晓作业的运行状态;

因此,任务在运行时,对其进度(任务完成百分比)保持追踪,对于用户来说是非常重要的。

(6)作业的完成

当JobTracker收到作业最后一个任务已完成的通知后,便把作业的状态设置为“成功”;

在JobClient查询状态时,便知道任务已成功完成,于是JobClient打印一条消息告知用户,然后从runJob()方法返回;

最后,JobTracker将清空作业的工作状态,指示taskTracker也清空作业的工作状态。

(7)失败:在实际情况下,用户代码存在软件错误,进程会崩溃,机器会产生故障。

3,shuff和排序

MapReduce确保每个Reduce的输入都按键排序;

系统执行排序的过程——将map输出作为输入传给Reduce——称为shuffle;

Shuffle属于不断被优化和改进的代码库的一部分,提出它的目的只有一个——出于效率的考虑进行预排序;Shuffle是MapReduce的“心脏”,是奇迹发生的地方

(1)Shuffle过程在Map端,对Map的结果进行划分,排序,分割,将属于同一个划分的输出,合并在一起,并写入磁盘,按照不同的划分将结果发送给对应的Reduce。Map输出的划分与Reduce的对应关系由JobTracker确定。

(2)在写磁盘过程中,map函数的输出继续被写到缓冲区,但如果此期间缓冲区被填满;Map任务必须等待,直到写磁盘过程完成;写磁盘将按轮询方式写到指定作业的特定子目录中的目录中。

(3) Shuffle过程在Reduce端分成三个阶段:复制Map输出、排序合并以及Reduce处理.

1) 复制Map输出:Map输出文件位于运行Map任务的tasktracker的本地磁盘;

现在,tasktracker需要为分区文件运行Reduce任务;Reduce任务需要集群上若干个Map任务的Map输出,作为其分区文件;每个Map任务的完成时间可能不同,因此只要有一个任务完成,Reduce任务就开始复制其输出;这就是Reduce任务的复制阶段。

2) 排序合并:在Reduce复制Map的输出结果的同时,Reduce任务进入排序合并阶段;

此阶段重点是合并,因为排序在map端进行;该阶段的任务是将从各个MapTaskTracker上复制的Map输出文件进行整合,并维持数据原来的顺序.

3) Reduce处理: Reduce端的最后阶段就是对合并的文件进行Reduce处理。

4,配置的调优

在shuffle这一过程中,完成单位任务使用时间最多的一般都是IO操作;总的原则是给shuffle过程尽量多的提供内存空间;但一定要保证Map函数和Reduce函数能有足够的内存来运行;运行Map任务和Reduce任务的JVM,内存大小由mapred.child.java.opts属性来设置。

在map端,可以通过避免多次溢出写磁盘来获得最佳性能;通过合理的设置io.sort.*属性来减少这种情况下的溢出写次数;具体来说,如果可以,应增加io.sort.mb的值。

在reduce端,中间数据全部驻留在内存中,就能获得最佳性能;一般,此情况是不可能发生的;若reduce函数的内存需求不大,可把mapred.inmem.merge.threshold设置为0,把mapred.job.reduce.input.buffer.percent设置为1.0,或更小值,则会带来性能的提升。