一、拓展资料—— HDFS的常用操作
1.1 HDFS的shell命令
#查看hadoop 命令的脚本
#which查看可执行文件的位置
which hadoop
fs命令调用的java类地址

最后拼到可执行java命令里
直接调用指定类的main(), 通过给main() 传参来调用
1.2 在maven工程中配置hadoop关联仓库
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
2 HDFS的常用操作
hadoop fs 与 hdfs dfs 都调的FsShell 类
下面都用hadoop fs 命令来演示
2.1 列出文件列表 ls
hadoop fs

hdfs dfs

2.1.1 标准写法
hadoop fs -ls hdfs://ns1/
2.1.2 简写
#默认是HDFS系统下的根目录
hadoop fs -ls /
2.1.3 最大单位显示
hadoop fs -ls -h / #文件大小显示为最大单位

2.1.4 递归显示
#如果有子目录,则递归打印
hadoop fs -ls -R /
2.1.5 多个显示参数
#递归打印并且最大单位打印文件
hadoop fs -ls -h -R /

2.2 上传文件/目录 put、copyFromLocal
从主机本地系统到集群HDFS系统。
2.2.1 put

1)上传新文件
#put 左面:是本地,右面是hdfs集群
hadoop fs -put /home/hadoop/test.txt hdfs://ns1/
#hdfs可以简写,默认找的是hdfs
hadoop fs -put /home/hadoop/test.txt /
#当上传时要对文件进行重名
hadoop fs -put test.txt /t1.txt
#当上传时,hdfs存在同样的文件名时,会报文件已存在错误。

2)上传多个文件
#一次上传多个文件到HDFS路径
hadoop fs -put f1 f2 /data

3)上传目录
#上传并重命名目录
hadoop fs -put mypkg /newpkg
4)覆盖上传
#如果HDFS目录中有同名文件会被覆盖
hadoop fs -put -f ~/hadoop/test.txt /
#建议在上传目录的时候不覆盖目录
2.2.2 copyFromLocal
和put的用法雷同,老版本的hadoop用这种方式。
1)上传文件并重命名
hadoop fs -copyFromLocal file:/test.txt hdfs:/test2.txt

2)覆盖上传
hadoop fs -copyFromLocal -f test.txt /test.txt
2.3 下载文件/目录 get、copyToLocal
从集群HDFS到本地文件系统。
2.3.1 get
-get hdfs目录或文件 本地linux系统的目录或文件
1)拷贝文件到本地目录
hadoop fs -get hdfs:/test.txt /home/hadoop/

2)拷贝文件并重命名。可以简写
hadoop fs -get /test.txt ~/hadoop/test.txt
2.3.2 copyToLocal
1)拷贝文件到本地目录
hadoop fs -copyToLocal hdfs:/test.txt file:/home/hadoop/
2)拷贝文件并重命名。可以简写
hadoop fs -copyToLocal /test.txt file:/home/hadoop/test.txt
2.4 拷贝文件/目录 cp
1)从本地到HDFS,同put
如果本地文件以绝对路径表示,本地路径需要加file:
hadoop fs -cp file:/home/hadoop/test/f2 /test_f2

2)从HDFS到HDFS
hadoop fs -cp hdfs://ns1/haha.sh hdfs://ns1/test
hadoop fs -cp hdfs:/exe.sh hdfs:/test
hadoop fs -cp /haha.sh /data


2.5 移动文件 mv
# 标准写法
hadoop fs -mv hdfs:/test.txt hdfs:/dir/test.txt
# 简写方案
hadoop fs -mv /test_f2 /test

2.6 删除文件/目录 rm
执行-rm 命令后,默认是把文件移动到 /user/hadoop/.Trash/Current 下,会根据配置文件配置的清理周期定期清理。
# 在hdfs-site中配置对回收站的垃圾回收时间
<property>
<name>fs.trash.interval</name>
<value>2880</value>
<description>回收周期</description>
</property>
1)删除指定文件
hadoop fs -rm /a.txt
2)删除全部txt文件
hadoop fs -rm /*.txt
3)递归删除全部文件和目录
# hdfs不推荐写法 但是也能对付删
hadoop fs -rmr /dir/
# hdfs的推荐写法
hadoop fs -rm -r /dir/


4)删除之后不放到回收站
hadoop fs -rm -skipTrash /dir
2.7 读取文件 cat
查看文件内容
hadoop fs -cat /test.txt
2.8 读取文件尾部 tail
查看尾部1K字节
hadoop fs -tail /test.txt

2.9 创建空文件 touchz
hadoop fs - touchz /newfile.txt
2.10 写入文件 appendToFile
#读取本地文件内容追加到HDFS文件
hadoop fs -appendToFile file:/test.txt hdfs:/newfile.txt
创建空文件和追加

2.11 创建目录 mkdir
#可以同时创建多个目录
hadoop fs -mkdir /newdir /newdir2
#同时创建父级目录
hadoop fs -mkdir -p /newpkg/newpkg2/newpkg3

2.12 改变文件副本数 setrep
hadoop fs -setrep -R -w 2 /test.txt
-R 递归改变目录下所有文件的副本数。
-w 等待副本数调整完毕后返回。可理解为加了这个参数就是阻塞式的了。


如果想修改块大小,修改配置hdfs-site.xml dfs.blocksize 属性
2.13 获取逻辑空间文件/目录大小 du
#显示HDFS根目录中各文件和文件夹大小
hadoop fs - du /
#以最大单位显示HDFS根目录中各文件和文件夹大小
hadoop fs -du -h /
#仅显示HDFS根目录大小。即各文件和文件夹大小之和
hadoop fs -du -s /

2.14 获取HDFS目录的物理空间信息 count
hadoop fs -count / #显示HDFS根目录在物理空间的信息
查询结果:
第一个数值表示/下的目录的个数(包括其本身);
第二个数值表是当前目录下文件的个数;
第三个数值表示该目录下文件所占的空间大小,这个大小是不计算副本的个数的。

2.15 管理工具hadoop dfsadmin
hdfs dfsadmin
例如:hdfs dfsadmin -report
dfsadmin命令详解
1) -report:
查看文件系统的基本信息和统计信息。
2)-safemode :
安全模式命令。安全模式是NameNode的一种状态,在这种状态下,NameNode不接受对名字空间的更改(只读);不复制或删除块。NameNode在启动时自动进入安全模式,当配置块的最小百分数满足最小副本数的条件时,会自动离开安全模式。enter是进入,leave是离开。
进入安全模式
hdfs dfsadmin -safemode enter


离开安全模式
hdfs dfsadmin -safemode leave

获取安全模式信息
hdfs dfsadmin -safemode get
3) -refreshNodes:
重新读取hosts和exclude文件,使新的节点或需要退出集群的节点能够被NameNode重新识别。这个命令在新增节点或注销节点时用到。
如何动态增加节点?
新增一台s4
1)s4 机器基础环境必须搞好(host、ssh、免密登录root),简单方式直接从s3 克隆一台,
注意:要把s4机器上的/data/dfs 目录删掉,因为在启动datanode 节点时会自动在/data/目录下创建dfs目录。
2)在 etc/hadoop/slave 文件中追加 s4 的主机名
3)在s4 机器上用 hadoop-daemon.sh star 启动s4机器上的datanode
5)用 hdfs dfsadmin -refreshNodes
如何动态删除节点?
1)在hdfs-site.xml 追加属性dfs.hosts.exclude, 该属性配置的参数是配置要删除节点机器的主机名。
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/excludes</value>
</property>
2)在excludes文件中配置要删除节点的主机名
3)分发hdfs-site.xml 和 exludes 文件
4)执行命令 hdfs dfsadmin -refreshNodes,查看WEBUI,节点状态在Decommission In Progress
5)当所有的要退役的节点都报告为Decommissioned,数据转移工作已经完成
注意:【退役后的节点数要≥ 设置的副本数,否则会一直留在退役中】。
解释:
① 设置hdfs副本数为2
② 上传数据到hdfs,会有两个副本

③ 将三个datanode机器的s2.hadoop 退役,webUI显示s2.hadoop 正在退役,在退役时,会复制该节点数据到其他节点

④ 已经将s2.hadoop 数据复制到了s3.hadoop上,当复制完成后,就编程已退役状态。

⑤ 查看 /zookeeper-3.4.8.tar.gz 文件块位置

4) -metasave filename:
保存NameNode的主要数据结构到hadoop.log.dir属性指定的目录下的<filename> 文件中。
#在hadoop日志目录下创建namenode的数据结构信息
hdfs dfsadmin -metasave namenode_data
HDFS副本摆放策略
第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上;
第二副本:放置在于第一个副本不同的机架的节点上;
第三副本:与第二个副本相同机架的不同节点上;
如果还有更多的副本:随机放在节点中;

需要注意的是:
HDFS负载均衡
Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不平衡时,Map任务可能会分配到没有存储数据的机器,这将导致网络带宽的消耗,也无法很好的进行本地计算。
当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。进行数据的负载均衡调整,必须要满足如下原则:
数据平衡不能导致数据块减少,数据块备份丢失
管理员可以中止数据平衡进程
每次移动的数据量以及占用的网络资源,必须是可控的
数据均衡过程,不能影响namenode的正常工作
Hadoop HDFS数据负载均衡原理
数据均衡过程的核心是一个数据均衡算法,该数据均衡算法将不断迭代数据均衡逻辑,直至集群内数据均衡为止。该数据均衡算法每次迭代的逻辑如下:

步骤分析如下:
数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况
Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径
开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块
将复制的数据块复制到目标DataNode上
删除原始数据块
目标DataNode向Proxy Source Data Node确认该数据块迁移完成
Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准
Hadoop HDFS 数据自动平衡脚本使用方法
在Hadoop中,包含一个start-balancer.sh脚本,通过运行这个工具,启动HDFS数据均衡服务。该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。HadoopHome/bin目录下的start−balancer.sh脚本就是该任务的启动脚本。启动命令为:‘HadoopHome/bin目录下的start−balancer.sh脚本就是该任务的启动脚本。启动命令为:‘Hadoop_home/bin/start-balancer.sh –threshold`
影响Balancer的几个参数:
示例如下:
#启动数据均衡,默认阈值为 10%
$Hadoop_home/bin/start-balancer.sh
#启动数据均衡,阈值 5%
bin/start-balancer.sh –threshold 5
#停止数据均衡
$Hadoop_home/bin/stop-balancer.sh
在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制
<property>
2
<name>dfs.balance.bandwidthPerSec</name>
3
<value>1048576</value>
4
<description>根据每秒字节数指定每个数据节点可用于平衡的最大带宽</description>
5
</property>
以上资料均来源自互联网