通常情况下,datanode都是从磁盘上读取block。但是对于经常访问的文件,将其显式得存储在datanode的内存中显然可以提高效率。这块内存逻辑上就叫做堆外块缓存区(堆外/块/缓存区)。一个block在默认情况下只在一个datanode上进行缓存,当然你也可以对不同的文件配置不同的缓存节点数。作业调度器会将任务调度到有缓存的节点上,这样就可以极大地提高读取效率。举个栗子,在进行join操作时,将较小的表缓存到内存中就是个不错的做法。
用户或者应用程序可以发送指令给namenode,配置哪些文件需要缓存,而且还可以配置缓存时间。方法就是在cache pool中添加一条缓存指令(cache directive)。这里提到的cache pool属于管理员组权限区,通过配置它,可以对缓存权限和资源利用情况进行管理。
总结:
-
一个block默认只在一个datanode上进行缓存
问题:
-
什么是堆外块缓存区,这里的堆外(off-heap)该怎么理解?
【如有任何问题,欢迎留言交流!】