Hadoop单节点中副本存放策略

       在实际的大数据生产环境中,每个数据节点也就是DataNode,会配置多个数据磁盘,每个磁盘对应一个数据目录,将这些数据目录配置到DataNode的hdfs-site.xml(dfs.datanode.data.dir),使用逗号分隔多个数据目录,这样做的好处可以使数据节点的增加读写效率,毕竟每个目录对应单独的磁盘IO,不互相占用或竞争,也可以增加数据节点的高可用性,通过配置dfs.datanode.failed.volumes.tolerated参数,默认不配置的值为0,即不能容忍出现错误磁盘,如果出现则整个数据节点启动不了。此时如果数据节点有10块磁盘则可以配置容忍2-3块磁盘出现错误,如果大面积的同时出现磁盘错误则需要检查导致出错原因(同时出现的几率很小,如果同时出现则可能是由于外界原因导致,需要排查)。
       上面讲述了配置多个磁盘的方法及容错配置,那么接下来看看数据节点接到写入数据的命令后,如何将数据存储到当前数据节点的哪个磁盘中呢?在DataNode的hdfs-site.xml中配置dfs.datanode.fsdataset.volume.choosing.policy,支持两种磁盘选择策略一种是round-robin,第二种是available space,分别设置参数为:org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy、org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy,默认是第二个参数设置;

      分别来看一下这两种策略有什么区别?

      round-robin磁盘选择策略,这种策略是基于磁盘轮询的方式来选择磁盘存储,实现类为配置参数的类,round-robin采用轮询的方法,将每个磁盘的volume,与blockSize(副本块大小)比较,如果当前磁盘空间大于副本块,则返回该磁盘对应的目录,存储数据;如果当前轮询到的磁盘volume小于需要存储的副本块,则选择下一个进行比较,直到匹配到合适的磁盘volume,如果遍历完所有的磁盘,没有可以存储下的volume的话,则直接抛出异常(DiskOutOfSpaceException)。这种轮询的方法可以保证所有磁盘都能够利用起来,但是如果有大量的删除、增加则会导致磁盘的数据分布不均匀,会出现某些磁盘存满,而有的磁盘没有有效的利用起来,这样也不能利用好多个磁盘接口增加单台数据节点的IO。

      available space磁盘选择策略,使用该策略首先要知道一个配置项:dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold,该配置项配置了在选择磁盘中的需要参与运算的大小,默认为10G,选择策略处理如下:

      1. 如果所有的磁盘volumne的可用空间差别不是特别大,使用最大的磁盘容量减去最小磁盘容量小于默认10G,则选择轮询磁盘的方式来存放副本;

      2. 如果大磁盘容量减去最小磁盘容量大于10G,则将大的磁盘放入到highAvailableVolumes的队列中,小于则放入lowAvailableVolumes中。如果数据节点接受到的副本大小大于lowAvailableVolumes中的所有磁盘空间,则将在highAvailableVolumes中轮询的获取磁盘来存储副本;如果需要存储的副本可以在任何磁盘中存储,则采用dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction配置的参数进行策略选择,当前参数默认为0.75f,则有75%的概率在highAvailableVolumes中进行轮询选择磁盘来存放副本,有25%的概率在lowAvailableVolumes中进行轮询选择磁盘来存放副本。

     在实际的长期的运行hdfs集群中,如果新增磁盘或者大量删除操作后会导致数据不能够在单个节点中占用空间保持均衡,则还是会出现某些磁盘占满空间,这样我们尽量采用ailable space磁盘选择策略来存储数据。据说在hadoop3.0加入了磁盘均衡器,效果如何我们拭目以待。

版权声明:本文为橘子学院原创文章,转载请标记出处,谢谢! http://www.hotbigdata.com/article/3

你可能感兴趣的:(hadoop)