HDFS的shell操作:
什么是HDFS,HDFS就是用来管理多台机器上的文件,就是分布式文件管理系统。
HDFS用来存储文件,是一个文件系统,通过目录树来定位文件。是有很多台服务器联合起来实现他的功能的。
适合一次写入,多次读出的场景,并且不支持文件的修改,适合用作数据分析,但是不适合作为网盘。
HDFS的优缺点
优点:
高容错性,数据自动保存副本,通过增加副本的形式,提高容错性。某一个副本丢失之后,可以自动恢复。(在另一台主机上进行恢复)。若集群的数量足够多 ,则可以在任意时间总是保持着定义的副本的数量。
适合处理大数据数据规模:能够处理数据规模达到GB、TB,甚至PB级别的数据。文件规模:能够处理百万规模以上的文件数量,数量相当之大。
可以构建在许多廉价的机器上,通过多副本机制,从而提高整个集群的可靠性。
缺点:
不适合去做低时延的数据的访问,比如说,进行毫秒级的存储或者查询数据是做不到的。
无法高效的对大量的小文件进行存储。因为大量的小文件仍然是会需要大量的内存来进行存储目录信息和快信息。但是namenode的总内存容量是有限制的。如果寻址时间大于读取时间,违反了该系统的设计的目标。
不知处并发的写入,不支持文件的随机修改(就是在文件的任意位置进行修改)。
一个文件只能有一个写,不允许多个线程同时写入;仅支持数据追加(append),不支持文件的随机修改。
HDFS的组成架构
NameNode(nn):
就是master,是一个主管、管理者。(1) 管理HDFS的名称空间;(2) 配置副本策略;(3) 管理数据块(Block)映射信息;(4) 处理客户端读写请求。
DataNode(dn):
就是slave(可以理解为就是namenode的奴隶)执行命令。(1) 存储实际的数据块;(2) 执行数据块的读/写操作。
Client:
客户端。(1) 文件切片。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;注意,文件切片是Client完成的。文件的位置信息;(3) 与DataNode交互,读取或写入数据;(4)Client提供一些命令来管理HDFS,比如NameNode格式化;(5)Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作。
SecondaryNameNode:
并非NameNode的热备。当NameNode挂掉时,它不会马上替换NameNode并提供服务。(1) 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode;(2) 紧急情况下,可以辅助恢复NameNode。(注意是辅助恢复,并不可以将其完全恢复。)
HDFS的文件块的大小:
HDFS中的文件在物理上式分块存储的(Block),块的大小可以通过参数dfs.blocksize设置,在Hadoop2.X版本中。默认的大小是128MB,老版本的默认大小是64MB,本地运行的大小是32MB。
计算方法:对于集群中的n个block,如果对于每一个文件的寻址时间为10ms,之后有一个经过试验中计算出来的方法就是寻址时间为传输时间的1%的时候为最佳状态,之后我们可以得到传输时间为10ms100=1000ms。对于不同的硬盘的传输速度来说,设其传输速率为100MB/s的时候,1000ms100MB/s=100MB,所以对于每一个block的大小约为100MB,100MB与2的次方数就是2的7次方距离比较近。所以他们的大小可以设置为128MB。
问题1:为什么块的大小不可以设置的这么大,而且不可以设置的这么小。
设置的太大,会将从磁盘传输数据的时间会明显大于1%最佳状态,会导致计算机一直处于处理这个快的状态,导致程序在处理这个块的时候耗费大量时间,所以不可以设置的太大。
设置的太小的时候,会增加寻址时间,是程序一直处于在寻找块的开始的位置,会导致效率低下。
总的来说,HDFS的块的大小主要取决于磁盘的传输速率的大小。
从Hadoop1.x到hadoop2.x块的大小变大了的一个原因就是随着技术的发展磁盘的传输速率变快了。
HDFS的shell操作。
shell命令的操作的都在hadoop家目录的bin目录下。
而且有两种命令是完全相同的,就是bin/hadoop fs和bin/hdfs dfs,其中dfs是hdfs的实现类。
常用的命令:
启动hadoop集群:
sbin/start-dfs.sh,在namenode上才可以执行。
sbin/start-yarn.sh,在resourcemanager上才可以执行。
输出命令的帮助信息:
hadoop fs -help rm,输出关于hdfs上的rm命令的帮助信息。
显示目录信息:
hadoop fs -ls [目录位置],显示固定目录位置上的目录的信息。
创建目录:
hadoop fs -mkdir -p /tmp/test。-p是可以递归创建。
本地剪切到HDFS上:
hadoop fs -moveFromLocal /tmp/zhangsan.txt /tmp/test/zhangsan.txt,讲本地上的zhangsan.txt剪切到HDFS上的某一目录下,并且可以进行重命名。命令执行之后本地上就没有课zhangsan.txt文件。
追加一个文件到已经存在的文件的末尾:
hadoop fs -appendToFile /tmp/name.txt /tmp/test/zhangsan.txt,讲name.txt文件追加到zhangsan.txt文件中。
显示文件内容:
hdfs dfs -cat /tmp/zhangsan.txt
改变文件的权限:
hadoop fs -chmod 666 /tmp/test/zhangsan.txt
hadoop fs -chown root:root /tmp/test/zhangsan.txt
从本地文件中拷贝到HDFS路径中:
hadoop fs -copyFromLocal /tmp/lisi.txt /tmp/test,与-moveFromLocal不同的是,在该命令执行之后原本的本地文件是仍然存在的。
等同于-put
从HDFS上拷贝文件到本地:
hadoop fs -copyToLocal /tmp/test/zhangsan.txt /tmp,与上一个命令可以理解为反向操作。
等同于-get
载多个文件,比如HDFS的目录/logs下有log.1、log.2、log.3、……
hadoop fs -getmerge /tmp/test/* ./all.txt
trep:设置HDFS中文件的副本数量
hadoop fs -setrep 10 /tmp/test/lisi.txt,可以将指定文件的副本的数量设置为任意值,前提是该集群上的机器足够多,默认值是3。
maven简介
maven是一个项目管理工具,可以做到对java项目的构建管理,和java项目的依赖管理。
maven的环境变量的配置:
在/etc/profile.d/目录下创建文件maven.sh并且输入以下内容。
export MAVEN_HOME=/opt/apache-maven-3.0.5
export M2_HOME=
M
A
V
E
N
H
O
M
E
e
x
p
o
r
t
P
A
T
H
=
MAVEN_HOME export PATH=
MAVENHOMEexportPATH=PATH:$M2_HOME/bin
在配置完成之后要进行source /etc/profile之后进行检查配置是否成功:
执行命令mvn -v
在maven执行任务或者目标的时候,会从当前目录中查找pom.xml文件并读取改文件,从而获得所需要的配置信息之后执行目标。
在pom.xml中可以进行确定配置:
项目依赖
插件
执行项目
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息
maven仓库:
有三个仓库,分别是本地仓库,中央仓库和远程仓库
对于maven的依赖的搜索顺序如下:
在本地仓库中寻找,其次在中央仓库里寻找,最后再在远程仓库寻找。(当然如果远程仓库并没有被定义,它就会在前两个仓库里面寻找,如果找不到依赖就直接抛出错误)。如果进行到了在远程仓库里寻找的条件下,找到了之后就会在本地仓库里面下载那些依赖,以后在使用的时候就可以直接在本地仓库下面找到了。
由于在中国对以下外国网站的访问并不友好,所以可以将一些依赖的下载的默认网址进行改变:在maven家目录下的conf/settings.xml文件,在mirrors节点上添加以下内容:
在maven使用maven创建的项目路径下的pom.xml文件下添加以下内容:目的是与上面做的工作保持一致:
使用maven构建java项目:
maven要想创建一个java项目,需要使用maven-archetype-quickstart插件。
使用该插件创建java项目时的命令格式如下:
mvn archetype:generate “-Dgroup=edu.nefu.hadoop” “-Dartifactld=mavenTest” “-DarchtypeArtifactld=maven-archetype-quickstart” “-DinteractiveMode=false”
-Dgroup:组织名,是公司的网址的反写+一般与package同名
-Dartifactld:项目名(模块名)
-DarchtypeArtifactld:制定使用的插件是哪个
-DinteractiveMode:是否使用交互模式
创建hdfs-mkdir项目之后使用命令tree hdfs-mkdir/
mvn archetype:generate “-Dgroup=edu.nefu.hadoop” “-Dartifactld=mavenTest” “-DarchtypeArtifactld=maven-archetype-quickstart” “-DinteractiveMode=false”
导入依赖到该项目下的pom.xml中:
之后编辑App.java:
1.首先建立一个配置文件对象:configuration,之后可以在文件内部来修改改配置对象,使它可以在该API中起到配置的作用。
2.获取hdfs客户端对象:
FileSystem fs = FileSystem.get(new URI(“hdfs://hadoop1:9000”), conf, “root”);第一个参数指定网址,第二个参数制定配置,第三个参数指定用户。
3.创建路径的步骤:
fs.mkdir(new Path("/0x00/usr"));创建路径的函数。API
4.关闭资源:
fs.close();
注意在关闭资源和申请资源的时候可能会出现异常的情况,所以要在该类下面抛出异常。
在编辑完成之后使用命令mvn clean之后实用命令mvn package;之后运行发现出错,找不到包。解决方法:
在pom.xml文件中添加plugin,artifacatId:maven-jar-pluginmaven-dependency-plugin
之后运行之后会发现出现日志报警,我们可以在${MAVEN_HOME}/src/main/resource路径下添加日志配置文件log4j.propertiles
并在里面写入:
log4j.rootLogger=INFO,stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%nlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/spring.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
可以预防日志报警
运行命令:java -cp target/hdfs-mkdir-1.0-…(打包的结果) com.root.App最后执行成功。
HDFS的API操作
文件上传:
fs.copyFromLocalFile(new Path(“D:/xin.txt”),new Path("/0811/xinnew.txt"));
文件下载:
fs.copyToLocalFile(new Path(“D:/xin.txt”),new Path("/0811/xinnew.txt"));
文件删除:
fs.delete(new Path(“a.txt”));
文件名更改:
fs.rename(new Path(“a.txt”), new Path(“b.txt”));
文件详情查看
fs.listFiles(Path f,boolean recursive),recursive是否递归查看,不是cat,相当于ls
文件和文件夹判断:
fs.listStatus(Path files);
测试参数的优先级:
通过上传文件夹之前修改参数配置replication来进行测试参数的优先级。
NN和2NN的工作机制
元数据在namenode中不可以放在磁盘里,因为是经常要进行随机访问的,而且还要响应客户的请求,所以namemode中存放元数据的位置是内存。但是元数据放在内存中也有缺点,但凡出现了断电的情况就直接整个集群无法工作了。所以他还应该在磁盘中备份这内存中的数据。使得集群在修理或者断电之后仍然可以正确地进行工作。备份的文件叫fsimage。但是并不是当内存中的数据更新的时候就直接更新fsomage文件,这样子做就会导致效率极其低下。但是如果不对他进行更新操作,一旦namenode断电仍然会造成数据的丢失。在解决这个问题上,采用了引入文件edits文件,改文件可以只进行文件追加的操作,效率很高。每当有元数据更新的或者增加的时候就会修改内存中的元数据,并且将该命令追加到edits中。所以一旦出现断电的情况我们就可以合并fsimage文件edits文件,合成元数据。但是,由于长时间的添加数据到edits中,就会导致该文件特别大,所以我们要进行定时的合并,这个操作如果还是由namenode来做,仍然会导致效率的降低,所以引入一个新的节点:secondarynamenode专门用于合并fsimage和edits文件。
checkpoint执行的条件,edits文件已满,或者定时的时间到了。
在执行合并的时候是需要一个新的edits来记录在合并过程中出现的用户的操作的。
之后合并得到的结果,2NN传给NN之后NN将他重命名为fsimage用来代替之前的faimage。为了得到NN是否需要执行合并的操作(edits是否已经满了),2NN需要每个一段时间想NN发出询问。
在开机的时候,将NN中的fsimage和Edits文件加载到内存,即在开机的时候用的就是NN将两个文件合并的。
fsimage和edits解析
查看fsimage命令:hdfs oiv
参数:
-p: 选择文件的处理器
-i: 输入的文件
-o: 输出的文件
bin/hdfs oiv -p XML -i fsimage_xxx -o fsimage.xml
XML是文件的处理器,否则文件的格式不适合认为阅读。将查看的文件用XML处理器输出为fsimage.xml文件之后,可以用cat进行查看。
查看edits命令:hdfs oev
参数:
-p: 选择文件的处理器
-i: 输入的文件
-o: 输出的文件
bin/hdfs oev -p XML -i edits_xxx -o edits.xml
XML是文件的处理器,否则文件的格式不适合认为阅读。将查看的文件用XML处理器输出为edits.xml文件之后,可以用cat进行查看。
NN和2NN工作情况查看
- 重新格式化NameNode
- 启动集群
- 创建路径hadoop fs -mkdir -p /user/root/input
- 上传文件hadoop fs -put test.txt /user/root/input5. 查看fsimage和edits
checkpoint实践设置
通常情况下,2NN每隔一个小时执行一次:可以再hdfs-default.xml中自定义checkpoint时间的。
这里的value是以秒为单位的。
另一种checkpoint时间设置就是检查操作条目已经满了。
比如当操作条目达到了100000的时候就执行一次checkpoint可以这么设置:
这里的一分钟检查一次操作数条目的意思就是说每隔60秒就像NN发出是否要进行checkpoint操作的询问,在得到同意之后就会进行checkpoint操作,合并fsimage和edits文件,并向NN发送新的fsimage文件。
NameNode的故障恢复
当Namenode发生了故障的时候,我们知到再2NN中是存在NN的之前的某个时间的fsimage数据的,所以,我们可以经过把2NN中的/opt/hadoop-2.7.2/data/tmp/dfs/namesecondary/* 拷贝到当前NN的文件中的name文件夹下,用来替代fsimage和edits。从而实现手动的故障恢复。
从这里也可以看出来2NN只是可以起到当NN出现故障的时候,恢复NN中的一部分数据,根本不可能保证完全将NN中的数据进行恢复。所以不能说是2NN是NN的一个热备。
模拟NN出现故障之后的修复:
可以用kill -9 namenode pid来将namenode进程杀死来模拟当前namenode出现了BUG。然后将NameNode内部存储的数据全部删除在文件夹/opt/hadoop-2.7.2/data/tmp/dfs/name内的数据全部删除。之后将SecondaryNameNode中的备份的数据拷贝到之前的name的文件夹下。最后重新启动namenode就可以了。
当然如果说出现了错误就需要我们去手工将他恢复的话,我们那么该文件系统是存在很大的缺陷的,所以仍然有一中可以自动去恢复的配置:
可以修改hdfs-site.xml文件,为了实验的快速进行。
修改文件之后要记得向集群内其他的机器进行分发。
将checkpoint的周期调成2分钟,主要是为了实验可以快速地进行。第二个必须要显示地指出来name是在哪儿。
之后使用kill -9命令将namenode进程杀死。并且删除name文件夹下的全部内容,以模拟当前的namenode出现了不可自行恢复的问题。
./bin/hdfs namenode -importCheckpoint是导入检查点数据的命令。
将secondarynamenode中的数据拷贝到namenode上之后一定要将锁文件in_use.lock删除之后才可以使用。
集群的安全模式
处于安全模式下的集群,namenode的文件系统是只读的。
namenode启动的全过程,整个集群都是处于安全模式下的。包括以下步骤:
fsimage载入内存,执行edits;一旦成功建立文件系统元数据影响,就新建fsimage和一个空的编辑日志。意思就是将原来的fsimage和edits在namenode上合并之后载入到内存里之后,就可以将内存中的内容序列化为fsimage文件,成为新的fsimage文件,之后创建一个新的edits文件。namenode开始监听datanode的请求。
datanode启动
系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储datanode上的。
系统正常的时候namenode内存保留所有块位置的映射信息。
安全模式下,各个datanode会向namenode发送最新的块列表信息。
安全模式的退出条件
满足“最小副本条件”,namenode会在30秒之后退出安全模式。所谓的最小副本条件就是99.9%的块都满足最小副本条件(默认值不是3,而是1)。在启动一个刚刚格式化之后HDFS集群的时候,由于系统中没有任何的块,而且name文件夹下的内容为空。甚至可以说没有那么文件夹,就是不会出现将fsiamge和edits两个文件夹合并的情况。所以namenode不会进入安全模式。
集群处于安全模式的时候不可以执行写操作,等到集群启动完成后,就会自动退出安全模式。
1.查看当前集群的状态:bin/hdfs dfsadmin -safemode get
2.进入:bin/hdfs dfsadmin -safemode enter
3.离开:bin/hdfs dfsadmin -safemode leave
4.等待:bin/hdfs dfsadmin -safemode wait
创建脚本,内容如下:
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put $HADOOP_HOME/README.txt /
EOF
该脚本的作用就是可以等待安全模式退出之后执行-put操作,可以把操作执行。可以在先进入安全模式之后执行该命令之后执行该脚本,之后检查HDFS,发现并没有该文件,之后执行命令leave命令退出安全模式,再检查HDFS发现了该文件。
namenode的多目录机制
namenode的本地目录,也就是name目录可以配置成多个,并且每一个目录存放的内容完全相同,增加了可靠性。
具体的配置方式:
再hdfs-site.xml文件中增加,以确定name目录存在的位置,设置几个位置就会有几个namenode的name目录。
之后停止集群之后删除data和logs中的所有数据。
格式化之后并启动。
DateNode的工作机制
心跳每三秒都有一次,但是可能由于网络等原因导致不同,并不会立马就把他当成退役节点。会在十分钟之后再做决定。
每周期datanode都要向namenode上报所有的块信息。
数据完整性
对于数据完整性,可以使用奇偶校验码或者CRC冗余校验码来进行数据的完整性的检查。
超时时限的检查
若某一次的检查发现了什么不理想的状态,此时让然不会对其放弃检查,让会对其发送检查信号,若连续一个时间段,对其进行的检查都是这个样子,就会认定其出现了某种问题,以做出某种行为。
注意不是10分钟,是10分钟零30秒。
集群的扩展,加新的主机
首先安装虚拟机,之后安装JDK和Hadoop,并配置文件。
如果是从本集群上其他主机上拷贝过来的,拷贝过来之后需要删去留存的文件data和logs,这两个目录在新安装hadoop的机器上是不存在的。
之后新节点服役的步骤就是直接启动datanode和nodemanager,就可以关联到集群了,启动命令:
sbin/hadoop-daemon.sh start datanode
sbin/yarn.daemon.sh start nodemanager
白名单黑名单
显然如果任何一台主机就可以任意加入到集群中是不安全的,所以hadoop为其设置了 一个白名单,规定只有再白名单之内的主机才可以加入到集群,其余的主机再一定的时间之后就无法再与集群区得联系了,会被退出。
白名单就是:HADOOP_HOME/etc/hadoop路径下创建的dfs.host文件。直接添加主机名,每一行代表一个主机名,不可以有空格,不可以有table,只可以用回车进行换行。
可以在hdfs-site.xml的配置文件中指明hosts的路径位置。
之后要将该配置文件分发至全部集群。之后刷新namenode,命令如下:
hdfs dfsadmin -refreshNodes
之后更新resourcemanager结点,命令如下:
yarn dfsadmin -refreshNodes
由于新添加了新的结点,可能会导致数据的不平衡,老节点上存在很多的数据,新节点上的数据为0, 所以我们可以使用命令sbin/start-balancr.sh来进行集群中的各个数据结点上的数据的平衡。
黑名单的退役经历。在黑名单上的主机会被强制性的退出。
黑名单的位置与白名单的位置相同,只不过默认名字叫dfs.hosts.exclude文件,添加要退役的结点的主机名称。要保证在黑名单和白名单上的出现的主机名千万不可以相同,这样会导致集群系统出现混乱,
退役之后的结点的webUI上并不是直接不现实了,而是显示该结点正在退役中。执行顺序与白名单的实验的步骤相似。
datanode的多目录配置
datanode也可以配置成多个目录,每个目录存储的数据不一样,也就是说数据不是副本,与namenode完全不同,namenode是完全相同的数据,但是这里的数据是不同的。
在hdfs-site.xml中配置如下:
步骤与之前的实验namenode的多目录设置相似的。
集群间的数据拷贝
在集群内布的数据的拷贝有两种:
1.推:scp -r hello.txt root@hadoop2:/tmp
2.拉:scp -r root@hadoop2:/hello.txt /tmp/hello.txt
3.通过一个主机实现两个其他主机上的数据的拷贝:
scp -r root@hadoop2:/tmp/hello.txt root@hadoop3:/tmp
在集群之间的数据的拷贝方法需要使用distcp命令。
bin/hadoop distcp hdfs://hadoop1:9000/user/root/hello.txt hdfs://hadoop2:9000/user/root/hello.txt
该命令实现的是两个集群之间数据的拷贝,不是直接将一个集群拷贝成另一个集群。而是A集群上的某一台机器向B集群上某一台机器的拷贝。
当然也可以实现两个集群全部的拷贝。命令:
bin/hadoop distcp hdfs://hadoop1:9000/ hdfs://hadoop2:9000/ 即将HDFS上的根目录进行拷贝。
小文件存档
HDFS对于每一个文件,无论大小都会按块存储,每一个块的元数据都会存储在namenode的内存中,因此HDFS存储小文件的效率很低。
大量的小文件会耗尽namenode中的大部分的内存,存储小文件的所需要的磁盘容量和数据块的大小无关,在块大小为64和128的块中存储1MB的文件,所占的空间是相同的。比如1MB文件设置为128MB的块存储,但是手机上使用的是1MB的磁盘空间,并不是128MB。
用HAR文件去归档小文件之后在HDFS上存储会变得比较高效。它将文件存入HDFS块,以减少NameNode的内存的使用的同时,允许对文件进行透明的访问。
具体来说,hdfs归档文件对该文件内部仍然是一个独立的文件,队Namenode而言,他是一个整体的文件,减少了NameNode的内存。
图示:
进行小文件归档的时候要启动yarn进程。
sbin/start-yarn.sh
归档文件
将/usr/root/input目录下的数据归档之后存储到HDFS的/usr/root/output路径下
使用命令:
bin/hadoop archive -archiveName input.har -p /user/root/input /user/root/output,将前一个路径中 的全部文件都归档之后,命名为input.har之后存储到第二个路径当中。
对归档文件的查看命令:
hadoop fs -ls -R /user/root/outpur/input.har
hdfs dfs -ls -R har:///user/root/output/input.har
解归档文件
hadoop fs -cp har:///user/root/output/input.har/ /usr/root*
注意这里必须要有路径下的全部的小文件,就是要有*才可以。
回收站
回收站功能就像Windows中的回收站功能,可以将已经删除的文件,但是仍然没有超时(超时就会删除超时的文件)的前提下还原,用来恢复原来的数据。
起到了防止误删和备份的作用,在默认的情况下,HDFS的回收站是关闭的。
开启回收站功能的实验:
在core-site.xml中可以配置一个变量的值:fs.trash.interval=0,0代表的是回收站关闭状态,其他的值就表示文件的存活时间。而fs.trash.checkpoint.interval表示的是检查回收站的间隔时间,如果该值设置为0,代表的是与fs.trash.interval的值设置的完全相同。
工作原理:
每隔一个fs.trash.checkpoint.interval就会检查回收站,如果回收站中存在时间大于fs.trash.interval的文件存在,就将该文件从回收站中删除。
一种规定,是要要求fs.trash.checkpoint.interval <= fs.trash.interval
启动回收站的操作步骤:
在core-site.xml文件中添加如下内容
查看回收站,回收站在HDFS集群中的路径:/user/root/.Trash/…
修改访问回收站的用户的名称,默认的情况下是dr.who修改为root也是在core-site.xml文件中修改的。
注意通过JAVA API程序删除的文件并不会在回收站中存储一段时间,需要调用函数moveToTrash()才会进入回收站。
Trash t = new Trash();
t.moveToTrash(path);
恢复回收站中的数据的命令:
hadoop fs -mv /user/root/.Trash/Current/user/root/input/ /user/root/input说白了就是将回收站当作一个正常的路径之后进行mv操作就好。
清空回收站的命令:
hadoop fs -expunge,将回收站中的全部内容全部清空,无论是不是过了超时时间。
Hadoop快照
快照管理就相当于对目录做一个备份,注意是对目录做备份,并不是对文件做备份,不会立即复制所有文件,而是指向同一个文件,当写入发生的时候才会产生新文件。
关于快照的一些命令:
开启指定目录的快照功能:
hdfs dfsadmin -allowSnapshot 路径
禁用指定目录的快照功能:(默认就是禁用的)。
hdfs dfsadmin -disallowSnapshot 路径
创建快照,默认名字为当前时间戳:
hdfs dfs -createSnapshot 路径
也可以指定名称创建快照:
hdfs dfs -createSnapshot 路径 名称
对快照重命名:
hdfs dfs -renameSnapshot 路径 旧名称 新名称
比较两个快照不同之处:
hdfs snapshotDiff 路径1 路径2
删除快照:
hdfs dfs -deleteSnapshot 路径 名称
列出当前用户所有的可以进行快照的目录:
hdfs lsSnapshottableDir
HDFS写过程
节点距离的计算
在HDFS写数据的过程中,NameNode会选择距离与待上传数据最近的DataNode接受数据。
节点距离:两个节点到达最近的共同祖先的距离的总和
注意,某一节点到达其自身的距离是0。
HDFS读过程
读数据的时候也是会选择最近的节点距离。
改图中为了说明两个block可能实在不同的节点上的,所以就从两个节点上读的数据,但实际情况下,还是都会从距离最近的节点上读取的。