hadoop 概述(二)
hadoop 概述一,已经写了hdfs的一些基本概念,那作为分布式文件系统,是怎么进行读写的?下边讲述hdfs的读写流程
HDFS中读写流程中有一些额外的小的概念,下面讲述一下
- block
 blokc块,一般是128M,可以修改大小,但不推荐,原因如下:
- 
如果块设置过大, 
 一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
 另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
- 
如果块设置过小, 
 一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
 另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。
- 
packet 
 packet 它是client端向DataNode,或者DataNode之间使用PipLine传输的基本单位,默认64KB
- 
chunk 
 它是client向DataNode,或者DataNode之间PipLine之间进行数据校验的基本单位,默认是512Byte,因为要用作校验,
 故每个chunk需要带有4Byte的校验位,一个chunk的大小是516Byte
HDFS写流程

写流程步骤
- 
客户端向NameNode发出写文件请求, 
- 
检查文件是否已经存在,是否有权限写,如果校验通过,写入到edits log,并返回输出流对象和可写的DataNode列表 
- 
客户端按128MB的大小切分文件 
- 
客户端根据NameNode返回的可分配的可写DataNode列表,将Data数据发送给最近的一个DataNode节点写入一个packet, 
 列表中其他可写DataNode节点会和第一个节点形成pipline管道,将packet在多个节点写入,使得多个DataNode节点可以同时写入
- 
给个DataNode写完一个块后,会返回确认信息 
- 
写数据完成,关闭输出流 
- 
发送完成信号给NameNode 
HDFS读流程

读流程步骤
- 
客户端访问NameNode,查询元数据信息,获取这个文件按照距离排序的位置信息,返回输入流对象 
- 
选择最近的一台DataNode服务器,请求建立输入流 
- 
客户端从DataNode读取数据,以packet为单位,还要校验完整性 
- 
关闭输入流 
从我们之前搭建的hadoop来看HDFS存在如下问题
- NameNode 单点故障,难于应用于在线场景
- NameNode 压力过大,且内存受限,影响系统扩展性
- MapReduce jobTracker访问压力过大,影响系统扩展性
那有没有解决方案呢?
解决单点故障:HDFS HA 通过主备NameNode解决
解决系统扩展性问题:使用HDFS Federation 水平扩展,支持多个NameNode,所有NameNode共享所有DataNode存储资源,每个NameNode分管一部分目录
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号