企业级Hadoop实战应用开发系列HDFS体系结构、Shell操作、JavaAPI使用课程大纲HDFS体系结构HDFSShell常用命令HDFSJavaAPI使用HDFS作业练习HDFS设计目标ApacheHadoop设计假设和目标硬件错误:数量众多的廉价机器使得硬件错误成为常态。数据流访问:应用以流的方式访问数据;设计用于数据的批量处理,而不是低延时的实时交互处理。放弃全面支持POSIX。大数据集:典型的HDFS上的一个文件大小是G或T数量级的,支持一个云中文件数量达到千万数量级。简单的相关模型:假定文件一次写入多次读取。未来可能支持Appending-write的模型。移动计算比移动数据便宜:一个应用请求的计算,离它操作的数据越近就越高效。多种软硬件平台中的可移植性HDFS定义源自于Google的GFS论文发表于2003年10月HDFS是GFS克隆版HadoopDistributedFileSystem易于扩展的分布式文件系统运行在大量普通廉价机器上,提供容错机制为大量用户提供性能不错的文件存取服务HDFS设计目标非常巨大的分布式文件系统万个以上节点,亿个文件以上,10PB的容量以上运行于普通硬件上文件复制多份,避免硬件失败探测失败和错误恢复优化批处理数据暴露位置,以便计算能够挪到数据附近提供高聚合的带宽用户空间可以位于异构的操作系统中在整个集群中使用单一的命名空间HDFS设计目标数据一致性“写入一次读取多次”的访问模型客户端只能追加已有的文件文件被分为各个小块默认每一块为64M每一块复制到不同的DataNode上智能的客户端客户端能找到文件块的位置客户端能直接访问DataNode中的文件位置程序采用“数据就近”原则分配节点执行客户端对文件没有缓存机制(Nodatacaching)HDFS不擅长方面低延迟数据访问比如毫秒级低延迟与高吞吐率小文件存取占用NameNode大量内存寻道时间超过读取时间并发写入、文件随机修改一个文件只能有一个写者仅支持appendHDFS架构HDFS架构——系统架构HDFS存储模型HDFS架构——文件文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等DataNode在本地文件系统存储文件块数据,以及块数据的校验和。可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。HDFS文件权限与Linux文件权限类似。r:read;w:write;x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容。如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。HDFS架构——文件HDFS架构——文件HDFS架构——组件功能NameNodeDataNode存储元数据存储文件内容元数据保存在内存中文件内容保存在磁盘保存文件、block、DataNode之间的映射关系维护了blockid到DataNode本地文件的映射关系HDFS架构——NameNodeNamenode是一个中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈。HDFS架构——NameNode副本存放在哪些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延。Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。HDFS架构——DataNode一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。集群运行中可以安全加入和退出一些机器HDFS架构——保障可靠性的措施一个名字节点和多个数据节点数据复制(冗余机制)存放的位置(机架感知策略)故障检测数据节点心跳包(检测是否宕机)块报告(安全模式下检测)数据完整性检测(校验和比较)名字节点(日志文件,镜像文件)空间回收机制HDFS架构——保障可靠性的措施HDFS副本放置策略数据损坏(corruption)处理当DataNode读取block的时候,它会计算checksum如果计算后的checksum,与block创建时值不一样,说明该block已经损坏。Client读取其它DN上的block。NameNode标记该块已经损坏,然后复制block达到预期设置的文件备份数。DataNode在其文件创建后三周验证其checksum。