hdfs-分布式文件系统,既然是分布式文件系统,就必然涉及到网络编程,而网络编程的难度和复杂性是很大的。hdfs在数据读写和节点通讯会涉及到JAVA NIO和RPC机制,所以想要更好的理解hdfs,读懂其源码还是要有这方面相当的知识储备才行。hdfs网上的资料不少,看了那么的架构和原理,内容基本差不多,写这边文章是想记录自己对hdfs的所思所想。
1.关于hdfs的特点
高容错:在Hadoop集群运行过程中,除namenode节点外任意一台datanode宕机也不会给集群带来多大的影响,这得益于hdfs的数据副本机制。
高容量:MB、GB级数据存储对hdfs来说简直是小菜一碟,现在更多的存储TB、PB级数据。
高吞吐量:为大数据的外部应用提供高吞吐的访问支持。数据加工存在hdfs上要能够轻易的被外部应用所调用是很容易办到的,难的是高效的调用大数据量。目前在这方面有很多工具都可以做到,比如impala,Kylin等等。
流式数据访问:什么是流式数据访问?流式即为像水流一样,一点一点的流,并不是一次性加载到内存中,数据量过大的话,内存开销会很大,而流式数据访问的好处就是我读取一点数据计算一点,再读取一点再计算,不会给宝贵的内存资源造成过大的压力。
一致性原则:任一时刻,对一个文件只有一个写操作,可以有多个读操作,只可以追加文件内容,不支持随机写入。这么做的原因是因为假如任务在运行过程,一旦数据发生变化,很有可能造成计算的结果和预想的不一致或者错误。
就近原则:计算程序总是靠近所需数据最近的地方。计算程序在A节点,所需数据在B节点,避免不了要进行IO操作,而且是跨节点之间的数据传输。在上数据量很大的情况下,移动数据势必会造成网络拥塞,从而降低系统的吞吐量。
高延迟:hdfs并不适合低延迟的数据访问,因为它并不是面向用户而设计的,它是面向批处理的。
2.为什么hdfs不适合存储大量小文件?
应为文件系统的元数据信息是存在namenode的内存中,其内存大小决定了存储的文件数量。大量小文件必然会降低namenode所能存储的文件数量,也降低了hdfs的容量。
数据文件、目录、数据块所占大小为150字节,根据namenode内存大小即可以估算出大致的可存储文件数量。
3.hdfs的读写操作:
读写操作都是客户端先向namenode节点发送读写请求,不同的是中间的过程不同,很好理解。
4.关于数据块的大小?
hdfs默认的数据文件数据块大小为64MB。一般而言文件系统的块也就几千个字节,为什么hdfs会设置这么大。原因是块设置的大,寻址开销就会小,就会缩短数据的传输时间。项目中就将块大小调至128MB,当然块也不能太大。有一点需要注意的是hdfs中的文件不足一个块大小不会占据整个块的空间,这点设计还是挺实用的。