hadoop手工移块

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;

时间: 2024-12-08 20:10:33

hadoop手工移块的相关文章

hadoop hdfs数据块探索

1.文件存储的位置 示例查看 ./bin/hadoop fsck /data/bb/bb.txt -files -blocks -racks –locations blk_1076386829_2649976是meta文件名,具体如何找到这个meta文件,可以通过find命令,从图中我们可以看到文件存储在117和229的二台机器上,例如我们登录到117机器上. 首先到dfs.datanode.data.dir的路径(如果忘记啦,可以在$HADOOP_HOME/etc/hadoop/hdfs-si

数据块的内容和参数

数据块由3部分组成:块头部分.空闲区.数据区.随着数据量的增加,块头部分从上而下占据空闲区而数据区从下而上占据空闲区.当两部分接触时数据块就满了. 数据区:存储的是数据行,当插入数据时从下而上占据空闲区 块头部分:存储数据块的地址.表目录.行目录和事务槽,事务槽是在事务修改数据行时使用.头部从上而下占据空闲区 空闲区:位于数据块的中部,初始化时是连续的.但是随着删除修改操作使得空闲区碎片化.oracle服务器会根据需要合并空闲区. 一.oracle引入4个参数管理数据块 1.控制并行操作的参数:

hadoop单机存储均衡和坏block处理

1.Namenode岩机处理:重启集群无法恢复的情况下 这时候解决的办法很简单,把namenode镜像存储的路径下内容删除掉,再把secondnamenode镜像存储的路径下内容拷贝过来,重启即可. 默认namenode镜像存储的路径是 /opt/hdfs/dfs/name 默认secondnamenode镜像存储的路径 /opt/hdfs/dfs/namesecondary 2.坏Block解决方式 hadoop出现坏块后(如低版本的hadoop更换块大小的时候容易出现坏块),自身可以缓慢的修

【转】Hadoop安全模式详解及配置

原文链接 http://www.iteblog.com/archives/977 在<Hadoop 1.x中fsimage和edits合并实现>文章中提到,Hadoop的NameNode在重启的时候,将会进入到安全模式.而在安全模式,HDFS只支持访问元数据的操作才会返回成功,其他的操作诸如创建.删除文件等操作都会导致失败. NameNode在重启的时候,DataNode需要向NameNode发送块的信息,NameNode只有获取到整个文件系统中有99.9%(可以配置的)的块满足最小副本才会自

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

Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上拿数据要快: 同时,如果整个机架的网络出现异常,也能保证在其它机架的节点上找到数据. 为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本. 如果在读取程序的同一个机架上有一个副本,那么就读取该副本.

Hadoop集群性能优化一

挺喜欢这句话:"坚持,是基于 你对某件事的热爱,才能有动力坚持下去. 在学习的过程中,需要战胜自己的惰性和骄傲!"好了,下面说下如何提升 集群的性能: 在硬件方面,第一,商业硬件并不等同于低端硬件.低端机器常常使用 便宜的零部件,其故障率远高于更昂贵的机器.当用户管理几十台.上百台 甚至几千台机器时,便宜的零部件故障率更高,导致维护成本更高:第二, 不推荐使用大型数据库级别的机器,因为性价比太低了. 在相同硬件的情况下,一个配置好的的集群要比配置糟糕的集群在性能上 快数倍乃至数十倍.

Hadoop中HDFS读取和写入的工作原理

介绍 HDFS和HBase是Hadoop中两种主要的存储文件系统,两者适用的场景不同,HDFS适用于大文件存储,HBASE适用于大量小文件存储. 本文主要讲解HDFS文件系统中客户端是如何从Hadoop集群中读取和写入数据的,也可以说是block策略. 正文 一 写入数据 当没有配置机架信息时,所有的机器hadoop都默认在同一个默认的机架下,名为"/default-rack",这种情况下,任何一台 datanode机器,不管物理上是否属于同一个机架,都会被认为是在同一个机架下,此时,

深入理解hadoop之机架感知

深入理解hadoop之机架感知 机架感知 hadoop的replication为3,机架感知的策略为: 第一个block副本放在和client所在的datanode里(如果client不在集群范围内,则这第一个node是随机选取的).第二个副本放置在与第一个节点不同的机架中的datanode中(随机选择).第三个副本放置在与第二个副本所在节点同一机架的另一个节点上.如果还有更多的副本就随机放在集群的datanode里,这样如果第一个block副本的数据损坏,节点可以从同一机架内的相邻节点拿到数据

CG_Hadoop:基于MapReduce的计算几何

原作:Ahmed Eldawy:Mohamed F.Mokbel (UMN) 翻译:Leo(CAU) 注:由于本人翻译水平有限,如有错误,敬请谅解,可以在评论中指出,欢迎交流! 摘要:Hadoop使用了MapReduce编程范式,目前已经被公认为是分布式环境中分析大数据的标准框架.然而,它并不能很好的应用于大规模的计算几何处理.本文介绍的CG_Hadoop是一套可伸缩的和高效的MapReduce算法,用于处理各种基本计算几何问题,例如多边形合并.skyline(轮廓线).convex hull(