- hdfs介绍
hdfs是一个文件系统,用于存储文件,通过目录树来定位文件,是分布式的,可以对文件或文件夹进行上传、删除、下载、文件夹可以创建,但不能进行修改、文件不能进行创建。适合一次写入,多次读出的场景,所以适合做数据分析。 组成
hdfs:包含namenode、datanode、secondary namenode三部分。 namenode:负责管理整个文件系统的元数据(文件的位置,名称、权限等信息),以及每个文件对应的block块的信息。namenode的数据都存储在内存中,是为了性能考虑,内存中的数据始终是最完整的。
datanode:负责存储文件数据块,每个数据块都会在多个datanode有副本 。 datanode默认周期(一小时)会向namenode上报所有块的信息,还会保持心跳,心跳每三秒一次,每次心跳返回结果带有namenode给datanode的指令,超过10分钟没有收到心跳,namenode就会认为该节点不再可用。datanode中也包含一些元数据,比如数据长度,校验和,时间戳等。校验和这里是使用crc32(即循环冗余校验)
secondary namenode:namenode的备份,负责备份namenode中的数据,所以他们的目录结构是一摸一样的,当namenode挂机时,可以直接将secondary
namenode的工作目录,拷贝到namnode,这样就可以恢复namenode。但namenode是可以对外提供服务的,secondary namenode不可以,因为他只负责备份namenode的数据。secondary namenode对namenode的数据备份是一个合并的过程,默认情况下,每隔一个小时,就会拉取namenode上的fsimage文件(元数据文件(fsiamge):集群第一次格式化的生成,将内存中的元数据持久化到磁盘上,此后就不会再与内存有交互)和edits文件(日志文件(edits),每当用户要执行操作时,会先生成一条日志记录,插入到日志文件中,才会继续进行操作,会有一个处于追加状态的edits文件,当secondary namenode发出chepoint请求时,会通过滚动的方式,将处于追加状态的edits文件变为历史edits文件)到secondary namenode的磁盘上,然后加载进内存执行合并操作(将fsiamge文件和edits文件合并),合并完成后,会生成一个fsiamge.checkpoint文件,然后将这个文件返回给namenode,namenode会通过重命名操作覆盖掉原来的fsiamge文件,过一段时间,就会删除掉合并了的edits文件(secondary namenode上也是如此),这样就可以保证namenode中的fsimage文件一直处于更新状态,也可以保证磁盘和内存的空间充足。
注:每次集群启动时,datanode就会向namenode汇报块的信息,namenode会把fsimage文件中的数据加载进内存中,然后执行edits文件中的操作。fsimage文件和edits文件也是可以查看的通过oiv和oev,具体的命令名可以自行百度
3.block块 hdfs文件系统中的文件存储是以block块的方式存放的,每个block块默认是128M(hadoop1.x是64M),是可以自定义的,每个block块会存放在不同的datanode上(默认是一个block块有三个副本,即存放在三个不同的datanode上)。当文件大小不足128M时,还是会占用一个block块。hdfs命令 这里只介绍一些基础的、常用的命令。 hdfs命令有两种形式,一种是hdfs dfs 命令,一种是hadoop fs 命令,这里只演示hdfs dfs这种形式。
- 显示目录信息 hdfs dfs -ls /目录名
- 创建目录 hdfs dfs -mkdir /目录名
- 创建多级目录 hdfs dfs -mkdir - p /aaa/bbb
- 显示文件内容 hdfs dfs -cat /目录名/文件名
- 从hdfs上下载文件 hdfs dfs -get /目录名/文件名 /目录名
- 从本地上传文件到 hdfs hdfs dfs -put /目录名/文件名 /目录名
删除文件或文件夹 hdfs dfs -rm -r 文件名/文件夹名
5.hdfs写数据流- 将文件切割成block块
- client向namenode发出上传文件的请求
- namenode响应可以上传文件
- client请求上传第一个block块,请求namenode返回datanode
- namenode返回datanode
- client请求建立block块传输通道,dn1收到会继续调用dn2,dn2会调用dn3,通道建立完成
- datanode依次应答成功,返回给client
- client传输数据,往datanode上写数据是通过ByteBuffer处理流写的(处于效率考虑),是以pecket为单位传输的,而且是并行传输
数据传输完成
6.机架感知和网络拓扑(彼此紧邻的概念)
在大数据中,网络带宽一直是一个瓶颈,所以在hadoop2.x中,副本节点的选择有些改变。第一个副本在client所处的节点上
- 第二个副本和第一个副本在同一个机架,结点随意
第三个副本在不同的机架上,随意结点
7.hdfs写数据client向namenode请求下载文件
- namenode返回目标文件元数据(也就是对应的block块的信息)
- 客户端向对应的block块请求读取数据
- 对应的datanode将block传输给client
- 最后将block块整合成一个文件
注:在client向datanode请求读取数据时,因为有多个副本,所以会尽可能的优先读取离client近的datanode上的块信息,这就是因为网络带宽问题。
8.节点的服役和退役
一般公司在搭建集群处于成本考虑都只是够用即可,但随着业务的增长,所以集群的资源是不够用的,这时就需要增加新的节点。但hadoop支持热插拔
具体步骤如下:在namenode的安装目录下的/etc/hadoop/目录(就是存放各种配置文件的目录下)创建dfs.hosts文件,将每个datanode,包含新服役的datanode添加进去,
- 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性,key是dfs.hosts,value是dfs.hosts的绝对路径
- 刷新namenode,命令是:hdfs dfsadmin -refreshNodes
- 更新resourceManager节点,命令是:yarn rmadmin -refreshNodes
- 在slaves文件中增加新主机名称
- 单独命令启动新的节点(需在新节点的sbin目录下):hadoop-daemon.sh start datanode
- yarn-daemon.sh start nodemanager
如果数据不均衡,可以使用命令,(也是sbin下):./start-banlancer.sh
退役节点在hadoop的安装目录下的/etc/hadoop下创建dfs.hosts.exclude文件
- 在文件中添加退役节点主机名称
- 在namenode的hdfs-site.xml文件中增加dfs.hosts.exclude属性,同样key是dfs.hosts.exclude,value是dfs.hosts.exclude的绝对路径
- 刷新namenode、刷新resourceManager,命令如上
- 等到退役节点状态为decommissioned,停止节点及资源(如果副本数小于等于3是不能退役成功的,需要先修改副本数)
- 停止节点,命令是(同样是sbin下):hadoop-daemon.sh stop datanode和yarn-daemon.stop nodemanager
- 从include文件中删除退役节点,在刷新节点:从dfs.hosts中去除退役节点主机名,刷新namenode和resourceManager,命令如上
- 从slaves中删除退役节点主机名
- 如果数据不均衡,可使用上述的平衡命令,进行平衡
9.多目录配置
其中datanode和namenode都可以实现多目录配置,就是在配置文件中进行配置。
datanode的多目录中存放的数据是不一样的
namenode的多目录中存放的数据是一样的
10.hdfs的其他功能
两个远程主机间的数据拷贝
scp -r 目录或文件名 主机名 路径
集群间的递归数据复制
hdfs://haoop102:9000/user/atguigu/hello.txt hdfs://hadoop103:9000/user/atguigu/hello.txt
hadoop存档
是为了解决小文件问题,这是大数据中的另一瓶颈,hadoop的存档可以解决即使大量的小文件已经存在于hdfs上的问题
快照
就是对某一时刻的计算机状态进行一个备份,如果出现一些错误,可以再次恢复至这一状态
回收站
需要在配置文件中开启,开启后可以设置文件在回收站中保留的时间,这样删除后文件会先进入到回收站中,到一定的时间后在进行删除,留有一定的数据恢复时间
10.hadoop的优势和劣势
经过上述的简单介绍,不难发现,目前完全分布式的集群有以下优劣:
优势:
高可靠:一个block块有三个副本
高扩展:支持热插拔
兼容性:即对计算机硬件的要求不高,可以用“质量不够,数量来凑”来形容
高性能:几乎被spark取代,因为是分布式的计算
劣势:
网络带宽问题
小文件问题:小文件过多,可能会出现,找小文件的时间大大超过读取文件的时间,这就导致效率低下
单点故障问题,一旦namenode和secondary namenode同时挂掉,集群就彻底不能使用了(高可用解决了此类问题)
hadoop框架之HDFS介绍
最新推荐文章于 2022-04-20 17:15:35 发布