HDFS学习笔记

hdfs是hadoop的分布式文件系统,它是一个高容错性的系统,适合部署在廉价的机器上,hdfs能够提供高吞吐量的数据访问,非常适合大规模数据集的应用.
优点:

  1. 高容错性
    数据自动保存为多个副本,它是通过增加副本的形式提高容错性的.
    某一副本丢失以后,它可以自动恢复(即重新再创建副本).
  2. 适合处理大数据
    数据规模:能够处理数据规模达到GB,TB,甚至PB级别的数据
    文件规模:能够处理百万规模以上的文件数量,数量相当之大.
  3. 可以构建在廉价机器上.

缺点:

  1. 不适合低延迟数据访问,比如毫秒级的存储数据
  2. 无法高效的对大量小文件进行存储.
    存储小文件的话,它会占用NameNode大量的内存来存储目录和块信息.
    小文件存储的寻址时间会超过读取时间.

hdfs的架构
在这里插入图片描述
概念介绍:

  1. NameNode 就是master ,它是一个主管,管理者.
    (1) 管理HDFS的名称空间;
    (2) 配置副本策略;
    (3) 管理数据块的映射信息;
    (4)处理客户端读写请求;
  2. DataNode 就是slave NameNode 下达命令,DataNode执行实际的操作
  3. Client 就是客户端
    (1) 文件切分.文件上传HDFS的时候,client将文件切分成一个一个的Block,然后进行上传;
    (2) 与NameNode交互,获取文件的位置信息;
    (3)与DataNode交互,读取或者写入数据;
    (4) Client提供一个命令来访问HDFS 比如对HDFS增删改查
  4. Secondary NameNode 并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务.
    (1) 辅助NameNode 分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
    fsimage和edits的作用见此链接fsimage和edits
    将faimage转化为xml的语法
    hdfs oiv -p XML fsimage_000000000000 -i fsimage_000000000000 -o f.xml
    将edits转化为xml
    hdfs oev -p XML -i edits_inprogress_0000000000001 -o edit.xml
    HDFS块大小.
    HDFS中的文件在物理上是分块存储,块的大小可以通过配置参数(dfs.blocksize)来规定.默认大小为128M
HDFS的常用命令格式

hadoop fs -(shell命令)
大致格式就是上面这样

设置文件副本数

hadoop fs -setrep 文件路径/文件

HDFS的写流程

场景: 客户端要将200M的文件上传到集群.

  1. 首先向NameNode请求上传文件/usr/local/a.avi
  2. NameNode向客户端响应可以上传文件
  3. 请求上传一个个Block,(0-128M) 请返回datanode
  4. namenode 返回可以存储的dn1,dn2,dn3节点,表示这三个节点可以存储数据
  5. 客户端与dn1,dn2,dn3 建立block传输通道,然后等待各个节点应答
  6. 节点应答成功
  7. 开始向节点按照链式的形式进行传输并在每个节点上存储相同的block数据.(即副本)
  8. 存储成功后客户端向namenode 通知传输完成.

在这里插入图片描述

HDFS读数据流程

场景: 客户端要在集群中下载/usr/local/a.avi

  1. 创建分布式文件系统并向namenode请求下载/usr/local/a.avi
  2. namenode 返回目标文件的元数据
  3. 客户端创建输入流并根据传递来的元数据向节点请求去读block1,和block2,
  4. 节点开始传输数据(注:在读取不同节点获取块的时候,是现在一个节点上读取数据完毕之后,关闭流之后再读取节点2)

在这里插入图片描述

网络拓扑 节点距离的计算

同一节点上的进程为0
同一机架上的不同节点
同一数据中心上的不同机架上的节点
不同数据中心上的节点
在这里插入图片描述

副本的存储策略

第一个副本在client所处的节点上,如果客户端在集群外,随机选一个
第二个副本和第一个副本位于相同机架上,随机节点
第三个副本位于不同机架,随机节点.

NameNode 和SecondaryNameNode

NameNode中的元数据存储在哪里
元数据存储在内存中,但是如果只存储在内存中,一旦断电,元数据丢失,整个集群就无法工作了,因此需要在磁盘中备份元数据FsImage.每当有元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits(只进行追加操作)中.
长时间添加数据到edits中,回导致文件数据越来越大,效率降低而且一旦断电回复元数据需要的时间过长.

NameNode工作机制

  1. 客户端要对集群上的/usr/local/a.avi进行操作
  2. NameNode首先将操作记录在编辑日志中,然后在内存中进行操作.
  3. secondary Namenode 首先请求是否需要checkpoint,(checkpoint操作的意义就是将编辑日志和镜像文件合并并序列化到镜像文件中)
    checkpoint触发的条件: 定时时间到 edits中的数据满了.
  4. secondary namenode 请求执行checkpoint
  5. 滚动正在写的编辑日志,并创建新的文件编辑日志2,之后的操作就记录在编辑日志2中,
  6. 将滚动好的编辑日志和镜像文件复制到secondary namenode 中,并在secondary namenode中加载到内存中进行合并 并生成最新的fsimage.checkout
  7. 将fsimage.checkout拷贝回namenode中,并将名字改为fsimage,

在这里插入图片描述

checkpoint时间设置

参数 dfs.namenode.checkpoint.period 时间限制
参数 dfs.namenode.checkpoint.txns 操作次数限制 如何检测次数到了操作次数限制 即要定时的检查次数 设置属性dfs.namenode.checkpoint.check.period 设置 一般设置为一分钟
设置的文件是hdfs-site.xml

NameNode故障处理

方法1:将secondaryNameNode中数据拷贝到NameNode存储数据的目录中

  1. kill -9 namenode进程
  2. 删除掉namenode 存储的数据 文件位置 hadoop目录下/data/tmp/dfs/name/*
  3. 拷贝SecondaryNamenode的数据到原namenode存储目录中
    scp -r root@hadoop2.sofency.top:/opt/soft/hadoop-2.7.7/data/tmp/dfs/namesecondary/* /opt/soft/hadoop-2.7.7/data/tmp/dfs/name/*
  4. 重新启动namenode
    hadoop-daemon.sh start namenode

方法2:使用-importCheckpoint 选项启动NameNode 守护进程,从而将secondaryNameNode中的数据拷贝到NameNode目录中

  1. 先修改checkpoint的时间尽量缩短
    dfs.namenode.checkpoint.period设置值为120
  2. kill -9 namenode进程
  3. 删除namenode存储的数据
  4. 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储的数据拷贝到namenode存储的数据的评级目录,并同时删除secondarynamenode 中的in_use.lock文件
  5. 执行命令导入检查点数据
    bin/hdfs namenode -importCheckpoint
  6. 启动namenode
    sbin/hadoop-daemon.sh start namenode
集群安全模式
  1. NameNode 启动
    NameNode 启动时,首先将镜像文件(FsImage) 载入内存,并执行编辑日志(Edits)中各项操作,一旦在内存中成功建立文件系统元数据的映像,则创建一个新的FsImage文件和一个空的编辑日志.此时NameNode开始监听DataNode请求.这个过程期间,NameNode一直运行在安全模式即NameNode的文件系统对于客户端来说是只读的
  2. DataNode启动
    系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中,在系统正常操作期间,NameNode会在内存中保留所有块位置的映射信息,在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统.
  3. 安全模式退出判断
    如果满足最小副本条件,NameNode会在30秒之后就退出安全模式,所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值 dfs.namenode.min=1) 在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式
安全模式的基本命令
bin/hdfs dfsadmin -safemode get  查看安全模式状态
bin/hdfs dfsadmin -safemode enter  进入安全模式
bin/hdfs dfsadmin -safemode leave 离开安全模式
bin/hdfs dfsadmin -safemode wait 等待安全模式
NAMENODE多目录配置

操作文件: hdfs-site.xml

<!--设置多目录-->
<property>
	<name>dfs.namenode.dir</name>
	<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>

重新格式化namenode
hadoop fs namnode -format

DataNode工作机制
  1. DataNode 启动后向NameNode 注册
  2. NameNode返回注册成功的信息
  3. 以后每周期(1小时)上报所有块的信息
  4. 心跳每3s一次,心跳返回结果带有Namenode给DataNode的命令
  5. 超过10分钟没有收到DataNode的心跳则认为该节点不可用

在这里插入图片描述

掉线时限参数设置

namnode和datanode之间要进行通讯,如果突然datanode进程死亡或者网络通信故障无法与namnode通信,namnode不会把datanode判定为死亡,要经过一段时间,这段时间暂称作超时时长.
HDFS 默认的超时时长为10分钟+30秒
超时时间的计算公式为
TimeOut=2*dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval.

默认值
dfs.namenode.heartbeat.recheck-interval 大小为5分钟, 检测过期时间
dfs.heartbeat.interval默认为3秒 检测数据节点是否可以进行计算
可以在hdfs-site.xml中设置

添加白名单

添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出
配置白名单的具体步骤:

  1. 在NameNodede 中的hadoop文件下 etc/hadoop/下创建dfs.hosts文件
    添加主机的节点名字
hadoop101
hadoop102
  1. 在hdfs-site.xml配置文件中添加dfs.hosts属性
<property>
	<name>dfs.hosts</name>
	<value>dfs.hosts文件的路径</value>
</property>
  1. 在集群中的每个节点上都配置下
  2. 刷新节点 hdfs dfsadmin -refreshNodes
添加黑名单
  1. 在NameNode的hadoop目录下的etc/hadoop目录下创建dfs.hosts.exclude文件
  2. 同上添加集群的节点信息
  3. 同样在hdfs-site.xml中添加配置文件
<property>
	<name>dfs.hosts.exclude</name>
	<value>dfs.hosts.exclude文件的路径</value>
</property>
  1. 刷新ResourceManager
hdfs dfsadmin -refreshNodes 
yarn rmadmin -refreshNodes
HDFS新特性
  1. 集群件数据拷贝
    scp -r 文件 目标用户@目标ip:/目录/文件
    如果两台主机没有进行ssh的配置的话
    使用distcp命令实现集群间拷贝
    bin/hadoop dsitcp hdfs://hadoop1:9000/usr/local/hello.txt hdfs://hadoop2:9000/usr/local/hello.txt

  2. 小文件归档
    hdfs存储小文件的弊端,每个块的元数据存储在namenode的内存中,因此hdfs存储小文件会非常的低效,因为大量的小文加你会耗尽namnode中大部分内存,但注意,存储小文件磁盘容量和数据块的的大小无关,例如一个1M的文件设置为128M的块存储,实际使用的是1MB的磁盘控件,而不是128M

    实操:

    1. 启动yarn
    2. 归档文件 把/usr/local/input目录下的所有文件归档到一个input.har的归档文件中,并把归档后的文件存放到/usr/local/output/路径下
      bin/hadoop archive -archiveName input.har -p /usr/local/input /usr/local/output
    3. 查看归档命令
      hadoop fs -ls -R har:///usr/local/output/input.har 显示归档的小文件
    4. 解归档文件
      hadoop fs -cp har:///usr/local/output/input.har/* /usr/local
  3. 快照管理
    快照相当于对目录做一个备份,并不会立即复制所有的文件,而是指向同一个文件,当写入发生时,才会产生新文件,类似于虚拟机的快照设置,新版本的快照信息基于原信息,但是新的数据加入时会记录在当前的快照上.
    快照的常用命令
    hdfs dfsadmin -allowSnapshot /路径 开启快照
    hdfs dfsadmin -disableSnapshot 路径 禁用快照
    hdfs dfs -createSnapshot 路径 对目录创建快照
    hdfs dfs -createSnapshot 路径 名字 对创建的快照起名字
    hdfs dfs -renameSnapshot 路径 旧名称 新名称 重命名快照
    hdfs dfs lsSnapshottableDir 列出当前用户所有可快照的目录
    hdfs snapshotDiff 路径1 路径2 比较两个快照目录的不同之处
    hdfs dfs -deleteSnapshot 删除快照

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值