HDFS高级操作命令和工具

HDFS高级操作命令和工具

         本文讲解HDFS 的一些高级操作功能,以及通过web 方式查看HDFS 信息的方法。

1. archive

在本地文件系统中,如果文件很少用,但又占用很大空间,可以将其压缩起来,以减少空间使用。在HDFS 中同样也会面临这种问题,一些小文件可能只有几KB 到几十KB,但是在DataNode 中也要单独为其分配一个几十MB 的数据块,同时还要在NameNode 中保存数据块的信息。如果小文件很多的话,对于NameNode 和DataNode 都会带来很大负担。所以HDFS中提供了archive 功能,将文件压缩起来,减少空间使用。

HDFS 的压缩文件的后缀名是.har,一个har 文件中包括文件的元数据(保存在_index和_masterindex)以及具体数据(保存在part-XX)。但是,HDFS 的压缩文件和本地文件系统的压缩文件不同的是:har 文件不能进行二次压缩;另外,har 文件中,原来文件的数据并没有变化,har 文件真正的作用是减少NameNode 和DataNode 过多的空间浪费。简单算一笔账,保存1000 个10K 的文件,不用archive 的话,要用64M×1000,也就是将近63G的空间来保存;用archive 的话,因为总数据量有10M(还需要加上这些文件的_index 和_masterindex,不过很小就是了),只需要一个数据块,也就是64M 的空间就够了。这样的话,节约的空间相当多;如果有十万百万的文件,那节省的空间会更可观。

将文件压缩成.har 文件的格式如下:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. hadoop archive -archiveName name -p <parent><src>*<dest> </span>  


[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. hadoop archive -archiveName zoo.har -p /foo/bar /outputdir </span>  

注意,.har 文件一旦创建之后就不能更改,也不能再次被压缩。如果想给.har 加文件,只能找到原来的文件,重新创建一个。

访问har 文件的内容可以通过指定URL har:///user/data/arch.har 来完成,所以可以通过上节提到的文件操作命令操作har,比如,显示har 文件内容可以用:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. hadoop dfs -ls har:///user/data/arch.har </span>  

查看全部文件可以用:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. hadoop dfs -lsr har:///user/data/arch.har </span>  

压缩完毕后,发现origin 的大小和har 文件中的part-XX 的大小一样,之所以一样的原因是har 压缩文件在文件的数据块占用上做了优化,但是文件本身并未发生变化,只是单纯连接到一起而已。

2. balancer

HDFS 并不会将数据块的副本在集群中均匀分布,一个重要原因就是在已存在的集群中添加和删除DataNode 被视作正常的情形。保存数据块时,NameNode 会从多个角度考虑DataNode 的选择,比如:将副本保存到与第一个副本所在DataNode 所属机架不同的机架上(这里的机架可以认为是若干DataNode 组成的“局域网”,机架内部的DataNode 之间的数据传输的代价远小于机架内部DataNode 和机架外部的数据传输)。
在与正写入文件数据的DataNode 相同的机架上,选择另外的DataNode 放一个副本。在满足以上条件之后,尽量将副本均匀分布。
在默认的副本因子为3 的集群中,一般情况下,数据块的存放策略如下:首先,选择一个DataNode 保存第一个副本;接下来,选择与第一副本所在DataNode 不同的机架保存第二个副本;最后,和第二个副本相同的机架中,选择另外一个DataNode 保存第三个副本。
如果管理员发现某些DataNode 保存数据过多,而某些DataNode 保存数据相对少,那么可以使用hadoop 提供的工具balancer,手动启动内部的均衡过程。
命令如下:

[java]  view plain  copy
  1. hadoop balancer [-threshold <threshold>]   
-threshold 参数是一个0 ~ 100 之间的实数,单位为百分比,默认值为10。这个参数表示:各个DataNode 的利用率(已用空间/ 可用空间)与整个集群的利用率的差值的绝对值的上限。也就是说,如果每个DataNode 的利用率和平均利用率相差不大(小于阈值)的话,可以认为这个集群已经“平衡”了。管理员可以通过Ctrl+C 手动打断balancer。

另外还有一种运行方式,在终端中输入如下命令:

[java]  view plain  copy
  1. start-balancer.sh[–t <therehold>]   
可以启动后台守护进程,也能达到同样效果。-t 选项指定阈值。在“平衡”之后,进程退出,手动关闭进程的方式为:
[java]  view plain  copy
  1. stop-balancer.sh   
3. distcp
distcp(distribution copy)用来在两个HDFS 之间拷贝数据。在HDFS 之间拷贝数据要考虑很多因素,比如,两个HDFS 的版本不同怎么办?两个HDFS 的数据块大小、副本因子各不相同,又该怎么办?不同的数据块分布在不同节点上,如何让传输效率尽量高,等等。
正因如此,HDFS 中专门用distcp 命令完成跨HDFS 数据拷贝。从/src/tools 子目录下的源代码中可以看出,distcp 是一个没有reducer 的MapReduce 过程。

distcp 命令格式如下:

[java]  view plain  copy
  1. hadoop distcp [options] <srcurl>*<desturl>   
<srcurl><desturl> 就是源文件和目标文件的路径,这和fs 中的cp 类似。

Options 选项及含义如表所示:


注:不同版本的HDFS 可以通过http 协议拷贝,那么命令

[java]  view plain  copy
  1. Hadoop distcp hdfs:// dn1:port1/data/file1\    
  2. hdfs:// dn2:port2/data/file2   
可以写成:

[java]  view plain  copy
  1. hadoop distcp hftp:// dn1:port1/data/file1\    
  2. hftp:// dn2:port2/data/file2   

4、dfsadmin

管理员可以通过dfsadmin 管理HDFS。支持的命令选项及含义如表:


HDFS 还提供了通过web 查看HDFS 信息的方式。HDFS 启动之后,会建立web服务,在默认情况下,访问http://namenode-name :50070 即可查看HDFS 的Name Node 信息,如图所示:

通过web 界面可以查看HDFS 的信息,包括总容量、可用容量、DataNodes 的信息、HDFS 运行目录等。点击“Browse the filesystem”可以查看HDFS 的目录结构,

点击“Live Nodes”可以查看当前有效的DataNode 的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值