【注】本文为搜集整理而成,并非原创,来源见文中链接或图片水印,如有侵权请联系删除。
Hadoop是一个分布式的系统生态
hadoop是一个用java编写的apache开源框架,是一个分布式的解决方案,提供分布式存储和计算。
hadoop框架主要包括四个模块:
hadoop Common:其他hadoop模块所需的java库和实用程序,这些库提供文件系统和操作系统级抽象,并包含启动hadoop所需的java文件和脚本。
hadoop yarn:一个用于作业调度和集群资源管理的框架。
hadoop distribute file system(HDFS):分布式文件系统,提供对应用程序数据的存储及高吞吐量的访问。
hadoop MapReduce:这个是基于yarn的用于并行处理大数据集的系统。
这四个模块的关系图:
其中,重点介绍HDSF及MapReduce
HDFS框架分析:
HDFS是主从结构,master和slave。主要由NameNode、Secondary NameNode、DataNode组成。
NameNode
管理HDFS的名称空间和数据块映射信息,存储元数据与文件到数据块映射的地方。当它运行的时候,这些信息是存在内存中的,但这些信息也可以持久化到磁盘上。
通常为了避免NameNode挂掉文件无法重组,会将Hadoop配置成HA即高可用集群,集群中有两个NameNode节点,一台active主节点,另一台stand-by备用节点,两者数据时刻保持一致。当主节点不可用时,备用节点马上自动切换。
Secondary NameNode
辅助NameNode,分担NameNode工作,紧急情况可辅助会服NameNode,注意它不是NameNode的备份,只是一个助手节点。
详细介绍可参看https://www.cnblogs.com/sddai/p/9281235.html
DataNode
slave节点,实际存储数据、执行数据块的读写并汇报存储信息给NameNode。
Block
一般用户数据存储在HDFS的文件中。文件系统中的文件被分成一个或多个端和 /或存储在各个数据节点中。这些文件段称为块。换句话说,HDFS可以读取或写入的最小数据量称为块。默认块的大小为64MB,但可以根据需要更改HDFS配置来增加。
HDFS文件的读写
文件按照数据块的方式进行存储在DataNode上,数据块是抽象块,作为存储和传输单元,而非整个文件。
文件按照块来存储,屏蔽了文件的概念,简化存储系统的设计,比如100T的文件大于磁盘的存储,需要把文件分成多个数据块进而存储到多个磁盘;为了保证数据的安全,需要备份的,而数据块非常适用于数据的备份,进而提升数据的容错能力和可用性。
数据块的大小设置要合理,如果设置太小,一般的文件也要被分割成多个数据块,那么在访问的时候也就要访问多个数据块地址,这样效率不高,同时也会对NameNode的内存消耗比较严重;数据块设置的太大,对并行的支持就不太好了,同时系统如果重启需要加载数据,数据块越大,系统恢复就会越长。
HDFS文件读流程
1、先向NameNode通信查询元数据(block所在的datanode节点),找到文件块所在的datanode服务器
2、挑选一台dataNode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packekt为单位来做校验)
4、客户端以packet为单位接收,先在本地缓存然后写入目标文件,后边的block块相当于是append到前面的block块最后合成最终需要的文件。
HDFS文件写流程
1、向namenode通信请求上传文件,NameNode检查目标文件是否已经存在,父目录是否存在。
2、NameNode返回确认可以上传。
3、client会先对文件进行切分,比如block块128M,文件有300M就会被切分成3个块,一个128M,一个128M,一个44M。请求第一个block该传输到哪些DataNode服务器上。
4、NameNode返回DataNode的服务器。
5、client请求一台DataNode上传数据,第一个DataNode收到请求会继续调用第二个DataNode,然后第二个调用第三个DataNode,将整个通道建立完成,逐级返回客户端。
6、client开始往A上传第一个block,当然在写入的时候DataNode会进行数据校验。第一台DataNode收到后就会传给第二台,第二台传给第三台。
7、当第一个block传输完成之后,client再次请求NameNode上传第二个block的服务器。
MapReduce介绍
MapReduce擅长处理大数据,它为什么具有这种能力呢?这可由MapReduce的设计思想发觉。MapReduce的思想就是“分而治之”。
(1)Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:
一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。
(2)Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
实体一:客户端,用来提交MapReduce作业。
实体二:JobTracker,用来协调作业的运行。
实体三:TaskTracker,用来处理作业划分后的任务。
实体四:HDFS,用来在其它实体间共享作业文件。