HDFS块缓存
通常datanode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显式地缓存在datanode的内存中,以堆外块缓存(off-heap block cache)的形式存在。默认情况下,一个块缓存在一个datanode的内存中,当然可以调整每个文件配置的数量。
作业调度器(用于MapReduce、Spark和其他框架)通过在缓存块的datanode上运行任务,可以利用块缓存的优势提高读操作的性能。例如,连接操作中使用的一个小的查询表就是块缓存的一个很好的候选。
联邦HDFS
namenode在内存中保存着文件系统中每个文件和每个数据块的引用关系,这对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈。在2.X发行版本系列中引入的联邦HDFS允许通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间中的一部分。例如,一个namenode可能管理/user目录下的所有文件,而另一个namenode可能管理/share目录下的文件。
在联邦环境下,每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据和一个数据块池(block pool),数据块池包含该命名空间下文件的所有数据块。命名空间卷之间是相互独立的,它们之间不互相通信,甚至其中一个namenode的失效也不会影响由其他namenode维护的命名空间的可用性。数据块池不再进行切分,因此集群中的datanode需要注册到每个namenode,并且存储着来自多个数据块池中的数据块。
--摘自《Hadoop权威指南》