HDFS框架中便于借鉴的设计

HDFS几个设计特点:

1. Block的放置:默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。
2. 心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
3. 数据交验:采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。
4. NameNode是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。
5. 数据管道性的写入:当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的DataNode都成功写入,客户端才会继续开始写下一个Block。
6. 安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

7.合并

 我们可以把各服务器磁盘中的本地文件在向HDFS复制的过程中合并,这样可以节省本地计算机大大量磁盘空间,当然还可以先把文件进行合并,然后再复制到HDFS中(这种方式比较龊),因此,我们需要一个PutMerge类型的操作,Hadoop命令行工具中有一个getmerge命令,用于把一组HDFS文件在复制到本地计算机以前进行合并,但是没有setmerget命令把本地文件合并到HDFS中的命令,因此需要用HDFS API来实现,在Hadoop中用作文件操作的类位于org.apache.hadoop.fs包中,常见的open\read\write\close,实际,Hadoop文件API是通用的,可用于HDFS以外的其他文件系统,Hadoop文件API的起点是FileSystem类,这是与文件系统交互的抽象类,存在不同的具体实现子类来处理HDFS和本地文件系统,如下例子是一个合并本地文件到HDFS中:
 

我们可以继续看看上述代码中调用的接口或者实现的源代码:
Configuration类是用于保留键值配置参数的特殊类,默认是以HDFS系统的资源配置为基础的,如下:

HDFS接口的FileSystem对象

本地文件系统的FileSystem对象

得到本地文件列表

 

用于将数据写入HDFS文件中前定义参数:

8.冥等
虽然hadoop有对失败节点监控、自动重启的特性,但是这些特性无法完全满足健壮性的特点,比如:某节点并没有失效,只是由于一些异常原因导致运行速度缓慢,那么这个时候会影响hadoop整体的性能,为了解决这个问题,hadoop使用了冥等特性,不再仅当任务失败后才重启任务,hadoop会注意到运行速度缓慢的任务,并安排在另一个节点上并行执行相同的任务,冥等特性保证同步执行的任务会产生相同的输出,hadoop将监视这些同步执行的任务,只要一个任务成功完成,hadoop会采用它的输出,并杀死其他并行的任务,这种方式执行的时机是仅当所有的map任务已经安排执行之后,且仅对于那些比其他map任务平均执行进度远远落后的map任务,reduce任务也是一样

猜你喜欢

转载自yale.iteye.com/blog/1540446
今日推荐