一步一步学习hadoop(五)

来源:互联网 发布:制图软件手机版 编辑:程序博客网 时间:2024/04/20 18:04
Hadoop分布式文件系统(HDFS)
首先介绍一下HDFS的特点:
1.擅长处理大文件,超大文件。几十G甚至PB级别的文件
2.擅长流式数据访问,一次写入多次读取是最高效的访问模式
3.可以运行在普通的机器上,一般只要求内存是ECC内存,可以对数据进行纠错。
4.擅长执行非实时的分析或者是近实时的数据处理,不擅长要求几十毫秒延迟的数据处理(因为作业下的任务的初始化要消耗时间)
5.不擅长处理包含大量小文件的数据处理,小文件很快就会耗光namenode的内存
6.不擅长处理多用户写入,任意修改文件,但这个在以后的版本可能会逐步解决。

HDFS的一些基本概念
1.数据块,其实这不是什么新鲜的东西,计算机系统中的缓存都是使用块来读写数据,并且按照存储器分层模型,越靠底层的块越大,主要是为了降低寻址或者寻道(对磁盘来说)的时间占用的比例。在HDFS中将这个继续发挥,设置这个大小为默认64M,这样就有效降低了寻道时间占用的比例,一般不会超过1%。
  同时使用块对文件进行抽象,使文件可以大于任何一台机器的磁盘容量,同时简化了存储系统的设计,同时很容易对数据进行容错处理,只需将块进行冗余备份就可以实现数据的容错。
2.NameNode和DataNode
  HDFS有一个NameNode和多个DataNode(这在最新版本中已经开始变化了,最新版允许有多个独立的NameNode),NameNode管理文件系统的命名空间,这些信息以两个本地文件形式保存在磁盘上,命名空间镜像文件和编辑日志文件。NameNode也记录每个文件中各个块所在的数据节点信息,但这些并不保存在文件中。
  NameNode非常重要,一旦NameNode数据丢失则所有数据都丢失了,为了数据的安全性,采用两种方案
  1'备份NameNode的文件到NFS中
  2'启动备份NameNode即(SecondaryNameNode),备份NameNode是对NameNode的一个延迟备份(一般延迟30分钟),也就是说如果namenode失败,可能会丢失半小时的数据。

HDFS文件读取工作原理
1.客户端通过FileSystem对象的open方法打开希望读取的文件
2.DFS通过RPC来调用NameNode,确定文件起始块的位置,对于每一个数据块NameNode返回该块副本的DataNode位置,并根据与客户端的距离进行排序。DFS返回一个FSDataInputStream对象给客户端,作为一个读取文件的代理
3.客户端对FSDataInputStream调用read方法,内部查找距离最近的DataNode,读取数据,读完一个数据块数据,关闭与保存该数据块的DataNode的连接,然后寻找下一块数据继续读取。
4.客户端完成读取后,调用FSDataInputStream的close方法关闭连接

如果读取中遇到读取失败,则会尝试读取另一个最邻近的DataNode中的数据块,同时记录下这个故障,报告给NameNode。
  这种设计的优点是NameNode只是告诉客户端每个块的最佳DataNode,客户端自己去和DataNode联系,并读取数据,这就使NameNode不会成为一个性能瓶颈。

HDFS文件写入工作原理
1.客户端通过DFS调用create函数来创建文件
2.DFS对NameNode创建一个RPC调用,在文件系统的命名空间创建一个新文件,此时文件只有名字还没有内容,返回一个FSDataOutputStream对象给客户端
3.客户端通过FSDataOutputStream在内部将写入数据分成一个一个的数据包,并保存在内部队列中,根据DataNode列表要求NameNode分配合适的新块来存储数据,然后数据包流式的传入管线中,当所有DataNode都确认保存成功后,将该数据包在列表中删除

如果在写入中DataNode出现故障,首先会将管线关闭,把队列中的数据都添加到队列的前端,为已经存储的数据指定一个新标识,并报告NameNode,以便NameNode在空闲时间删除这个数据。
原创粉丝点击