Hadoop生态圈小贴士
小贴士为你带来hadoop生态圈常用组件的基本原理,方便看官快速理解组件基本原理,构造hadoop生态圈的全貌。
一、MapReduce的工作原理
MapReduce的工作原理,简单来说就是下面一幅图,
1-MapReduce简单工作原理map函数接收一个<key,value>的输入,同样产生<key,value>的输出。Hadoop中的有玄学意味的shuffle阶段将具有相同中间key值的value集合到一起传递给reduce函数,reduce函数接受一个如<key,(list of values)>的输入,对value的集合进行处理,输出同样为<key,value>形式。那么其具体的工作流程如何呢?请看下图,
2-MapReduce具体工作流程客户端:(1)从JobTrack中获取当前作业ID(2)检查作业的相关路径(3)计算作业的划分,并将划分信息写入job.split文件(4)将运行所需要的资源复制到对应的HDFS上(5)调用JobTracker对象来真正提交作业
JobTracker:(1)读取客户端在第3步中的job.split(2)创建对应的map和reduce任务(3)创建两个初始化的task,注意会根据TaskTracker在网络中的位置,选择一个距离此TaskTracker map任务最近的输入划分文件给该TaskTracker
TaskTracker:(1)执行任务(2)更新任务执行进度和状态(3)通过心跳监测向JobTrack汇报状态
如何对mapreduce进行优化呢?主要根据执行的过程,从计算性能和IO操作上进行优化,(1)任务调度时,优先将任务分配给空闲的机器,同时会尽量将map任务分配给InputSplit所在的机器,以减少网络I/O的消耗(2)更加善于处理少量的大数据(3)设置map任务的数量时,主要参考map的执行时间,设置reduce任务时,基于不同的考虑,通常是任务槽的0.95倍和1.75倍(4)map函数产生的中间数据有很多重复的数据,利用combine函数进行本地数据的合并(5)可以针对map的输出和最终的输出结果进行压缩
众多周知,Hadoop具有很强的容错性,具体体现在两方面,(1)硬件故障,当JobTracker发生故障时,通过领导选举算法从备用的JobTracker中选择新的主JobTracker,当TaskTracker发生故障时,如果是map任务则重新执行,如果是reduce任务,则分配新的TaskTracker完成未完成的任务;(2)任务失败,JobTracker接收到TaskTracker的任务失败通知时,通过重置任务状态,将其加入到调度队列来重新分配任务执行,尝试4次仍没有完成,作业就失败了
插张图,休息片刻,想起了《无问西东》中的那句,如果提前了解你所要面对的人生,你是否还会有勇气前来?希望自己永葆童心,简单充实......
1-无问西东二、HDFS的工作原理
HDFS便于进行流式数据访问和处理超大文件,那么该如何设计满足此要求呢?逻辑块横空出世,和操作系统中的文件块类似,是一个抽象的概念,是文件存储处理的逻辑单元。逻辑块有以下优势,(1)通过将超大文件分成众多块,存储到不同的机器上,实现大文件存储(2)简化存储子系统,固定大小的块,简化存储系统的管理,尤其是元数据信息和文件块内容可以分开存储(3)有利于分布式文件系统中复制容错的实现。
HDFS中有两类节点,NameNode和DataNode。NameNode管理文件系统的命名空间,从中可以获得每个文件的每个块的DataNode,这些信息不是永久保存,NameNode在每次启动时动态地重建这些信息。DataNode用来执行具体的任务,存储文件块,被客户端和NameNode调用,同时基于心跳定时向NameNode发送存储的文件块信息。
从下图,我们学习HDFS的体系结构,
1-HDFS的体系结构在此,我们主要关注DataNode的副本存放策略和NameNode的节点安全问题。副本存放策略,主要考虑数据的可靠性和读写的性能。将副本存放在一个机架上,读取数据时不能充分利用带宽,提高写的效率,也不同保证数据的可靠性(节点故障)。将副本存放在不同的机架上,数据读取时,可以充分利用带宽,但是写操作效率低下,可以保证数据的可靠性。HDFS的存放策略中,副本系数默认是3,将一个副本放在不同机架的节点上,另一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。这一策略在不损害数据可靠性和读取性能的情况下改进了写操作。
NameNode启动后会进入一个称为安全模式的特殊状态,当NameNode检测确认某个数据块的副本数目达到最小值时,该数据块被认为是副本安全的;在一定百分比的数据块被NameNode检测安全后,其将退出安全模式状态。NameNode容易产生单点故障,主要通过将NameNode中的元数据转储到远程的NFS文件系统中,或者同步运行一个Secondary NameNode。
三、HBase的基本原理
HBase的表和关系型数据库一致,由行和列构成。不同的是,HBase中的列组成列族,且至少有一个列族,y以user表为例,其物理存储如下图所示,
1-HBase的物理存储那么似乎和Mysql中的存储相似,如何体现其巨大威力呢?我们来看其逻辑模型,
2-HBase的逻辑模型行键类似于Mysql中的主键,保证数据存储的唯一性,info构成其列族,列族中包含name、email和passwordd列,被称为列限定符。同时,HBase记录操作的时间戳。可以视为,以行键、列族、列限定符和时间戳为键,以单元内容为值进行存储。那么既然是分布式的数据库,其如何进行读写操作呢?下面一起来看看写操作,
3-HBase的写操作MemStore是内存里面的写入缓冲区,累积填满后书写到硬盘上,生成一个HFile。WAL是预写入日志,每台服务器都维护一个WAL来记录发生的变化。如果MemStore没有刷写到硬盘上,服务器就崩溃了,可以根据WAL中记录的变化,恢复数据,有点类似于Mysql中的binlog日志。读操作呢?HBase可以快速访问数据,其在读操作上使用了LRU(最近最少使用算法)缓存技术,也称为BlockCache,和MemStore在一个JVM堆里,用来保存从HFile里读入内存的频繁访问的数据,如下图所示,
4-HBase的读操作HBase是列式存储数据库,每一个列族有自己的HFile文件,意味着当执行读操作时,HBase不需要读取一行的数据,只需要读取用到的列族数据,有利于稀疏数据的高效存储和快速读取,如下图所示,
5-HBase列式存储