目录
一.伪分布式的搭建
1.1 伪分布式模式介绍
1.特点
- 在一台机器上安装,使用的是分布式思想,即分布式文件系统,非本地文件系统。
- Hdfs涉及到的相关守护进程(namenode,datanode,secondarynamenode)都运行在一台机器上,都是独立的java进程。
2. 用途
比Standalone mode 多了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交
互。
1.2 平台软件说明
- 操作系统: win10/win7
- 虚拟软件: VMware14
- 虚拟机: 主机名:xxx01 ip:192.168.10.101
- 软件包存储路径: ~
- 软件安装路径: /usr/local/
- Jdk: jdk-8u221-linux-x64.tar.gz
- Hadoop: hadoop-2.7.6.tar.gz
- 用户: root
1.3 伪分布式环境搭建需求
1.3.1 环境需求
--1. 确保防火墙是关闭的.
--2. NAT模式和静态IP的确定 (192.168.10.101)
--3. 确保/etc/hosts文件里 ip和hostname的映射关系
--4. 确保免密登陆localhost有效
--5. jdk和hadoop的环境变量配置
1.3.2 防火墙关闭确认
[root@xxx01 ~]# systemctl stop firewalld
[root@xxx01 ~]# systemctl disable firewalld.service
[root@xxx01 ~]# systemctl stop NetworkManager
[root@xxx01 ~]# systemctl disable NetworkManager
#最好也把selinux关闭掉,这是linux系统的一个安全机制,进入文件中将SELINUX设置为disabled
[root@xxxx01 ~]# vi /etc/selinux/config
.........
SELINUX=disabled
1.3.3 配置映射
-- 进入hosts文件,配置一下ip和hostname
[root@xxx01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.101 xxx01 <====添加本机的静态IP和本机的主机名之间的映射关系
1.3.4 确保ssh对localhost的免密认证有效
-1. 使用rsa加密技术,生成公钥和私钥。一路回车即可
[root@xxx01 ~]# ssh-keygen -t rsa
-2. 进入~/.ssh目录下,使用ssh-copy-id命令
[root@xxx01 .ssh]# ssh-copy-id root@localhost
-3. 进行验证,去掉第一次的询问(yes/no)
[hadoop@xxx01 .ssh]# ssh localhost
1.3.5 安装jdk和hadoop配置相关环境变量
-1. 上传和解压两个软件包
[root@xxx01 ~]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /usr/local/
[root@xxx01 ~]# tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/
-2. 进入local里,给两个软件更名
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv 1.8.0_221/ jdk
[root@xxx01 local]# mv hadoop-2.7.6/ hadoop
-3. 配置环境变量
[hadoop@xxx01 local]# vi /etc/profile
.....省略...........
#java environment
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#hadoop environment
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
1.4 伪分布式相关文件的配置
1.4.1 core-site.xml的配置
[root@xxx01 ~]# cd $HADOOP_HOME/etc/hadoop
[root@xxx01 hadoop]# vi core-site.xml
<configuration>
<!-- 配置分布式文件系统的schema和ip以及port,默认8020-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost/</value>
</property>
</configuration>
扩展: hadoop1.x的默认端口是9000,hadoop2.x的默认端口是8020,使用哪一个都可以
1.4.2 hdfs-site.xml的配置
<configuration>
<!-- 配置副本数,注意,伪分布模式只能是1。-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
1.4.3 hadoop-env.sh的配置
[root@xxx01 hadoop]# vi hadoop-env.sh
................
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk
..................
1.5 格式化Namenode
1.5.1 格式化命令
[root@xxx01 hadoop]# hdfs namenode -format
1.6 启动HDFS
1.6.1 启动伪分布式
[root@xxx01 hadoop]# start-dfs.sh
1.6.2 查看启动进程
[root@xxx01 hadoop]# jps
namenode
datanode
secondarynamenode
二.完全分布式搭建
2.1 完全分布式模式介绍
完全分布式,指的是在真实环境下,使用多台机器,共同配合,来构建一个完整的分布式文件系统。
在真实环境中,hdfs中的相关守护进程也会分布在不同的机器中,比如:
-1. namenode守护进程尽可能的单独部署在一台硬件性能相对来说比较好的机器中。
-2. 其他的每台机器上都会部署一个datanode守护进程,一般的硬件环境即可。
-3. secondarynamenode守护进程最好不要和namenode在同一台机器上。
2.2 平台软件说明
- 操作系统: win10/win7
- 虚拟软件: VMware14
- 虚拟机:
主机名 IP
xxx01 192.168.10.101
xxx02 192.168.10.102
xxx03 192.168.10.103
- 软件包存储路径: /root/
- 软件安装路径: /usr/local/
- Jdk: jdk-8u221-linux-x64.tar.gz
- Hadoop: hadoop-2.7.6.tar.gz
- 用户: root
切记,切记,切记:
实际生产环境中,我们不会使用root用户来搭建和管理hdfs,而是使用普通用户。这里为了方便学习,我们才使用的root用户。
注意,注意,注意:
1.如果你是从伪分布式过来的,最好先把伪分布式的相关守护进程关闭:stop-all.sh
2.删除原来伪分布式的相关设置
如果原来使用的是默认路径,现在已经没有用了
如果原来使用的跟现在全分布式路径一样,因为这里跟之前的初始化的内容不一样,而且这个文件要让系统自动生成
综上:要删除掉namenode和datanode的目录
2.3 守护进程布局
xxx01: namenode,datanode,ResourceManager,nodemanager
xxx02: datanode,nodemanager,secondarynamenode
xxx03: datanode,nodemanager
2.4 完全分布式搭建环境需求
2.4.1 环境需求说明
-1. 三台机器的防火墙必须是关闭的.
-2. 确保三台机器的网络配置畅通(NAT模式,静态IP,主机名的配置)
-3. 确保/etc/hosts文件配置了ip和hostname的映射关系
-4. 确保配置了三台机器的免密登陆认证(克隆会更加方便)
-5. 确保所有机器时间同步
-6. jdk和hadoop的环境变量配置
2.4.2 关闭防火墙
[root@xxx01 ~]# systemctl stop firewalld
[root@xxx01 ~]# systemctl disable firewalld
[root@xxx01 ~]# systemctl stop NetworkManager
[root@xxx01 ~]# systemctl disable NetworkManager
#最好也把selinux关闭掉,这是linux系统的一个安全机制,进入文件中将SELINUX设置为disabled
[root@xxx01 ~]# vi /etc/selinux/config
.........
SELINUX=disabled
.........
2.4.3 静态IP和映射配置
--1. 配置静态IP(确保NAT模式)
[root@xxx01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
............
BOOTPROTO=static #将dhcp改为static
............
ONBOOT=yes #将no改为yes
IPADDR=192.168.10.101 #添加IPADDR属性和ip地址
PREFIX=24 #添加NETMASK=255.255.255.0或者PREFIX=24
GATEWAY=192.168.10.2 #添加网关GATEWAY
DNS1=114.114.114.114 #添加DNS1和备份DNS
DNS2=8.8.8.8
--2. 重启网络服务
[root@xxx01 ~]# systemctl restart network
或者
[root@xxx01 ~]# service network restart
--3. 修改主机名(如果修改过,请略过这一步)
[root@localhost ~]# hostnamectl set-hostname xxx01
或者
[root@localhost ~]# vi /etc/hostname
xxx01
[root@xxx01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.101 xxx01 #添加本机的静态IP和本机的主机名之间的映射关系
192.168.10.102 xxx02
192.168.10.103 xxx03
2.4.4 免密登录认证
-1. 使用rsa加密技术,生成公钥和私钥。一路回车即可
[root@xxx01 ~]# cd ~
[root@xxx01 ~]# ssh-keygen -t rsa
-2. 进入~/.ssh目录下,使用ssh-copy-id命令
[root@xxx01 ~]# cd ~/.ssh
[root@xxx01 .ssh]# ssh-copy-id root@xxx01
-3. 进行验证
[hadoop@xxx01 .ssh]# ssh xxx01
#下面的第一次执行时输入yes后,不提示输入密码就对了
[hadoop@xxx01 .ssh]# ssh localhost
[hadoop@xxx01 .ssh]# ssh 0.0.0.0
注意:三台机器提前安装好的情况下,需要同步公钥文件。如果使用克隆技术。那么使用同一套密钥对就方便多了。
2.4.5 时间同步
crontab -e
2.4.6 安装jdk和hadoop,配置相关环境变量
-1. 上传和解压两个软件包
[root@xxx01 ~]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /usr/local/
[root@xxx01 ~]# tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/
-2. 进入local里,给两个软件更名
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv 1.8.0_221/ jdk
[root@xxx01 local]# mv hadoop-2.7.6/ hadoop
-3. 配置环境变量
[hadoop@xxx01 local]# vi /etc/profile
.....省略...........
#java environment
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#hadoop environment
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
2.5 HADOOP的配置文件
2.5.1 配置core-site.xml文件
<configuration>
<!-- hdfs的地址名称:schame,ip,port-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://xxx01:8020</value>
</property>
<!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
2.5.2 配置hdfs-site.xml文件
<configuration>
<!-- namenode守护进程管理的元数据文件fsimage存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
<!-- 块的副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 块的大小(128M),下面的单位是字节-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>xxx02:50090</value>
</property>
<!-- namenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
<property>
<name>dfs.namenode.http-address</name>
<value>xxx01:50070</value>
</property>
</configuration>
2.5.3 配置mapred-site.xml文件
<configuration>
<!-- 指定mapreduce使用yarn资源管理器-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置作业历史服务器的地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>xxx01:10020</value>
</property>
<!-- 配置作业历史服务器的http地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>xxx01:19888</value>
</property>
</configuration>
2.5.4 配置yarn-site.xml文件
<configuration>
<!-- 指定yarn的shuffle技术-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>xxx01</value>
</property>
<!--下面的可选-->
<!--指定shuffle对应的类 -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--配置resourcemanager的内部通讯地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>xxx01:8032</value>
</property>
<!--配置resourcemanager的scheduler的内部通讯地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>xxx01:8030</value>
</property>
<!--配置resoucemanager的资源调度的内部通讯地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>xxx01:8031</value>
</property>
<!--配置resourcemanager的管理员的内部通讯地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>xxx01:8033</value>
</property>
<!--配置resourcemanager的web ui 的监控页面-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>xxx01:8088</value>
</property>
</configuration>
2.5.5 配置hadoop-env.sh文件
.........
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk
.........
2.5.6 配置slaves文件
xxx01
xxx02
xxx03
2.5.7 配置yarn-env.sh文件
.........
# some Java parameters
export JAVA_HOME=/usr/local/jdk
if [ "$JAVA_HOME" != "" ]; then
#echo "run java in $JAVA_HOME"
JAVA_HOME=$JAVA_HOME
fi
.........
2.6 另外两台机器配置说明
方法1:“scp”进行同步
提示:本方法适用于多台虚拟机已经提前搭建出来的场景。
--1. 同步hadoop到slave节点上
[root@xxx01 ~]# cd /usr/local
[root@xxx01 local]# scp -r ./hadoop xxx02:/usr/local/
[root@xxx01 local]# scp -r ./hadoop xxx03:/usr/local/
--2. 同步/etc/profile到slave节点上
[root@xxx01 local]# scp /etc/profile xxx02:/etc/
[root@xxx01 local]# scp /etc/profile xxx03:/etc/
--3. 如果slave节点上的jdk也没有安装,别忘记同步jdk。
--4. 检查是否同步了/etc/hosts文件
方法2:克隆xxx01虚拟机
提示:本方法适用于还没有安装slave虚拟机的场景。通过克隆xxx01节点的方式,来克隆一个xxx02和xxx03机器节点,这种方式就不用重复安装环境和配置文件了,效率非常高,节省了大部分时间(免密认证的秘钥对都是相同的一套)。
--1. 打开一个新克隆出来的虚拟机,修改主机名
[root@xxx01 ~]# hostnamectl set-hostname xxx02
--2. 修改ip地址
[root@xxx01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
.........省略.........
IPADDR=192.168.10.102 <==修改为xxx02对应的ip地址
.........省略........
--3. 重启网络服务
[root@xxx01 ~]# systemctl restart network
--4. 其他新克隆的虚拟机重复以上1~3步
--5. 免密登陆的验证
从xxx01机器上,连接其他的每一个节点,验证免密是否好使,同时去掉第一次的询问步骤
--6. 建议:每台机器在重启网络服务后,最好reboot一下。
2.7 格式化NameNode
2.7.1 在xxx01机器上运行命令
[root@xxx01 ~]# hdfs namenode -format
2.7.2 格式化的相关信息解读
--1. 生成一个集群唯一标识符:clusterid
--2. 生成一个块池唯一标识符:blockPoolId
--3. 生成namenode进程管理内容(fsimage)的存储路径:
默认配置文件属性hadoop.tmp.dir指定的路径下生成dfs/name目录
--4. 生成镜像文件fsimage,记录分布式文件系统根路径的元数据
--5. 其他信息都可以查看一下,比如块的副本数,集群的fsOwner等。
2.8 启动集群
2.8.1 启动和关闭脚本介绍
1. 启动脚本
-- start-dfs.sh :用于启动hdfs集群的脚本
-- start-yarn.sh :用于启动yarn守护进程
-- start-all.sh :用于启动hdfs和yarn
2. 关闭脚本
-- stop-dfs.sh :用于关闭hdfs集群的脚本
-- stop-yarn.sh :用于关闭yarn守护进程
-- stop-all.sh :用于关闭hdfs和yarn
3. 单个守护进程脚本
-- hadoop-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
-- hadoop-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
reg:
hadoop-daemon.sh [start|stop] [namenode|datanode|secondarynamenode]
-- yarn-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
-- yarn-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
reg:
yarn-daemon.sh [start|stop] [resourcemanager|nodemanager]
2.8.2 启动hdfs
1)使用start-dfs.sh,启动 hdfs。
2)启动过程解析:
- 启动集群中的各个机器节点上的分布式文件系统的守护进程
一个namenode和resourcemanager以及secondarynamenode
多个datanode和nodemanager
- 在namenode守护进程管理内容的目录下生成edit日志文件
- 在每个datanode所在节点下生成${hadoop.tmp.dir}/dfs/data目录
3)jps查看进程
--1. 在xxx01上运行jps指令,会有如下进程
namenode
datanode
--2. 在xxx02上运行jps指令,会有如下进程
secondarynamenode
datanode
--3. 在xxx03上运行jps指令,会有如下进程
datanode
2.8.3 启动yarn
1)使用start-yarn.sh脚本
2)jps查看
--1. 在xxx01上运行jps指令,会多出有如下进程
resoucemanager
nodemanager
--2. 在xxx02上运行jps指令,会多出有如下进程
nodemanager
--3. 在xxx03上运行jps指令,会多出有如下进程
nodemanager
3) webui查看
--1. http://192.168.10.101:50070
--2. http://192.168.10.101:8088
2.9 wordcount案例
1) 准备要统计的两个文件,存储到~/data/下
--1. 创建data目录
[root@xxx01 hadoop]# mkdir ~/data
--2. 将以下两个文件上传到data目录下
- poetry1.txt
- poetry2.txt
2) 在hdfs上创建存储目录
[root@xxx01 hadoop]# hdfs dfs -mkdir /input
3) 将本地文件系统上的上传到hdfs上,并在web上查看一下
[root@xxx01 hadoop]$ hdfs dfs -put ~/data/poetry* /input/
4) 运行自带的单词统计程序wordcount
[root@xxx01 hadoop]# cd $HADOOP_HOME
[root@xxx01 hadoop]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /input /output
5) 查看webui
6) 查看part-r-00000文件
[root@xxx01 hadoop]# hdfs dfs -cat /output/part-r-00000
三. HDFS常用命令
注意:访问hdfs系统的指令:
hadoop dfs --- 已过时
hadoop fs -- 使用范围更大
hdfs dfs --范围相对较小
hadoop fs 和 hdfs dfs之间没有太大的区别
--1. 在命令行中输入hdfs,回车后,就会提示hdfs后可以使用哪些命令,其中有一个是dfs。
--2. 在命令行中输入hdfs dfs,回车后,就会提示dfs后可以添加的一些常用shell命令
注意:分布式文件系统的路径在命令行中 要从/开始写,即绝对路径
--1. 创建目录
[-mkdir [-p] <path> ...] #在分布式文件系统上创建目录 -p,多层级创建
调用格式:hdfs dfs -mkdir (-p) /目录
--2. 上传指令
[-put [-f] [-p] [-l] <localsrc> ... <dst>] #将本地文件系统的文件上传到分布式文件系统
调用格式:hdfs dfs -put /本地文件 /分布式文件系统路径
注意:
直接写/是省略了文件系统的名称hdfs://ip:port。
[-moveFromLocal <localsrc> ... <dst>] #将本地文件系统的文件上传到分布式文件系统
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
--3. 查看指令
[-ls [-d] [-h] [-R] [<path> ...]] #查看分布式文件系统的目录里内容
调用格式:hdfs dfs -ls /
[-cat [-ignoreCrc] <src> ...] #查看分布式文件系统的文件内容
调用格式:hdfs dfs -cat /xxx.txt
[-tail [-f] <file>] #查看分布式文件系统的文件内容
调用格式:hdfs dfs -tail /xxx.txt
注意:默认最多查看1000行
--4. 下载指令
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
注意:本地路径的文件夹可以不存在
[-moveToLocal <src> <localdst>]
注意:从hdfs的某个路径将数据剪切到本地,还没有被实现
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
调用格式:同copyToLocal
--5. 删除指令
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
注意:如果删除文件夹需要加-r
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
注意:必须是空文件夹,如果非空必须使用rm删除
--6. 查看磁盘利用率和文件大小
[-df [-h] [<path> ...]] 查看分布式系统的磁盘使用情况
[-du [-s] [-h] <path> ...] #查看分布式系统上当前路径下文件的情况 -h:human 以人类可读的方式显示
--7. 向分布式文件系统中的文件里追加内容
[-appendToFile <localsrc> ... <dst>]
调用格式:hdfs dfs -appendToFile 本地文件 hdfs上的文件
注意:不支持在中间随意增删改操作
--8. 修改权限的,跟本地的操作一致,-R是让子目录或文件也进行相应的修改
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
--9. 修改文件的副本数
[-setrep [-R] [-w] <rep> <path> ...]
调用格式:hadoop fs -setrep 3 / 将hdfs根目录及子目录下的内容设置成3个副本
注意:当设置的副本数量与初始化时默认的副本数量不一致时,集群会作出反应,比原来多了会自动进行复制.
--10. 查看文件的状态
hdfs dfs [generic options] -stat [format] <path> ...
命令的作用:当向hdfs上写文件时,可以通过dfs.blocksize配置项来设置文件的block的大小。这就导致了hdfs上的不同的文件block的大小是不相同的。有时候想知道hdfs上某个文件的block大小,可以预先估算一下计算的task的个数。stat的意义:可以查看文件的一些属性。
调用格式:hdfs dfs -stat [format] 文件路径
format的形式:
%b:打印文件的大小(目录大小为0)
%n:打印文件名
%o:打印block的size
%r:打印副本数
%y:utc时间 yyyy-MM-dd HH:mm:ss
%Y:打印自1970年1月1日以来的utc的微秒数
%F:目录打印directory,文件打印regular file
注意:
1)当使用-stat命令但不指定format时,只打印创建时间,相当于%y
2)-stat 后面只跟目录,%r,%o等打印的都是0,只有文件才有副本和大小
--11. 测试
hdfs dfs [generic options] -test -[defsz] <path>
参数说明: -e:文件是否存在 存在返回0 -z:文件是否为空 为空返回0 -d:是否是路径(目录) ,是返回0
调用格式:hdfs dfs -test -d 文件
实例:hdfs dfs -test -d /shelldata/111.txt && echo "OK" || echo "no"
解释:测试当前的内容是否是文件夹 ,如果是返回ok,如果不是返回no
--12. 创建空文件
hdfs dfs [generic options] -touchz <path> ...
调用格式:hdfs dfs touchz /hadooptest.txt
--13. 显示当前文件夹及子文件夹的数量 子文件的数量以及 总大小
hdfs dfs [generic options] -count [-q] [-h] <path> ...
调用格式:hdfs dfs -count /hadoop
--14. 合并下载
hdfs dfs [generic options] -getmerge [-nl] <src> <localdst>
调用格式:hdfs dfs -getmerge hdfs上面的路径 本地的路径
实例:hdfs dfs -getmergo /hadoopdata/*.xml /root/test.test
--15. 移动hdfs中的文件(更名)
hdfs dfds [generic options] -mv <src> ... <dst>
调用格式:hdfs dfs -mv /hdfs的路径1 /hdfs的另一个路径2
实例:hfds dfs -mv /aaa /bbb 这里是将aaa整体移动到bbb中
--16. 复制hdfs中的文件到hdfs的另一个目录
hdfs dfs [generic options] -cp [-f] [-p | -p[topax]] <src> ... <dst>
调用格式:hdfs dfs -cp /hdfs路径_1 /hdfs路径_2
--17.设置Hadoop回收站trash: 当我们不小心删掉文件时,还有后悔药吃.
--17.1 修改core-site.xml文件
注意:我们需要在namenode和datanode同时设置垃圾回收,如果namenode可以使用,
datanode 的无效,如果namenode的失效了,会自动调用datanode的设置
<property>
<name>fs.trash.interval</name>
<!-- 1440分钟后检查点会被清除,如果为0,垃圾回收站不会启用. -->
<value>1440</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
</property>
解释:
一:检查点:
执行下面的语句后出现的.Trash/190907043825就是检查点
[root@xxx01 sbin]# hadoop fs -ls /user/root/.Trash/
19/09/07 05:15:42 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
drwx------ - root supergroup 0 2019-09-07 04:36 /user/root/.Trash/190907043825
drwx------ - root supergroup 0 2019-09-07 05:15 /user/root/.Trash/Current
二:fs.trash.interval
分钟数,当超过这个分钟数后检查点会被删除。如果为零,回收站功能将被禁用。默认是0.单位分钟。这里我设置的是1天(60*24)
删除数据rm后,会将数据move到当前文件夹下的.Trash/current目录
三:fs.trash.checkpoint.interval
检查点创建的时间间隔(单位为分钟)。其值应该小于或等于fs.trash.interval。如果为零,则将该值设置为fs.trash.interval的值。
四:删除过程分析
这里的Deletion interval表示检查点删除时间间隔(单位为分钟)
这里的Emptier interval表示在运行线程来管理检查点之前,NameNode需要等待多长时间(以分钟为单位),即检查点创建时间间隔.NameNode删除超过fs.trash.interval的检查点,并为/user/${username}/.Trash/Current创建一个新的检查点。该频率由fs.trash.checkpoint.interval的值确定,且不得大于Deletion interval。这确保了在emptier窗口内回收站中有一个或多个检查点。
[root@xxx01 sbin]# hadoop fs -rm -r /hadoop4.txt
19/09/07 05:15:24 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://xxx01:9000/hadoop4.txt' to trash at: hdfs://xxx01:9000/user/root/.Trash/Current
例如:
fs.trash.interval = 120 (deletion interval = 2 hours)
fs.trash.checkpoint.interval = 60 (emptier interval = 1 hour)
说明:
这导致NameNode为Current目录下的垃圾文件每小时创建一个新的检查点,并删除已经存在超过2个小时的检查点。
在回收站生命周期结束后,NameNode从HDFS命名空间中删除该文件。删除文件会导致与文件关联的块被释放。请注意,用户删除文件的时间与HDFS中相应增加可用空间的时间之间可能存在明显的时间延迟,即用户删除文件,HDFS可用空间不会立马增加,中间有一定的延迟。
五:expunge 清空回收站
要想使用这个命令,首先得有回收站,即fs.trash.interval的值不能为0
当我们执行expunge命令时,其实是会立刻创建一个新的检查点,并将/.Trash/Current中的内容立刻放入这个检查点.
实例: [root@xxx01 sbin]# hadoop fs -expunge
19/09/07 05:15:58 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
19/09/07 05:15:58 INFO fs.TrashPolicyDefault: Created trash checkpoint: /user/root/.Trash/190907051558
六:如果想绕过垃圾回收站并立即从文件系统中删除文件。可以执行 hadoop fs -rm -skipTrash
[root@xxx01 sbin]# hadoop fs -rm -skipTrash /hadoop111.txt
19/09/07 05:50:13 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Deleted /hadoop111.txt
--17.2.测试
1)新建目录input
[root@xxx01:/data/soft]# hadoop fs -mkdir /input
2)上传文件
[root@xxx01:/data/soft]# hadoop fs -copyFromLocal /data/soft/file0* /input
3)删除目录input
[root@xxx01 data]# hadoop fs -rmr /input
Moved to trash: hdfs://xxx01:9000/user/root/input
4)参看当前目录
[root@xxx01 data]# hadoop fs -ls
Found 2 items
drwxr-xr-x - root supergroup 0 2011-02-12 22:17 /user/root/.Trash
发现input删除,多了一个目录.Trash
5)恢复刚刚删除的目录
[root@xxx01 data]# hadoop fs -mv /user/root/.Trash/Current/user/root/input /user/root/input
6)检查恢复的数据
[root@xxx01 data]# hadoop fs -ls input
Found 2 items
-rw-r--r-- 3 root supergroup 22 2011-02-12 17:40 /user/root/input/file01
-rw-r--r-- 3 root supergroup 28 2011-02-12 17:40 /user/root/input/file02
7)删除.Trash目录(清理垃圾)
[root@xxx01 data]# hadoop fs -rmr .Trash
Deleted hdfs://xxx01:9000/user/root/.Trash
(=-= 今天理论东西太多太多,需要自己好好消化,最近小白在练吉他,有没有会的老哥教我两招的,一转眼这就又到周一了,冲冲冲距离周末还有五天!!!)