在HDFS上面最不明确的事情之一就是数据的冗余
它完全是自动进行的,因为无法得知其中详细的信息,我们需要做的就是相信它
HBase完全相信 HDFS存储数据的安全性和完整性,并将数据文件交给 HDFS存储
正是因为 HDFS的数据冗余方式对于 HBase来说是完全透明的,产生了一个问题:HBase的效率会受到多大的影响
说的简单一点,当 HBase需要存取数据时,如何保证有一份冗余的数据块离自己最近
当我们对 HBase做一次 MapReduce的扫描操作时,这个问题尤其显现出来
所有的RegionServer都在从 HDFS上面读取数据,理想的状况当然是每个RegionServer要读取的数据都离自己很近
这个问题就牵扯到HBase的数据文件是如何在HDFS上面存储的
让我们首先抛开 HBase,假设要处理的数据就是HDFS上面的数据块,看看Hadoop是如何工作的
MapReduce总是有一个建议,那就是在每个 TaskTracker上面Map/Reduce程序要处理的数据在本地就有一份冗余
这样程序只需要与本地数据交互,减少了网络流量并提高了效率
为了做到这一点, HDFS会把大文件分割成很多小文件来存储,我们称之为数据块(Block)
每个数据块的大小比操作系统数据块的大小要大得多,默认是64M,但通常我们选择 128M,或者某个更大的值(这取决与你的文件大小,最好你的单个文件大小总是大于一个数据块)
在MapReduce中,每个数据块会被分配给一个 Task,这个 Task就负责处理这个数据块中的数据
所以数据块越大,产生的Task就越少,需要 mapper的数量就越少
Hadoop自己知道每个数据块存储的位置,这样在任务分配的时候就可以直接在存储数据块的机器上启动 Task,或者选择一个最近机器启动Task
真是因为每个数据块有多份冗余,使得 Hadoop有