目录
Hadoop分布式文件系统
HDFS简介
HDFS(Hadoop Distribute File System)是大数据领域一种非常可靠的存储系统,它以分布式方式存储超大数据量文件,但它并不适合存储大量的小数据量文件。同时HDFS是Hadoop和其他组件的数据存储层,运行在由价格廉价的商用机器组成的集群上的,而价格低廉的机器发生故障的几率比较高,因此HDFS在设计上采取了多种机制,在硬件故障的情况下保障数据的完整性。
总体而言,HDFS要实现以下目标:
- 兼容廉价的硬件设备: 实现在硬件故障的情况下也能保障数据的完整性
- 流数据读写:不支持随机读写的操作
- 大数据集:数据量一般在GB、TB以上的级别
- 简单的文件模型:一次写入、多次读取
- 强大的跨平台兼容性:采用
Java
语言实现
但是,HDFS也有如下局限性:
- 不适合低延迟数据访问:HDFS主要是面向大规模数据批量处理而设计的,采用流式数据读取,具有很高的数据吞吐率,但是,这也意味着较高的延迟,因此,HDFS不适合用在需要较低延迟(如数十毫秒)的应用场合。对于低延迟要求的应用程序而言,HBase是一个更好的选择;
- 无法高效存储大量小文件:小文件是指文件大小小于一个块的文件,HDFS无法高效存储和处理大量的小文件,过多小文件会给系统扩展性和性能带来诸多问题: 1. HDFS采用名称节点(NameNode)来管理文件系统的元数据,这些元数据被保存在内存中,使客户端可以快速获取文件实际存储位置。通常,每个文件、目录和块大约占150字节,如果有1000万个文件,每个文件对应一个块,那么,名称节点至少要消耗3GB的内存来保存这些元数据信息。很显然,这时元数据检索的效率就比较低了,需要花费较多的时间找到一个文件的实际存储位置。而且,如果继续扩展到数十亿个文件时,名称节点保存元数据所需要的内存空间就会大大增加,以现有的硬件水平,是无法在内存中保存如此大量的元数据;2. 用MapReduce处理大量小文件时,会产生过多的Map任务,线程管理开销会大大增加,因此处理大量小文件的速度远远低于处理同等大小的大文件的速度;3. 访问大量小文件的速度远远低于访问大文件的速度,因为访问大量小文件,需要不断从一个数据节点跳到另一个数据节点,严重影响性能。
- 不支持多用户写入及任意修改文件:HDFS只允许一个文件有一个写入者,不允许多个用户对同一个文件执行写操作,而且只允许对文件执行追加操作,不能执行随机写操作。
HDFS的体系结构
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。
- 名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。
- 数据节点负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。
- 每个数据节点会周期性地向名称节点发送“心跳"信息,报告自己的状态,没有按时发送心跳信息的数据节点会被标记为“宕机”,不会再给它分配任何I/O请求。
用户在使用HDFS时,仍然可以像在普通文件系统中那样,使用文件名去存储和访问文件。
实际上,在系统内部,一个文件会被切分成若干个数据块,这些数据块被分布存储到若干个数据节点上。当客户端需要访问一个文件时,首先把文件名发送给名称节点,名称节点根据文件名找到对应的数据块(一个文件可能包括多个数据块),再根据每个数据块信息找到实际存储在各个数据块的数据节点的位置,并把数据节点位置发送给客户端,最后客户端直接访问这些数据节点获取数据。在整个访问过程中,名称节点并不参与数据的传输。这种设计方式,使得各个文件的数据能够在不同的数据节点上实现并发访问,大大提高了数据访问速度。
HDFS的使用和基本命令
1.启动Hadoop的HDFS相关进程
切换到root用户
sudo passwd root
su
切换到/hadoop/sbin路径下:
cd /opt/hadoop/sbin/
打开文件添加内容
输入i 回车,进入插入模式,在该文件末尾,添加内容;
按下esc键,退出编辑;
输入 :wq 回车,保存退出。
vim /opt/hadoop/sbin/start-dfs.sh
vim /opt/hadoop/sbin/stop-dfs.sh
vim /opt/hadoop/sbin/start-yarn.sh
vim /opt/hadoop/sbin/stop-yarn.sh
将start-dfs.sh,stop-dfs.sh两个文件顶部添加以下参数
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
还有,start-yarn.sh,stop-yarn.sh顶部也需添加以下:
#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
启动Hadoop的HDFS服务,使用root用户执行如下命令:
./start-dfs.sh
启动ssh服务
启动 HDFS 守护进程,出现警告信息:
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER.Using value of HADOOP_SECURE_DN_USER.
解决办法:
vim /opt/hadoop/sbin/start-dfs.sh
vim /opt/hadoop/sbin/stop-dfs.sh
#把start-dfs.sh,stop-dfs.sh文件的如下代码:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
#改为,如下代码:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
2.查看HDFS进程
启动Java环境
source /etc/profile
输入
jps
命令可以查看所有的
Java
进程
jps
3.验证HDFS运行状态
在hdfs上创建一个目录,执行如下命令,验证能够创建成功:
hadoop fs -mkdir /myhadoop1
如果创建成功,执行如下命令,可查询hdfs文件系统根目录,将看到
/myhadoop1
目录:
hadoop fs -ls /
命令ls
列出hdfs文件系统根目录下的目录和文件,执行命令如下:
hadoop fs -ls /
列出hdfs文件系统所有的目录和文件,执行命令如下:
hadoop fs -ls-R /
执行结果如下:
5.
put
命令
1)拷贝文件
将本地文件上传到hdfs上,命令格式如下:
hadoop fs -put<local file><hdfs file>
其中
<hdfs file>
的父目录必须存在,否则命令执行失败,例如将
/opt/hadoop
的
README.txt
文件上传到hdfs文件系统根目录,命令如下:
hadoop fs -put /opt/hadoop/README.txt /
2)拷贝目录
将本地文件夹上传到hdfs的文件夹中,命令格式如下:
hadoop fs -put<local dir><hdfs dir>
其中
<hdfs dir>
的父目录必须存在,否则命令执行失败。例如将
/opt/hadoop/
的
log
文件夹上传到hdfs文件系统根目录,命令如下:
hadoop fs -put /opt/hadoop/logs /
3)查看是否拷贝成功
查看上传文件或目录是否成功,执行如下命令:
hadoop fs -ls<hdfs file/hdfs dir>
例如,查看刚刚上传的
README.txt
文件和
log
目录是否在hdfs根目录下存在,命令如下:
hadoop fs -ls /
6.
moveFromLocal
命令
1)拷贝文件或目录
将本地文件/文件夹上传到hdfs中,但本地文件/文件夹会被删除,命令格式如下:
hadoop fs -moveFromLocal<local src><hdfs dst>
例如,执行如下命令,上传本地文件/文件夹至hdfs中:
hadoop fs -moveFromLocal /opt/hadoop/NOTICE.txt /myhadoop1
hadoop fs -moveFromLocal /opt/hadoop/logs /myhadoop1
2)查看是否拷贝成功
查看上传文件或目录是否成功,执行如下命令:
hadoop fs -ls<hdfs file/hdfs dir>
例如,查看刚刚上传的
NOTICE.txt
文件和
log
目录是否在hdfs文件系统的
/myhadoop1
目录下存在,命令如下:
hadoop fs -ls /myhadoop1
7.
get
命令
1)拷贝文件或目录到本地
将hdfs文件系统中的文件/文件夹下载到本地,命令格式如下:
hadoop fs -get< hdfs file or dir><localfile or dir>
例如,将hdfs文件系统中
/myhadoop1
目录下的
NOTICE.txt
和
logs
分别下载到本地路径
/opt/hadoop
目录,执行命令如下:
hadoop fs -get /myhadoop1/NOTICE.txt /opt/hadoop/
hadoop fs -get /myhadoop1/logs /opt/hadoop/
注意:
- 拷贝多个文件或目录到本地时,本地要为文件夹路径
local file
不能和hdfs file
名字不能相同,否则会提示文件已存在。- 如果用户不是root用户,
local
路径要使用该用户文件夹下的路径,否则会出现权限问题
2)查看是否成功拷贝到本地
查看本地是否在
/opt/hadoop
目录下存在已拷贝完毕的
NOTICE
文件或
logs
目录,执行如下命令:
cd /opt/hadoop
ls-l
8.
rm
命令
1)删除一个或多个文件
在hdfs文件系统中,删除一个或多个文件,命令格式如下:
hadoop fs -rm<hdfs file>...
例如,删除hdfs文件系统中根目录下的
README.txt
文件,命令如下:
hadoop fs -rm /README.txt
2)删除一个或多个目录
在hdfs文件系统中,删除一个或多个目录,命令格式如下:
hadoop fs -rm-r<hdfs dir>...
例如,删除hdfs文件系统中根目录下的
logs
目录,命令如下:
hadoop fs -rm-r /logs
3)查看是否删除成功
查看刚刚删除的
README.txt
文件和
log
目录是否在hdfs根目录下存在,命令如下:
hadoop fs -ls /
如果删除成功,将不会看到
/logs
和
/NOTICE.txt
。
9.
mkdir
命令
1)创建一个新目录
使用如下命令,在hdfs文件系统中创建一个目录,该命令只能一级一级的创建目录,如果父目录不存在,则会报错:
hadoop fs -mkdir<hdfs path>
例如,在hdfs文件系统的
/myhadoop1
目录下创建
test
目录,命令如下:
hadoop fs -mkdir /myhadoop1/test
2)创建一个新目录(
-p
选项)
使用如下命令,在hdfs文件系统中创建一个目录,如果父目录不存在,则创建该父目录:
hadoop fs -mkdir-p<hdfs dir>...
例如,在hdfs文件系统创建
/myhadoop1/test
目录,命令如下:
hadoop fs -mkdir-p /myhadoop2/test
3)查询目录
查看刚刚创建的
/myhadoop1/test
和
/myhadoop2/test
目录是否存在,命令如下:
hadoop fs -ls /
hadoop fs -ls /myhadoop1
hadoop fs -ls /myhadoop2
10.
cp
命令
使用如下命令,在hdfs文件系统上进行文件或目录的拷贝,如果目标文件不存在,则命令执行失败,相当于给文件重命名并保存,源文件还存在:
hadoop fs -cp<hdfs file or dir>... <hdfs dir>
按照下面的步骤,使用
cp
命令,将
/LICENSE.txt
拷贝到
/myhadoop1
目录下:
1) 拷贝一个本地文件到HDFS的根目录下
将本地
/opt/hadoop
目录下的
LICENSE.txt
文件上传到hdfs文件系统的根目录下,命令如下:
hadoop fs -put /opt/hadoop/LICENSE.txt /
查看hdfs文件系统的根目录下的
LICENSE.txt
是否存在,命令如下:
hadoop fs -ls /
2)将此文件拷贝到
/myhadoop1
目录下
使用
cp
命令,将hdfs文件系统中根目录下的
LICENSE.txt
文件拷贝到
/myhadoop1
目录下,命令如下:
hadoop fs -cp /LICENSE.txt /myhadoop1
3)查看
/myhadoop1
目录
使用如下命令,查看hdfs文件系统的
/myhadoop1
目录下是否存在
LICENSE.txt
文件:
hadoop fs -ls /myhadoop1
11.
mv
命令
使用如下命令,在hdfs文件系统上进行文件或目录的移动,如果目标文件不存在,则命令执行失败,相当于给文件重命名并保存,源文件不存在;源路径有多个时,目标路径必须为目录,且必须存在:
hadoop fs -mv<hdfs file or dir>... <hdfs dir>
注意:跨文件系统的移动(local到hdfs或者反过来)都是不允许的。
按照下面的步骤,使用
mv
命令,将
/myhadoop1/LICENSE.txt
移动到
/myhadoop2
目录下:
1)移动一个 HDFS文件
使用
mv
命令,将hdfs文件系统的
/myhadoop1
目录下的
LICENSE.txt
文件移动到
/myhadoop2
目录下,命令如下:
hadoop fs -mv /myhadoop1/LICENSE.txt /myhadoop2
2)查询
/myhadoop2
目录
使用如下命令,查看hdfs文件系统的
/myhadoop2
目录下是否存在
LICENSE.txt
文件:
hadoop fs -ls /myhadoop2
命令count
使用如下命令,统计hdfs对应路径下的目录个数,文件个数,文件总计大小:
hadoop fs -count<hdfs path>
例如,查看
/myhadoop1/logs
目录下的目录个数,文件个数,文件总计大小,命令如下:
hadoop fs -count /myhadoop1/logs
du
命令
- 显示hdfs对应路径下每个文件夹和文件的大小
hadoop fs -du<hdsf path>
- 显示hdfs对应路径下所有文件大小的总和
hadoop fs -du -s <hdsf path>
- 显示hdfs对应路径下每个文件夹和文件的大小,文件的大小用方便阅读的形式表示,例如用64M代替67108864
hadoop fs -du-h<hdsf path>
例如,执行如下命令,可以查看hdfs文件系统
/myhadoop2
目录下的每个文件夹和文件的大小、所有文件大小的总和:
hadoop fs -du /myhadoop2
hadoop fs -du-s /myhadoop2
hadoop fs -du-h /myhadoop2
hadoop fs -du-s-h /myhadoop2
执行结果说明:
- 第一列:表示该目录下总文件大小
- 第二列:表示该目录下所有文件在集群上的总存储大小,该大小和副本数相关,设置的默认副本数为3 ,所以第二列的是第一列的三倍 (第二列内容 = 文件大小 × \times × 副本数)
- 第三列:表示查询的目录
14.
setrep
命令
使用如下命令,改变一个文件在hdfs文件系统中的副本个数,数字3表示所设置的副本个数,其中,
-R
选项可以对一个目录下的所有目录和文件递归执行改变副本个数的操作:
hadoop fs -setrep-R3<hdfs path>
例如,对hdfs文件系统中
/myhadoop1
目录下的所有目录和文件递归执行,设置为3个副本,命令如下:
hadoop fs -setrep-R3 /myhadoop1
15.
stat
命令
使用如下命令,查看对应路径的状态信息:
hdoop fs -stat[format]< hdfs path >
其中,
[format]
可选参数有:
%b
:文件大小%o
:Block大小%n
:文件名%r
:副本个数%y
:最后一次修改日期和时间
例如,查看hdfs文件系统中
/myhadoop2/LICENSE.txt
文件的大小,命令如下:
hadoop fs -stat %b /myhadoop2/LICENSE.txt
16.
balancer
命令
该命令主要用于,当管理员发现某些
DataNode
保存数据过多,某些
DataNode
保存数据相对较少,可以使用如下命令手动启动内部的均衡过程:
hadoop balancer
或
hdfs balancer
dfsadmin
命令
该命令主要用于管理员通过
dfsadmin
管理HDFS:
1)使用
-help
参数,查看相关的帮助:
hdfs dfsadmin -help
2) 使用
-report
参数,查看文件系统的基本数据:
hdfs dfsadmin -report
3) 使用
-safemode
参数,操作安全模式:
hdfs dfsadmin -safemode<enter | leave | get | wait>
其中:
enter
:进入安全模式leave
:离开安全模式get
:查看是否开启安全模式wait
:等待离开安全模式
例如,进入安全模式,执行命令如下:
hdfs dfsadmin -safemode enter
18
cat
命令
使用
cat
命令,查看hdfs文件系统中文本文件的内容,例如,查看根目录下的
deom.txt
文件内容:
hadoop fs -cat /demo.txt
hadoop fs -tail-f /demo.txt
当使用
hadoop fs -tail -f
命令后,终端会根据文件描述符进行追踪,当文件改名或被删除,追踪停止。终端操作如下:
- 此时要想暂停刷新,使用
Ctrl+S
暂停终端,S
表示sleep
- 若想要继续刷新终端,使用
Ctrl+Q
,Q
表示quiet
- 若想退出
tail
命令,直接使用Ctrl+C
,也可以使用Ctrl+Z``````Ctrl+C
和Ctrl+Z
都是中断命令,当他们的作用却不一样的: 1.Ctrl+C
比较暴力,就是发送Terminal
到当前的程序,比如正在运行一个查找功能,文件正在查找中,使用Ctrl+C
会强制结束当前这个进程2.Ctrl+Z
则会将当前程序挂起,暂停执行这个程序,比如mysql
终端下,需要跳出来执行其他的文件操作,又不想退出mysql
终端(因为下次还需要输入用户名密码进入,很麻烦),于是可以使用Ctrl+Z
将mysql
挂起,然后进行其他操作,输入fg
回车可以回到mysql
终端,担任也可以挂起很多进程到后台,执行fg <编号>
就能将挂起的进程返回到当前的终端。配合bg
和fg
命令能更方便的进行前后台切换
appendToFile
命令
将本地文件内容追加到hdfs文件系统中的文本文件里,命令格式如下:
hadoop fs -appendToFile<local file><hdfs file>
chown
命令 使用chown
命令,修改hdfs文件系统中文件的读、写、执行的权限,命令示例如下:
hadoop fs -chown user:group /datawhale
hadoop fs -chmod777 /datawhale
其中,参数说明如下:
chown
:定义谁拥有文件chmod
:定义可以对该文件做什么
学习参考
版权归原作者 蓝净云 所有, 如有侵权,请联系我们删除。