1.hdfs中的块为什么这么大?
电脑磁盘都有默认的数据块大小,这是磁盘进行读写的最小单位。
hdfs同样也有块的概念,默认是128MB。
hdfs存储的数据是密集型的,例如一个块里面的数据只有1M不会占用一个块的大小。hdfs块比磁盘块大是为了最小化的寻址时间开销,如果块足够大,磁盘的寻址时间明显小于磁盘的传输时间。因而传输一个由多个块组成的大文件取决于磁盘的传输时间。
例如:磁盘的寻址时间是10ms,传输速率为100MB/S,为了使寻址时间占用传输时间的1%,那么一个块的大小是100MB.
块大小的设置可以根据情况适当调试。因为mapReduce中的map任务通常一次只处理一个块的大小。如果块太大会导致map的任务数太少(少于集群中节点的数量)作业运行速度就会很慢。
2.HDFS块缓存
通常datanode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显式地缓存在datanode的内存中,以堆外块缓存(off-heap block cache)的形式存在。默认情况下,一个块缓存在一个datanode的内存中,当然可以调整每个文件配置的数量。
作业调度器(用于MapReduce、Spark和其他框架)通过在缓存块的datanode上运行任务,可以利用块缓存的优势提高读操作的性能。例如,连接操作中使用的一个小的查询表就是块缓存的一个很好的候选。
参考:http://www.cnblogs.com/zhangningbo/p/4146398.html
设置hdfs块缓存的配置项:
<property>
<name>dfs.datanode.max.locked.memory</name>
<value>0</value>
<description>
The amount of memory in bytes to use for caching of block replicas in
memory on the datanode. The datanode's maximum locked memory soft ulimit
(RLIMIT_MEMLOCK) must be set to at least this value, else the datanode
will abort on startup.
By default, this parameter is set to 0, which disables in-memory caching.
If the native libraries are not available to the DataNode, this
configuration has no effect.
用于在datanode上的内存中缓存块副本的内存量(以字节为单位)。datanode的最大锁定内存软ulimit
(RLIMIT_MEMLOCK)必须至少设置为此值,否则datanode将在启动时中止。
默认情况下,此参数设置为0,这将禁用内存中的缓存。
如果本机库对DataNode不可用,则配置不起作用。
</description>
</property>
3.联邦HDFS
namenode在内存中保存着文件系统中每个文件和每个数据块的引用关系,这对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈。在2.X发行版本系列中引入的联邦HDFS允许通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间中的一部分。例如,一个namenode可能管理/user目录下的所有文件,而另一个namenode可能管理/share目录下的文件。
在联邦环境下,每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据和一个数据块池(block pool),数据块池包含该命名空间下文件的所有数据块。命名空间卷之间是相互独立的,它们之间不互相通信,甚至其中一个namenode的失效也不会影响由其他namenode维护的命名空间的可用性。数据块池不再进行切分,因此集群中的datanode需要注册到每个namenode,并且存储着来自多个数据块池中的数据块。