1.关于磁盘使用策略,介绍参考http://www.it165.net/admin/html/201410/3860.html

在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方式:

第一种是沿用hadoop1.0的磁盘目录轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java

第二种是选择可用空间足够多的磁盘方式存储,实现类:AvailableSpaceVolumeChoosingPolicy.java

选择策略对应的配置项是:

  <property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>

如果不配置,默认使用第一种方式,既轮询选择磁盘来存储数据副本,但是轮询的方式虽然能够保证所有磁盘都能够被使用,但是经常会出现各个磁盘直接数据存储不均衡问题,有的磁盘存储得很满了,而有的磁盘可能还有很多存储空间没有得到利用,所有在hadoop2.0集群中,最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据副本,这样一样能保证所有磁盘都能得到利用,还能保证所有磁盘都被利用均衡。

在采用第二种方式时还有另外两个参数会用到:

dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold

默认值是10737418240,既10G,一般使用默认值就行,以下是该选项的官方解释:

This setting controls how much DN volumes are allowed to differ in terms of bytes of free disk space before they are considered imbalanced. If the free space of all the volumes are within this range of each other, the volumes will be considered balanced and block assignments will be done on a pure round robin basis.

意思是首先计算出两个值,一个是所有磁盘中最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本。源代码如下:

public boolean areAllVolumesWithinFreeSpaceThreshold() {
long leastAvailable = Long.MAX_VALUE;
long mostAvailable = 0;
for (AvailableSpaceVolumePair volume : volumes) {
leastAvailable = Math.min(leastAvailable, volume.getAvailable());
mostAvailable = Math.max(mostAvailable, volume.getAvailable());
}
return (mostAvailable - leastAvailable) < balancedSpaceThreshold;
}

dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction

默认值是0.75f,一般使用默认值就行,以下是该选项的官方解释:
This setting controls what percentage of new block allocations will be sent to volumes with more available disk space than others. This setting should be in the range 0.0 - 1.0, though in practice 0.5 - 1.0, since there should be no reason to prefer that volumes with

意思是有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。

该配置需要重启生效,因为磁盘选择策略是datanode启动后在加载本地磁盘信息后加载的。

2.如果没有配置该策略,很容易造成节点内部磁盘使用不均,如果有磁盘的使用率超过了90%,则需要手工干预——手工移块

手工移块需要注意的问题:需要停datanode,移块完成后重启

原因:不停datanode,会导致datanode内存中block存储路径和实际存储路径不符,当dfs.datanode.scan连续两次检查到为坏块后,就会向namenode报告,namenode收到报告后会安排删除坏块

注意:①directoryscanner无法检测出磁盘间移动的块的健康性,

②data.block.scanner的作用是周期性的对block进行校验,以检测datanode所管理的所有副本的一致性。因此,对datanode上每一个block,datablockscanner每隔scanperiod会利用block对应的校验和文件来检测该block一次,来查看该block都否已损坏。因为datanode节点上的每个block扫描一遍要消耗不少系统资源,所以scan period默认值一般比较大,是504小时(21天),这也可能带来另一个问题——一个扫描周期内可能会出现datanode重启,为了避免datanode在启动后对还没有过期的block又扫描一遍,datablockscanner在其内部使用了日志记录器来持久化保存每一个block上一次扫描的时间,如此,datanode在启动后通过日志文件来恢复之前所有block的有效时间。另外,datanode为了节约系统资源,它对block的验证不仅仅只依赖于datablockscanner后台现成(verification_scan方式),还会在向某一个客户端传送block的时候来进行该block的扫描(remote_read方式),这是因为datanode向客户端传送一个block的时候必须要检验该数据块。这也就是datanode在线移块后,datablocksanner扫描前,虽然hdfs fsck还是healthy,hfs dfs get会报错的原因。但是,这是的日志记录器并不会马上把该数据块的扫描信息写到日志,因为频繁的磁盘io会导致性能下降,那么什么时候对该block的最新扫描时间写日志又一个判断条件:①如果是verification_scan方式的block验证,必须记日志;②如果是remote_read方式的block验证,那么该block上一次的记录日志到现在的时间超过24小时或者超过scanperiod/3的话,记日志。

③在我自己的测试中,移块后接着重启是也是不会出现坏块,但是在生产中执行时还是出现了坏块,后来反思,自己的测试也没有完全考虑到生产的情况,在生产中移块时间会比测试长很多(因为需要移动的块多呀),在此期间应用一直在执行,不停的有新块在增加,当然,我不认为这是造成伪坏块出现的原因,影响了测试结果的原因是,测试块的设定就不对,我是新上传了一个文件,然后手工移动该文件的某个块,这有个问题,就是它的第一个scan period还么有到,紧接着重启是不会造成坏块(标黄的带确认。。。。这东西真不是研究一次两次就能搞明白的,还是自己太笨了。。。哎。。。。),比如,测试中的块可能时间间隔大,scan period不会紧挨着,即使时候重启datanode,被移动的块可能也不会在生产中操作时还是要采用慎重最保险的方法。原因应该是:虽然scan period有一个周期,但是每个块的检测时间点是不一样的,在任何时间不停datanode都可能处于某一被移动block的检查点,所以不停datanode移块很容易造成该检查点block的伪坏块(块只是被移动了位置,并没有丢失,但是hdfs fsck就会显示corrupt)。

手工移块过程:

①停datanode;

②mv(使用hadoop用户执行,执行后要记得确认移动到新目录的文件权限属主是否正确,我就是用root执行了脚本,结果datanode自己shutdown了,报权限问题)

③启datanode;

hadoop手工移块的更多相关文章

  1. Hadoop HDFS 文件块大小

    HDFS 文件块大小 HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M ...

  2. 【转载】Hadoop机架感知

    转载自http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html 背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机 ...

  3. hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  4. javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)

    前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...

  5. hadoop之 hadoop 机架感知

    1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份.这样如果本地数据损坏,节点可以从同一机 ...

  6. hadoop学习day1环境配置笔记(非完整流程)

    hdfs的工作机制: 1.客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<准确来说:切块的行为是由客户 ...

  7. hadoop(二)hadoop集群的搭建

    一.集群环境准备工作 1.修改主机名 在root 账户下 vi /etc/sysconfig/network   或者 sudo vi /etc/sysconfig/network 2.设置系统默认启 ...

  8. 第十三章 hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  9. 【Hadoop】Hadoop 机架感知配置、原理

    Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...

随机推荐

  1. Consider using EXISTS instead of IN

    redgate给出的提示 https://documentation.red-gate.com/codeanalysis/performance-rules/pe019 In theory, EXIS ...

  2. 使iframe随内容(target到iframe的内容)改变而自适应高度,完美解决各种获取第一个demo高度后第二个高度不变情况

    转自:http://caiceclb.iteye.com/blog/281102 很高兴,终于使用jquery实现了点击外部链接,更改iframe内容时,iframe的高度自适应问题. 失败的测试就不 ...

  3. P3694 邦邦的大合唱站队/签到题(状压dp)

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  4. [App Store Connect帮助]二、 添加、编辑和删除用户(6)生成 API 密钥

    如果已批准您访问 App Store Connect API,您可以生成 API 密钥,以便使用该密钥配置.认证和使用 App Store Connect 服务. 有关管理和保护您密钥的更多信息,请参 ...

  5. 慕课网3-13编程练习:采用flex弹性布局制作页面主导航

    小伙伴们,伸缩容器的属性我们已经学完了,接下来使用我们所学的伸缩容器属性完成下面的效果图. 要求: 1.logo.导航项.登录注册按钮这三项在水平和垂直方向上都对齐,而且他们之间的距离也相等. 2.导 ...

  6. 常用mysql记录

    多个关键词 like$joinwhere .=" and CONCAT(`JpTel`,`JpName`) Like '%$keywords%' ";

  7. JavaScript正则表达式(一)-常用方法

    公司之前有个胖女孩说你竟然会正则? 其实正则没那么难:今天我们说说他常用的几个API. 在讲方法之前, 我们先对正则表达式做一个基本的了解: 1.正则表达式定义使用单个字符串来描述.匹配一系列符合某个 ...

  8. python自动化测试学习笔记-1

    一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行测试用例进行测试: 二.python ...

  9. 【BZOJ4566_洛谷3181】[HAOI2016]找相同字符(SAM)

    自己yy的方法yyyyyyyy着就A了,写篇博客庆祝一下. 题目: 洛谷3181 分析: SAM(可能是)模板题(不会SAM的同学戳我:[知识总结]后缀自动机的构建). 对\(s1\)建出SAM,用\ ...

  10. NHibernate系列学习(二)-使用sql和hql以及linq

    1.本文主要介绍了NH的三种查询方式 2.界面查看 3.代码架构 4.代码详情 namespace KimismeDemo { public partial class Form2 : Form { ...