NameNodenode
Namenode 上保存着 HDFS 的名字空间。对于任何对文件系统元数据产生修改的操做, Namenode 都会使用一种称为 EditLog 的事务日志记录下来。例如,在 HDFS 中建立一个文件, Namenode 就会在 Editlog 中插入一条记录来表示;一样地,修改文件的副本系数也将往 Editlog 插入一条记录。 Namenode 在本地操做系统的文件系统中存储这个 Editlog 。整个文件系统的名 字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为 FsImage 的文件中,这个文件也是放在 Namenode 所在的本地文件系统上。linux
Namenode 在内存中保存着整个文件系统的名字空间和文件数据块映射 (Blockmap) 的映像 。这个关键的元数据结构设计得很紧凑,于是一个有 4G 内存的 Namenode 足够支撑大量的文件 和目录。当 Namenode 启动时,它从硬盘中读取 Editlog 和 FsImage ,将全部 Editlog 中的事务做用在内存中的 FsImage 上,并将这个新版本的 FsImage 从内存中保存到本地磁盘上,而后删除 旧的 Editlog ,由于这个旧的 Editlog 的事务都已经做用在 FsImage 上了。这个过程称为一个检查 点 (checkpoint) 。在当前实现中,检查点只发生在 Namenode 启动时,在不久的未来将实现支持 周期性的检查点。算法
HDFS NameSpace缓存
HDFS 支持传统的层次型文件组织结构。用户或者应用程序能够建立目 录,而后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数 现有的文件系统相似:用户能够建立、删除、移动或重命名文件。当前, HDFS 不支持用户磁盘配额和访问权限控制,也不支持硬连接和软连接。可是 HDFS 架构并不妨碍实现这些特性。安全
Namenode 负责维护文件系统命名空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。应用程序能够设置 HDFS 保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由 Namenode 保存的。服务器
DataNode网络
Datanode 将 HDFS 数据以文件的形式存储在本地的文件系统中,它并不知道有关 HDFS 文件的信息。它把每一个 HDFS 数据块存储在本地文件系统的一个单独的文件中。 Datanode 并不在同一个目录建立全部的文件,实际上,它用试探的方法来肯定每一个目录的最佳文件数目,而且在适当的时候建立子目录。在同一个目录中建立全部的本地文件并非最优的选择,这是由于本地文件系统可能没法高效地在单个目录中支持大量的文件。数据结构
当一个 Datanode 启动时,它会扫描本地文件系统,产生一个这些本地文件对应的全部 HDFS 数据块的列表,而后做为报告发送到 Namenode ,这个报告就是块状态报告。架构
Secondary NameNode 负载均衡
Secondary NameNode 按期合并 fsimage 和 edits 日志,将 edits 日志文件大小控制在一个限度下。
安全模式
在启动的时候,NameNode进入一个叫作安全模式的特殊状态。安全模式中不容许发生文件块的复制。名字节点接受来自数据节点的心跳和块报告。一个块报告包含数据节点所拥有的数据块的列表。
每个块有一个特定的最小复制数。当名字节点检查这个块已经大于最小的复制数就被认为是安全地复制了,当达到配置的块安全复制比例时(加上额外的30秒),名字节点就退出安全模式。它将检测数据块的列表,将小于特定复制数的块复制到其余的数据节点。
通讯协议
全部的通讯协议都是在TCP/IP协议之上构建的。一个客户端和指定TCP配置端口的名字节点创建链接以后,它和名字节点之间通讯的协议是Client Protocal(客户端协议)。数据节点和名字节点之间经过Datanode Protocol(datanode协议)通讯。
RPC(远程控制调用)抽象地封装了Client Protocol和DataNode Protocol协议。按照设计,namenode不会主动发起一个RPC,它只是被动地对DataNode和Client发起的RPC做出反馈。
1、安装hadoop须要配置的hadoop中的配置文件有哪些?
2、Hadoop的核心模块和相应的进程
HDFS:namenode,datanode,secondarynamenode,namenodemanager,datanodemanager
MapReduce:ResourceManager,NodeManager,Application master
3、SecondaryNameNode的做用
若是运行namenode服务的机器损坏,那么文件系统上全部的文件都将丢失,所以,namenode的容错很是重要,hadoop为此提供了两种机制,secondaryNameNode是其中之一:
在namenode运行的时候,同时运行一个secondaryNameNode,可是它不会被用做namenode,它的做用是按期的经过编辑日志文件(edits)合并命名空间镜像(images),以防编辑日志过大,secondaryNameNode通常运行在另外一台单独的计算机上,由于它须要占用大量的CPU时间与namenode相同容量的内存来执行合并操做。它保存合并后的镜像副本,并在namenode发生故障后启用。可是,secondaryNameNode保存的状态老是滞后于namenode的,所以主节点所有失效时,确定会丢失一部分数据
4、 Edits文件和fsimages文件的做用
fsimages文件包含整个HDFS系统中的全部目录和文件的inode信息,对于文件来讲包含了数据块描述信息,修改时间,访问时间;对于目录来讲,包括修改时间,访问权限控制信息等;
Edits文件主要是在namenode已经启动的状况下对HDFS进行的各类更新操做进行记录
5、 结合图描述hdfs写原理
1. Client调用DistributedFileSystem对象的create方法,建立一个文件输出流(FSDataOutputStream)对象
2. 经过DistributedFileSystem对象与Hadoop集群的NameNode进行一次RPC远程调用,在HDFS的Namespace中建立一个文件条目(Entry),该条目没有任何的Block
3. 经过FSDataOutputStream对象,向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的Buffer中,而后数据被分割成一个个Packet数据包
4. 以Packet最小单位,基于Socket链接发送到按特定算法选择的HDFS集群中一组DataNode(正常是3个,可能大于等于1)中的一个节点上,在这组DataNode组成的Pipeline上依次传输Packet
5. 这组DataNode组成的Pipeline反方向上,发送ack,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client
6. 完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流
7. 调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功
6、结合图描述hdfs的读取原理
(1)客户端调用FileSyste对象的open()方法在分布式文件系统中打开要读取的文件。
(2)分布式文件系统经过使用RPC(远程过程调用)来调用namenode,肯定文件起始块的位置。
(3)分布式文件系统的DistributedFileSystem类返回一个支持文件定位的输入流FSDataInputStream对象,FSDataInputStream对象接着封装DFSInputStream对象(存储着文件起始几个块的datanode地址),客户端对这个输入流调用read()方法。
(4)DFSInputStream链接距离最近的datanode,经过反复调用read方法,将数据从datanode传输到客户端。
(5) 到达块的末端时,DFSInputStream关闭与该datanode的链接,寻找下一个块的最佳datanode。
(6)客户端完成读取,对FSDataInputStream调用close()方法关闭链接
7、hdfs的构架原理
HDFS被设计成在一个大集群中能够跨机器地可靠地存储海量的文件。它将每一个文件存储成block序列,除了最后一个block,全部的block都是一样的大小。文件的全部block为了容错都会被复制。每一个文件的block大小和replication(复制)因子都是可配置的。Replication(复制)因子能够在文件建立的时候配置,之后也能够改变。HDFS中的文件是write-one,而且严格要求在任什么时候候只有一个writer。Namenode全权管理block的复制,它周期性地从集群中的每一个Datanode接收心跳包和一个Blockreport(块状态报告)。心跳包的接收表示该Datanode节点正常工做,而Blockreport(块状态报告)包括了该Datanode上全部的block组成的列表。
(1)副本的存放
副本的存放是HDFS可靠性和性能的关键。HDFS采用一种称为rack-aware(机架感知)的策略来改进数据的可靠性、有效性和网络带宽的利用。这个策略实现的短时间目标是验证在生产环境下的表现,观察它的行为,构建测试和研究的基础,以便实现更先进的策略。庞大的HDFS实例通常运行在多个机架的计算机造成的集群上,不一样机架间的两台机器的通信须要经过交换机,显然一般状况下,同一个机架内的两个节点间的带宽会比不一样机架间的两台机器的带宽大。
经过一个称为Rack Awareness(机架意识)的过程,Namenode决定了每一个Datanode所属的rack id。一个简单但没有优化的策略就是将副本存放在单独的机架上。这样能够防止整个机架(非副本存放)失效的状况,而且容许读数据的时候能够从多个机架读取。这个简单策略设置能够将副本分布在集群中,有利于组件失败状况下的负载均衡。可是,这个简单策略加大了写的代价,由于一个写操做须要传输block到 多个机架。
在大多数状况下,replication(复制)因子是3,HDFS的存放策略是将一个副本存放在本地机架上的节点,一个副本放在同一机架上的另外一个节点,最后一个副本放在不一样机架上的一个节点。机架的错误远远比节点的错误少,这个策略不会影响到数据的可靠性和有效性。三分之一的副本在一个节点上,三分之二在一 个机架上,其余保存在剩下的机架中,这一策略改进了写的性能。
(2)副本的选择
为了下降总体的带宽消耗和读延时,HDFS会尽可能让reader读最近的副本。若是在reader的同一个机架上有一个副本,那么就读该副本。若是一个HDFS集群跨越多个数据中心,那么reader也将首先尝试读本地数据中心的副本
8、简述hdfs的优缺点
1)处理超大文件
这里的超大文件一般是指百MB、设置数百TB大小的文件。目前在实际应用中,HDFS已经能用来存储管理PB级的数据了。
2)流式的访问数据
HDFS的设计创建在更多地响应"一次写入、屡次读写"任务的基础上。这意味着一个数据集一旦由数据源生成,就会被复制分发到不一样的存储节点中,而后 响应各类各样的数据分析任务请求。在多数状况下,分析任务都会涉及数据集中的大部分数据,也就是说,对HDFS来讲,请求读取整个数据集要比读取一条记录 更加高效。
3)运行于廉价的商用机器集群上
Hadoop设计对硬件需求比较低,只须运行在低廉的商用硬件集群上,而无需昂贵的高可用性机器上。廉价的商用机也就意味着大型集群中出现节点故障状况的几率很是高。这就要求设计HDFS时要充分考虑数据的可靠性,安全性及高可用性。
4)不适合低延迟数据访问
若是要处理一些用户要求时间比较短的低延迟应用请求,则HDFS不适合。HDFS是为了处理大型数据集分析任务的,主要是为达到高的数据吞吐量而设计的,这就可能要求以高延迟做为代价。
改进策略:对于那些有低延时要求的应用程序,HBase是一个更好的选择。经过上层数据管理项目来尽量地弥补这个不足。在性能上有了很大的提高,它的口号就是goes real time。使用缓存或多master设计能够下降client的数据请求压力,以减小延时。还有就是对HDFS系统内部的修改,这就得权衡大吞吐量与低延时了。
5)没法高效存储大量小文件
由于Namenode把文件系统的元数据放置在内存中,因此文件系统所能容纳的文件数目是由Namenode的内存大小来决定。通常来讲,每个文件、文件夹和Block须要占据150字节左右的空间,因此,若是你有100万个文件,每个占据一个Block,你就至少须要300MB内存。当前来 说,数百万的文件仍是可行的,当扩展到数十亿时,对于当前的硬件水平来讲就无法实现了。还有一个问题就是,由于Map task的数量是由splits来决定的,因此用MR处理大量的小文件时,就会产生过多的Maptask,线程管理开销将会增长做业时间。举个例子,处理 10000M的文件,若每一个split为1M,那就会有10000个Maptasks,会有很大的线程开销;若每一个split为100M,则只有100个 Maptasks,每一个Maptask将会有更多的事情作,而线程的管理开销也将减少不少。
改进策略:要想让HDFS能处理好小文件,有很多方法。
利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于这种方法,若是想找回原来的小文件内容,那就必须得知道与归档文件的映射关系。
横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,造成一个大的Hadoop集群。google也是这么干过的。
多Master设计,这个做用显而易见了。正在研发中的GFSII也要改成分布式多Master设计,还支持Master的Failover,并且Block大小改成1M,有意要调优处理小文件啊。
附带个Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。
6)不支持多用户写入及任意修改文件
在HDFS的一个文件中只有一个写入者,并且写操做只能在文件末尾完成,即只能执行追加操做。目前HDFS还不支持多个用户对同一文件的写操做,以及在文件任意位置进行修改。
9、 启动hadoop的脚本和用法hadoop/sbin
·start-all.sh 启动全部的Hadoop守护进程。包括NameNode、 SecondaryNameNode、DataNode、NameNodeManager、 DataNodeManager
·stop-all.sh 中止全部的Hadoop守护进程。包括NameNode、 SecondaryNameNode、DataNode、NameNodeManager、 DataNodeManager
·start-dfs.sh 启动Hadoop HDFS守护进程NameNode、SecondaryNameNode和DataNode
·stop-dfs.sh 中止Hadoop HDFS守护进程NameNode、SecondaryNameNode和DataNode
10、linux下如何使用命令上传文件到hdfs上,如何下载文件到本地文件
hdfs dfs –put /home/admin/newFile /user/admin/aaron上传
hdfs dfs –get /user/admin/aaron/newFile /home/admin/newFile下载
hdfs dfs –copyFromLocal /home/admin/newFile /user/admin/aaron上传
hdfs dfs –copyToLocal /user/admin/aaron/newFile /home/admin/newFile下载
hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件
hadoop fs -rm -r <hdfs dir or file> 删除文件或文件夹及文件夹下的文件
hadoop fs -mkdir <hdfs dir>在hdfs中新建文件夹