#1 HDFS存档/归档
存档是用来备份的时候标识用的,说白就是做个标记,表示这个文档在上次备份之后有没有被修改过,比如当月1号,你给全盘做了一次备份,那么所有的文档的存档属性都会被清除,表示备份过了。此后,如果你修改了某个文件,那么这个文件的存档属性就会被加上。当几天后,你再做“增量”备份时候,系统就会只备份那些具有“存档”属性的文件。
每个文件均按块方式存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效。因为大量的小文件会耗尽namenode中的大部分内存(文件大小为5kb,产生的元数据为150kb,得不偿失)。一个1MB的文件以大小为128MB的块存储,使用的是1MB的磁盘空间,而不是128MB。
Hadoop存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少namenode内存使用的同时,允许对文件进行透明的访问。具体说来,Hadoop存档文件可以用作MapReduce的输入。
HDFS归档相当于把所有文件归档在一个文件夹里面了,该文件夹以.har命名的。
当有很多的小文件时,可以通过归档来解决
【归档指令】
Hadoop archive–archiveName myhar.har –p /user/my /user/myhar
# -archiveName 指定归档文件名
# -p 指定要进行归档目录的父目录,支持同时归档多个子目录
# /user/my 归档目录
# /user/myhar 归档文件存放的目录
不足的地方:
1、archive文件占用与原文件相同的硬盘空间;
2、archive文件不支持压缩;
3、archive一旦创建就不能进行修改;
4、archive虽然解决了namenode的空间问题,但是,在执行mapreduce时,会把多个小文件交给同一个mapreduce去split,这会降低mapreduce的效率。
#2 降低副本数
1)首先停止所有节点,修改master节点的hdfs-site.xml文件,设置dfs.relication值为目标值,举个栗子默认为3,设置为2。然后启动hadoop集群。操作后会发现,新增文件会按照新设置的副本数为执行,以前文件的备份数仍是原来的值。即hadoop并不会自动的按照新的备份系数调整原来文件的备份,需要手动完成。
2)手动完成以前文件的备份数修改
执行命令: hadoop fs -setrep 2 /path
#3 删除无用数据
查看HDFS文件大小
hadoop fs -du -h /hive/warehouse
查看HDFS文件大小并排序
hadoop fs -du /hive/warehouse|sort -n
删除数据
hadoop fs -rm <hdfs file>
hadoop fs -rm -r <hdfs dir>
#4 清理Trash回收站
和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期,也就是当系统回收站中的文件/目录在一段时间之后没有被用户回复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大。另外,用户也可以手动清空回收站,清空回收站的操作和删除普通的文件目录是一样的,只不过HDFS会自动检测这个文件目录是不是回收站,如果是,HDFS当然不会再把它放入用户的回收站中了
根据上面的介绍,用户通过命令行即HDFS的shell命令删除某个文件,这个文件并没有立刻从HDFS中删除。相反,HDFS将这个文件重命名,并转移到操作用户的回收站目录中(如/user/hdfs/.Trash/Current, 其中hdfs是操作的用户名)。如果用户的回收站中已经存在了用户当前删除的文件/目录,则HDFS会将这个当前被删除的文件/目录重命名,命名规则很简单就是在这个被删除的文件/目录名后面紧跟一个编号(从1开始知道没有重名为止)。
当文件还在/user/hdfs/.Trash/Current目录时,该文件可以被迅速地恢复。文件在/user/hdfs/.Trash/Current中保存的时间是可配置的,当超过这个时间,Namenode就会将该文件从namespace中删除。 文件的删除,也将释放关联该文件的数据块。注意到,在文件被用户删除和HDFS空闲的增加之间会有一个等待时间延迟。
当被删除的文件还保留在/user/hdfs/.Trash/Current目录中的时候,如果用户想恢复这个文件,可以检索浏览/user/hdfs/.Trash/Current目录并检索该文件。/user/hdfs/.Trash/Current目录仅仅保存被删除 文件的最近一次拷贝。/user/dfs/.Trash/Current目录与其他文件目录没有什么不同,除了一点:HDFS在该目录上应用了一个特殊的策略来自动删除文件,目前的默认策略是 删除保留超过6小时的文件,这个策略以后会定义成可配置的接口。
还有,NameNode是通过后台线程(默认是org.apache.Hadoop.fs.TrashPolicyDefault.Emptier,也可以通过fs.trash.classname指定TrashPolicy类)来定时清空所有用户回收站中的文件/目录的,它每隔interval分钟就清空一次用户回收站。具体的操作步骤是,先检查用户回收站目录/user/用户名/.Trash下的所有yyMMddHHmm形式的目录,然后删除寿命超过interval的目录,最后将当前存放删除的文件/目录的回收站目录/user/用户名/.Trash/current重命名为一个/user/用户名/.Trash/yyMMddHHmm.
从这个回收线程(Emptier)的实现可以看出,被用户用命令删除的文件最多可在其回收站中保存2*interval分钟,最少可保存interval分钟,过了这个有效期,用户删除的文件就永远也不可能恢复了
#5 Balancer重新平衡
hdfs balancer -threshold 10 #10为各节点存储的浮动比例10%上下浮动
threshold后加上一个百分比,这个百分比代表datanode之间的使用差异小于这个值,我们便认为hdfs是平衡的.
在默认的情况下,balancer的过程是非常缓慢的.
Hadoop的开发人员在开发Balancer程序的时候,遵循了以下几点原则:
1)在执行数据重分布的过程中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个rack中所具备的block数量。
2)系统管理员可以通过一条命令启动数据重分布程序或者停止数据重分布程序。
3) Block在移动的过程中,不能暂用过多的资源,如网络带宽。
4) 数据重分布程序在执行的过程中,不能影响name node的正常工作。
Hadoop Balancer运行速度优化
1.修改dfs.datanode.max.transfer.threads = 4096 (如果运行hbase的话建议为16384),指定用于在DataNode间传输block数据的最大线程数,老版本的对应参数为dfs.datanode.max.xcievers
2.修改dfs.datanode.balance.bandwidthPerSec = 31457280 ,指定DataNode用于balancer的带宽为30MB,这个示情况而定,如果交换机性能好点的,完全可以设定为50MB,单位是Byte,如果机器的网卡和交换机的带宽有限,可以适当降低该速度,默认是1048576(1MB)
3.修改dfs.datanode.balance.max.concurrent.moves = 50,指定DataNode上同时用于balance待移动block的最大线程个数,这个值默认是5
4.如果配置没生效或者不合理的话,Balancer会有如下警告信息:
16/09/14 10:10:45 WARN balancer.Dispatcher: Failed to move blk_2056340845_2915024 with size=142227625 from 192.168.1.48:50010:DISK to 192.168.1.37:50010:DISK through 192.168.1.40:50010: Got error, status message opReplaceBlock BP-457606559-192.168.1.30-1258625319448:blk_2056340845_2915024 received exception java.io.IOException: Got error, status message Not able to copy block 1252320440 to /192.168.1.37:39630 because threads quota is exceeded., copy block BP-457606559-192.168.1.30-1258625319448:blk_2056340845_2915024 from /192.168.1.40:50010, block move is failed
5.运行balancer
su hdfs
hdfs dfsadmin -setBalancerBandwidth 104857600 #临时设置带宽
nohup hdfs balancer -threshold 10 & #10为各节点存储的浮动比例10%上下浮动
6.Hadoop Balancer的步骤:
1、从namenode获取datanode磁盘的使用情况
2、计算需要把哪些数据移动到哪些节点
3、分别移动,完成后删除旧的block信息
4、循环执行,直到达到平衡标准