导航

HDFS学习之路一

Posted on 2020-11-11 13:33  乔伊_413  阅读(84)  评论(0编辑  收藏  举报

HDFS介绍

  产生原因: 单机存储无法存储大量数据,需要跨机器存储,统一管理分布在集群上的文件系统。

  概念:  HDFS是一个分布式文件系统 , Apache Hadoop项目的一个子项目,Hadoop非常适合存储大型数据。(T级)

 

应用场景:

  • 存储非常大的文件(大量小文件不适合存储),需要高吞吐量 , 对延时没有要求

  • 采用流式的数据访问方式 : 一次写入 , 多次读取 , 数据集经常从数据源生成或者拷贝一次 .

  • 运行于商业硬件上

  • 需要高容错性

  • 为数据存储提供所需的扩展能力

  • 不支持多个写入器,不支持文件任意的offset修改

 

HDFS架构:

  主从架构 , HDFS Client , NameNode , DataNode , Secondray NameNode 四个部分组成

 

 

 

-客户端: 

  • 文件切分,文件上传HDFS的时候, Client将文件切分成一个个Block, 然后进行存储

  • 与NameNode交互, 获取文件的位置信息

  • 与DataNode交互, 读取或者写入数据

  • Client提供一些命令来管理和访问HDFS,比如启动或者关闭HDFS

-NameNode:  就是master , 它是一个主管, 管理者

  • 管理HDFS的名称空间

  • 管理数据库映射信息

  • 配置副本策略

  • 处理客户端读写请求

  • 监控Datanode的存活状态

-Datanode:  就是Slave , NameNode下达命令, DataNode执行具体操作

  • 存储实际的数据块

  • 执行数据块的读/写操作

  • 心跳机制,反馈给namenode ( 心跳信息 , 数据块信息 , 存数据块信息 )

-SecondaryNameNode : 并非NameNode热备, 当NameNode挂掉时,它并不能马上替换NameNode并提供服务

  • 辅助NameNode并分担其工作量

  • 定期合并fsimage和fsedits,并推送给NameNode

 

副本机制:

  所有的文件都是以block块的方式放在HDFS文件系统中: 

    块大小(Hadoop1.x默认是64M ,  Hadoop2.x默认的是128M .

    与磁盘读写速度的提升以及数据量的大幅度增长有关,可以自定义设置)

  • 一个文件又可能大于集群中的任意一个磁盘,引入块机制可以解决这个问题

  • 使用块作为文件存储的逻辑单位可以简化存储子系统

  • 块非常适合用于数据备份进而提供数据容错能力

<!--在Hadoop1当中,文件的block默认64M,Hadoop2中,默认128M,block块的大小在 hdfs-site.xml当中设定-->
<property>
    <name>dfs.block.size</name>
    <value>块大小 以字节为单位</value>
</property>

 

 

HDFS的命令行操作: 

start-all.sh #启动所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager
stop-all.sh #停止所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager

#格式: hdfs dfs -ls URI
#作用: 类似于Linux的ls 命令,显示文件列表
hdfs dfs -ls /

#格式  :  hdfs dfs -lsr URI
#作用  :  在整个目录下递归执行ls,与UNIX的 ls -R类似
# hdfs dfs -lsr /  过时了
hdfs dfs -ls -R /

#格式 : hdfs dfs [-p] -mkdir <paths>
#作用 : 以<paths>中的URI作为参数,创建目录,使用-p参数可以递归创建目录

#格式 : hdfs dfs -put <localsrc> ... <dst>
#作用 : 将单个源文件src或者多个源文件srcs从本地文件系统拷贝到目标文件系统中(<dst> 对应的路径)也可以从标准输入中读取输入,写入目标文件系统中
hdfs dfs -put /root/a.txt /dir1

#格式 : hdfs dfs -moveFromLocal <localsrc> <dst>
#作用 : 和put命令类似,但是源文件localsrc拷贝之后自身被删除
hdfs dfs -moveFromLocal /root/a.txt /

#格式 hdfs dfs -get [-ignorecrc ] [-crc] <src> <localdst>
#作用:将文件拷贝到本地系统. CRC校验失败的文件通过-ignorecrc选项拷贝. 文件和CRC校验和可以通过-CRC选项拷贝
hdfs dfs -get /install.ini /export/servers

#格式 : hdfs dfs -mv URI <dest>
#作用 : 将hdfs上的文件从原路径移动到目标路径(移动文件后删除),该命令不能夸文件系统
hdfs dfs -mv /dir1/a.txt /dir2


#格式 : hdfs dfs -rm [-r] [-skipTrash] URI [URI...]
#作用 : 删除参数指定的文件,参数可以有多个.此命令只删除文件和非空目录
# -r 参数指定删除文件类型 
#如果指定-skipTrash选项,那么在回收站可用的情况下,该选项直接跳过回收站直接删除文件;
#否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中
hdfs dfs -rm -r /dir1

#格式 : hdfs dfs -cp URI [URI ...] <dest>
#作用 : 将文件拷贝到目标文件中,如果<dest>为目录的话,可以将多个文件夹拷贝到该目录下
-f  #选项将覆盖目标,如果它已经存在
-p  #选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)
hdfs dfs -cp /dir1/a.txt /dir2/b.txt

hdfs dfs -cat URI[uri ...]
#作用 : 将参数所指示的文件内容输出到stdout
hdfs dfs -cat /install.log

#格式  hdfs dfs -chmod [-R] URI[URI ...]
#作用  改变文件的权限,使用这一命令的用户必须是文件的所属用户,或者超级用户
#如果使用-R选项,则对整个目录有效递归执行。
hdfs dfs -chmod -R 777 /install.log

#格式  hdfs dfs -chmod [-R] URI[uri ...]
#作用  改变文件的所属用户和用户组,使用这一命令的用户必须是文件的所属用户,或者超级用户
# 如果使用 -R 选项,则对整个目录有效递归执行
hdfs dfs -chown -R hadoop:hadoop /install.log

#格式: hdfs dfs -appendToFile <localsrc>...<dst>
#作用: 追加一个或者多个文件到hdfs文件中,也可以从命令行中读取输入
#方便 小文件的合并,减少元数据过多的压力
hdfs dfs -appendToFile a.xml b.xml /big.xml

# 查看配额信息
hdfs dfs -count -q -h /user/root/dir1

#创建hdfs文件夹
hdfs dfs -mkdir -p /user/root/dir
#给文件夹下面设置最多上传两个文件,发现只能上传一个文件,n个目录 只能上传n-1个,因为该目录本身也是一个文件
hdfs dfs -setQuota 2 dir
#清除文件数量限制
hdfs dfsadmin -clrQuota /user/root/dir

#在设置空间配额时,设置的空间大小至少是block_size*3大小
hdfs dfsadmin -setSpaceQuata 4k /user/root/dir   #限制大小为4k
hdfs dfs -put /root/a.txt /user/root/dir
#生成任意大小文件的命令:
dd if=/dev/zero of=1.txt bs=1M count=2 #生成2M的文件
#清除空间限额配置
hdfs dfsadmin -clrSpaceQuota /user/root/dir

#安全模式操作命令
hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #关闭安全模式
#检查副本率,保证文件系统的安全以及完整性

#写入测试报告,写入一个jar包,一共十个,每个十兆
hadoop jar /export/servers/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
#完成之后查看写入速度结果
hdfs dfs -text /benchmarks/TestDFSIO/io_write/part-00000

#读取测试报告,读取一个jar包,一共十个,每个十兆
hadoop jar /export/servers/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB

#清除测试数据
hadoop jar /export/servers/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6.jar TestDFSIO -clean