本帖最后由 hyj 于 2014-2-23 02:12 编辑
1.HDFS文件能否直接删除或则修改?
2.HDFS能否多线程写?
3.文件授权期限分为几个等级?
4.软限制期和硬限制期有什么区别?
5.如果客户端用户程序需要确保对写入数据的可见,该如何操作?
6.每个数据块对应几个Checksum?
7.Checksum的作用是什么?
8.客户端如何判断数据块损坏?
9.HDFS是否允许读取正在进行写操作的文件?如果允许读取的长度该如何确定?
10.NameNode会认为什么情况下所有的节点在一个Rack上?
11.如何提高rack之间以及节点之间的写入时间,写入效率,可以采用什么方式?
12.均衡器 HDFS数据块部署策略是否负责DaraNode的负载均衡?
13.数据块扫描器的作用是什么?
当然,一个文件系统的根本任务是用来存储数据和文件。如果要理解HDFS如何完成这一基本任务,我们就必须从它如何进行数据的读写,以及文件块如何管理这两方面来说明。1. 文件读写 应用程序通过创建新文件以及向新文件写数据的方式,给HDFS系统添加数据。文件关闭以后,被写入的数据就无法再修改或者删除,只有以“追加”方式重新打开文件后,才能再次为文件添加数据。HDFS采用单线程写,多线程读的模式。
HDFS客户端需要首先获得对文件操作的授权,然后才能对文件进行写操作。在此期间,其他的客户端都不能对该文件进行写操作。被授权的客户端通过向NameNode发送心跳信号来定期更新授权的状态。当文件关闭时,授权会被回收。文件授权期限分为软限制期和硬限制期两个等级。当处于软限制期内时,写文件的客户端独占对文件的访问权。当软限制过期后,如果客户端无法关闭文件,或没有释放对文件的授权,其他客户端即可以预定获取授权。当硬限制期过期后(一小时左右),如果此时客户端还没有更新(释放)授权,HDFS会认为原客户端已经退出,并自动终止文件的写行为,收回文件控制授权。文件的写控制授权并不会阻止其他客户端对文件进行读操作。因此一个文件可以有多个并行的客户端对其进行读取。
HDFS文件由多个文件块组成。当需要创建一个新文件块时,NameNode会生成唯一的块ID,分配块空间,以及决定将块和块的备份副本存储到哪些DataNode节点上。DataNode节点会形成一个管道,管道中DataNode节点的顺序能够确保从客户端到上一DataNode节点的总体网络距离最小。文件的则以有序包(sequence of packets)的形式被推送到管道。应用程序客户端创建第一个缓冲区,并向其中写入字节。第一个缓冲区被填满后(一般是64 KB大小),数据会被推送到管道。后续的包随时可以推送,并不需要等前一个包发送成功并发回通知(这被称为“未答复发送”——译者注)。不过,这种未答复发送包的数目会根据客户端所限定的“未答复包窗口”(outstanding packets windows)的大小进行限制。
在数据写入HDFS文件后,只要文件写操作没有关闭,HDFS就不保证数据在此期间对新增的客户端读操作可见。如果客户端用户程序需要确保对写入数据的可见性,可以显示地执行hflush操作。这样,当前的包就会被立即推送到管道,并且hflush操作会一直等到所有管道中的DataNode返回成功接收到数据的通知后才会停止。如此就可以保证所有在执行hflush之前所写入的数据对试图读取的客户端用户均可见。
在一个集群的数千个节点里,节点失效(往往是因为存储故障造成的)每天都有可能发生。DataNode中所包含的文件块备份可能会因为内存、磁盘或者网络的错误而造成损坏。为了避免这种错误的形成,HDFS会为其文件的每个数据块生成并存储一份Checksum(总和检查)。Checksum主要供HDFS客户端在读取文件时检查客户端,DataNode以及网络等几个方面可能造成的数据块损坏。当客户端开始建立HDFS文件时,会检查文件的每个数据块的checksum序列,并将其与数据一起发送给DataNode。 DataNode则将checksum存放在文件的元数据文件里,与数据块的具体数据分开存放。当HDFS读取文件时,文件的每个块数据和checksum均被发送到客户端。客户端会即时计算出接受的块数据的checksum, 并将其与接受到的checksum进行匹配。如果不匹配,客户端会通知NameNode,表明接受到的数据块已经损坏,并尝试从其他的DataNode节点获取所需的数据块。
当客户端打开一个文件进行读取时,会从NameNode中获得一个文件数据块列表,列表中包含了每一个所需的数据块的具体位置。这些位置会按照与客户端的距离进行排序。当具体进行数据块读取时,客户端总是尝试首先从最近的位置获取数据。如果尝试失败,客户端会根据排序的顺寻,从下一个位置获取数据。下列情况可能会造成数据读取失败:DataNode不可用,节点不再包含所需数据块,或者数据块备份损坏,以及checksum验证失败。
HDFS允许客户端从正在进行写操作的文件中读取数据。当进行这样的操作时,目前正在被写入的数据块对于NameNode来说是未知的。在这样的情况下,客户端会从所有数据块备份中挑选一个数据块,以这个数据块的最后长度作为开始读取数据之前的数据长度。 HDFS I/O的设计是专门针对批处理系统进行优化的,比如MapReduce系统,这类系统对顺序读写的吞吐量都有很高的要求。针对于那些需要实时数据流以及随机读写级别的应用来说,系统的读/写响应时间还有待于优化,目前正在做这方面的努力。
2 .数据块部署
对于巨大的集群来说,把所有的节点都部署在一个平行的拓扑结构里是不太现实的。比较实际且通用的做法是,把所有的节点分布到多个Rack(服务器机架)上。每个Rack上的节点共享一个交换机,Rack之间可以使用一个或者多个核心交换机进行互联。在大多数情况下,同一Rack中的节点间通信的带宽肯定会高于不同Rack间节点的通信带宽。
HDFS默认两个节点之间的网络带宽与他们的物理距离成正比。从一个节点到其父节点的距离被认为是常数1。这样,两个节点之间的距离可以通过将其到各级祖先节点的距离相加计算出来。两个节点之间的距离越短,就意味着他们之间传输数据的带宽越大。
HDFS允许管理员通过配置脚本,返回一个节点的rack标识符,作为节点地址。NameNode位于整个结构的最中央,负责解析每一个DataNode的rack位置。当DataNode注册到NameNode时,NameNode会运行这些配置脚本,确定节点属于哪个rack。如果没有进行脚本配置,NameNode则会认为所有的节点都属于一个默认的Rack。
数据块备份的部署对于HDFS数据的可靠性和读写性能都有至关重要的影响。良好的数据块部署策略能够有效地改进数据的可靠性,可用性,甚至提高网络带宽的利用率。目前的HDFS系统提供了可配置的数据块部署策略接口,以此来让用户和研究人员能够对不同的部署策略进行测验,从而达到对系统应用进行优化的目的。
缺省的HDFS数据块部署策略企图在降低数据写入代价,最大化数据可靠性,可用性,以及整合读数据带宽等几个方面做出权衡。当一个新的数据块被创建,HDFS会把第一个数据开备份放到写入程序所在的位置。第二个和第三个数据块备份会被部署到不同rack的其他两个不同的节点。剩余的数据块备份则被放到随机的节点上,但是限制每个节点不会部署多于一个相同的数据块,每个rack不会部署都与两个相同的数据块(如果条件满足的话)。之所以要把第二个和第三个数据块备份放到不同的rack上,是为了考虑到一个集群上的文件所应当具有的分布性。如果头两个数据块备份放到相同的rack上,那么对于任何文件来说,其2/3的文件块会被存放在同一rack上。
在所有目标节点都被选择后,这些节点会被有组织地按照其亲近程度,以流水线的方式被传输到第一个备份上。数据会被以这个顺序推送到节点。在读取的时候,NameNode首先会检查客户端所对应的主机是否位于集群当中。如果是,那么数据块的位置会被返回到客户端,并以按照距离远近排序。然后数据块就会按照顺序从DataNode中进行读取。
这一策略会降低rack之间以及节点之间的写入时间,普遍提高写入效率。因为rack故障的几率远低于节点故障的几率,所以该策略不会影响到数据的有效性和可用性。在大多数使用3数据块备份的情况下,该策略能够降低网络带宽的消耗,因为一个数据块只需要部署到两个不同的rack上,而不是3个。
3. 数据块备份管理
NameNode会尽力保证们每个数据块都有所需的备份数量。当Block Report从DataNode提交上来的时候,NameNode会侦测到数据块的备份数量是少于所需还是超过所需。当超过时,NameNode会选择删除一个数据备份。NameNode倾向于不减少rack的数量,并在DataNode中选择一个剩余磁盘空间最小的节点进行备份移除。这样做的主要目的是平衡利用DataNode的存储空间,并其不降低到数据块的可用性。
当一个数据块处于低于其备份需求数的状态时,该数据块就会被放入到备份优先队列中。仅拥有一个数据备份的数据块处于最高优先级,其数据备份数高于其备份因子2/3的数据块则处于最低优先级。有一个后台进程专门负责定期对备份优先队列进行扫面,以确定将备份部署到何处。数据块备份遵循与数据块部署相似的策略。如果数据块当前只有一个备份,那么HDFS会把一个新的备份放到不同rack上。如果数据块当前有两个备份,并且连个备份都存在与相同的rack上,第三个备份就会被放到不同的rack上。否则,第三个备份就被放到同一rack的不同节点上。这么做的目的也是为了降低创建备份的代价。 NameNode也会确保不把所有的数据块备份都部署到同一个rack上。如果NameNode侦测到某数据块的所有备份都在一个rack上,那么它就会把这个数据块当做是mis-replicated(误备份),然后它就会用上面所提到的策略,在其他的rack上把这个数据块再备份一次。在NameNode收到异地rack备份成功后,该数据块就成为了“备份数量高于所需备份数”状态。此时NameNode会根据策略把本地的一个备份删除,因为策略规定不能减少rack的数量。
4 均衡器 HDFS数据块部署策略并不负责DaraNode的负载均衡。
这是为了避免把新的(多半是用于备份)的数据放到很少一部分拥有大量闲置存储空间的DataNode上。因此数据不一定会被负载合理地存放在各个DataNode中。在新的节点加入到集群中的时候,也会造成负载不均衡的情况。
均衡器就是一个用来在HDFS集群上平衡磁盘使用情况的工具。它采用一个阈值作为输入参数,其范围在0到1之间。如果某些节点的存储利用率(也就是该节点磁盘存储利用率)不同于整个集群的存储利用率(也就是整个集群的总的存储利用率),那么当类节点占集群总节点数的比例小于阈值时,集群便是负载均衡的。
这个工具是以一个应用程序的形式存在的,它可以根据管理员的要求运行。它能够不断地从高利用率的DataNode中把数据备份移动到低利用率的DataNode中。负载均衡的一个重要因素是要保证维持数据的可用性。当决定把一个数据备份移动到某个目标时,负载均衡器需要保证其决定不会降低这个数据备份所覆盖的rack的数目。
均衡器可以通过最小化rack内数据拷贝的方式来优化均衡过程。如果均衡器决定将数据块备份A移动到不同rack上的节点里,而凑巧此时该节点本身就包含了同一数据块的另一个备份B,这时均衡器就会直接在目标节点上拷贝一份B,用来代替A。 均衡器操作的带宽可以通过一个配置参数进行限制。允许使用的带宽越高,达到均衡状态的时间就越短,但是其与正常的业务进程的竞争冲突也会越大。
5. 数据块扫描器 每个DataNode都会定期运行扫描器,来扫描其数据块备份,并验证存贮的checksum是否与数据块匹配。
在每个扫描周期内,扫描器会调整读取带宽,以确保在规定的时间内完成校验工作。如果客户端读完了一个数据块,并且验证checksum成功,它会发一个信息给DataNode. DataNode将其当做对数据块备份的一次验证。
每个数据块的验证时间会被存储到一个可阅读的日志文件里。无论何时,在DataNode的顶级目录里,至少应该包含两个文件:当前日志文件和以前的日志文件。每做一次验证,新的验证时间记录就会被追缴到当前的日志文件中。相应的,每个DataNode的内存中也有一个扫描列表,并且按照验证的时间进行排序。
当客户端或者块扫描器侦测到了一个损坏的块数据时,就会通知NameNode. NameNode会标记相应的块数据为“已损坏”,但是不会立刻安排删除损坏的数据,而是开始进行数据拷贝。当且仅当正常的数据块拷贝超过了其备份因子的时候,损坏的数据才会被安排移除。这个策略主要是为了尽可能长时间地保存数据。即使一个数据块的所有备份都坏了,采用这个策略能让用户有机会从损坏的数据中回复尽可能多有用数据。
6. 停用 集群管理员可以指定一个列表,列出需要停用的节点。
一旦某个DataNode节点被标记为停用,它就不会再被选作可以部署的目标节点,但是该节点依然处于可读状态。NameNode开始规划将该节点上的数据块备份到其他的DataNodeshang . 一旦NameNode侦测到所有数据块都已完成备份后,该节点就进入到停用状态。 此时该节点就可以安全地从集群里移除了,而不会对数据的可用性造成影响。
7. 集群内数据拷贝
当与超大数据集协同工作时,将数据导入/导出到HDFS集群里是一个令人畏惧的工作。HDFS提供了一个工具叫做DistCp, 用于大型集群内(局域网内)数据的并行拷贝。它是一个MapReduce任务,每一个Map任务拷贝元数据的一部分到目标文件系统。MapReduce框架会自动处理并行任务的分配,错误侦测和恢复工作。
来自群组: Hadoop技术组 |