HDFS
简介
一、概述
1.HDFS是Hadoop中用于数据存储的模块

细节
一、概述
1.HDFS中,存储数据的时候会将数据进行切块,每一个块称之为一个Block,
2.HDFS中,主要包含两个重要的进程,NameNode和DataNode。NameNode用于管理节点和记录元数据(metedata);DataNode是用于存储数据。
3.HDFS会对数据自动进行备份,称之为副本(replication)。如果不指定,默认情况下副本数量为3(额外复制两次,加上原来的数据构成3个副本)
4.HDFS仿照Linux设计了一套文件存储系统
二、Block
1.在HDFS中,数据都是以Block为单位进行存储的,
2.默认情况下,Block的大小是128M,通过dfs.blocksize来调节大小

上传文件到hadoop的根目录下
hadoop fs -put hadoop-2.7.1.tar.gz  /
在Hadoop上新建一个log目录
hadoop fs -mkdir /log

3.如果一个文件不足一个Block大小,则这个文件整体作为一个Block存储,并且Block的大小和文件的大小是一致的。
4.会给每一个Block一个编号,称之为BlockID,通过Block ID能够确定Block的顺序。
5.同一个Block的不同副本一定在不同的节点上,但是不同的Block的副本可能在一个节点上。
6.Block的意义:
a.为了能够去存储超大文件
b.为了进行快速备份

三、NameNode
1.NameNodde是HDFS的核心节点,用于管理DataNode以及存储元数据
2.元数据主要包含:
a.文件的存储路径
b.文件权限
c.文件大小以及块的大小
d.BlockID
e.Block的存储节点
f.副本数量
3.NameNode会将元数据存储在内存以及磁盘中
a.存储在内存中的目的是为了快速查询
b.存储在磁盘中的目的是为了崩溃恢复
4.元数据的存储路径是由hadoop.tmp.dir来决定
5.元数据的存储文件:
a.edits:记录写操作的文件
b.fsimage:映像文件。记录元数据,但是这个文件中的元数据和内存中的元数据并不是同步的,fsimage中的元数据往往是落后于内存中的元数据。

6.NameNode在接受到写操作的时候,先将这个操作记录到edits_inprogress文件中,如果记录成功,则更改内存中的元数据,内存中的元数据更改成功之后会给客户端返回成功信号。这样设计的目的是为了保证操作的可靠性,只要记录成功了,这个操作就一定会执行。
7.当fsimage进行更新的时候,将edits文件中的操作一一取出重新执行到fsimage中。此时edits_inprogress文件会滚动到edits文件,同时生成一个新的edits_inprogress用于记录新的操作。
8.fsimage更新 edits滚动的出发条件:
a.空间:当edits文件达到指定大小(默认是64M,这个大小可以通过ds.checkpoint.size—core-site.xml来调节)的时候,会触发edits文件的滚动。
b.时间:当距离上次滚动间隔指定时间(默认是3600s,这个时间可以通过fs.checkpoint.period来调节)之后,会触发edits文件的滚动。
c.重启:当NameNode重启的时候,会触发edits文件的滚动
d.强制:通过hadoop dfsadmin -rollEdits命令来强制edits文件滚动。
9.DataNode会通过心跳机制来向NameNode注册管理
DataNode会定时的发送心跳信息给NameNode
10.DataNode会每隔3s给NameNode发送一次心跳,心跳是通过RPC机制发送的。
11. 心跳信息
a.当前DataNodde中的Block信息
b.当前DataNode的状态(服役和预服役和预退役)
12.NameNode如果在10min没有收到DataNode的心跳,则认为这个DataNode已经lost,会将这个节点上的数据备份放到其他节点上保证整个集群中的副本数量。

13.NameNode重新启动之后,进行fsimage文件的更新/edits文件的滚动,将fsimage文件中的内容加载到内存中,等待DadaNode的心跳,并且对Datanode的心跳,如果在指定的时间内没有等到心跳,则认为DataNode已经丢失需要对应处理;如果等到了心跳那么NameNode对DataNode的数据进行校验,校验DataNode中的数据和元数据的记录是否一致,如果校验失败,会试图恢复这个数据。恢复成功之后,会再次校验,如果校验成功则自动退出安全模式,并且对外提供服务,不然只对外提供读服务,如果校验失败则重新恢复重新校验-这个过程称之为安全模式(safe mode)

14.在安全模式中,HDFS集群只对外提供读服务。
15.也正因为有安全模式的校验问题,所以要求副本数量不能多于节点的数量。
16.如果在合理的时间内,集群没有自动退出安全模式,那么可能就产生了数据丢失并且这个数据不可恢复。
17.强制退出安全模式:hadoop dfsadmin -safemode leave

四、副本放置策略
1.第一个副本:
a.如果是集群内部上传,谁上传第一个副本就在谁身上
b.如果是集群外部上传,则第一个副本就会放在相对空闲的节点上

2.第二个副本:
a.在Hadoop2.7之前,第二个副本是放在和第一个副本不同机架的节点上
b.从Hadoop2.7开始,第二个副本是放在和第一个副本相同机架的节点上

3.第三个副本:
a.在Hadoop2.7之前,第三个副本是放在和第二个副本相同机架的节点上
b.从Hadoop2.7开始,第三个副本是放在和第二个副本不同机架的节点上

4.更多副本:谁闲放在谁身上

五、机架感知策略
配置
默认情况下,hadoop的机架感知是没有被启用的。所以,在通常情况下,hadoop集群的HDFS在选机器的时候,是随机选择的,也就是说,很有可能在写数据时,hadoop将第一块数据block1写到了rack1上,然后随机的选择下将block2写入到了rack2下,此时两个rack之间产生了数据传输的流量,再接下来,在随机的情况下,又将block3重新又写回了rack1,此时,两个rack之间又产生了一次数据流量。在job处理的数据量非常的大,或者往hadoop推送的数据量非常大的时候,这种情况会造成rack之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。
要将hadoop机架感知的功能启用,配置非常简单,在namenode所在机器的hadoop-site.xml配置文件中配置一个选项:

<property>
<name>topology.script.file.name</name><value>/path/to/RackAware.py</value>
</property

这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为某台datanode机器的ip地址,而输出的值通常为该ip地址对应的datanode所在的rack,例如”/rack1”。Namenode启动时,会判断该配置选项是否为空,如果非空,则表示已经用机架感知的配置,此时namenode会根据配置寻找该脚本,并在接收到每一个datanode的heartbeat时,将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架,保存到内存的一个map中。
至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的ip地址正确的映射到相应的机架上去。一个简单的实现如下∶

# ! / usr/bin/python
#-*-coding:UTF-8 -*-
import sys
rack={
"hadoopnode-176.tj":"rack1",
"hadoopnode-178.tj":" rack1",
"hadoopnode-179.tj":"rack1",
"hadoopnode-180.tj":"rack1",
"hadoopnode-186.tj":"rack2",
"hadoopnode-187.tj":"rack2",
"hadoopnode-188.tj":"rack2",
"hadoopnode-190.tj":"rack2",
"192.168.1.15":"rack1",
"192.168.1.17":"rackl",
"192.168.1.18":"rack1",
"192.168.1.19":"rack1",
"192.168.1.25":"rack2",
"192.168.1.26":"rack2",
"192.168.1.27":"rack2",
"192.168.1.29":"rack2",
}

1.所谓的机架不是物理机架而是逻辑机架,本质上就是一个映射
2.可以将不同物理机架的节点映射到同一个逻辑机架上
3.实际过程中会将同一个物理机架上的节点去映射到同一个逻辑机架上

六、DataNode
1.存储Block
2.DataNode会给NameNode发送心跳。
3.存储Block的路径也是由hadoop.tmp.dir属性来指定

七、SecondaryNameNode

1.SecondaryNameNode并不是NameNode的备份,这个节点的作用辅助NameNode完成edits文件的滚动
2.在完全分布式中,一旦出现SecondaryNameNode,则edits文件的滚动是在SecondaryNameNode上进行;如果没有SecondaryNameNode,则edits文件的滚动NameNode自己完成
3.在HDFS集群中,只能采取NameNode+SecondaryNameNode结构或者是双NameNode结构,因为SecondaryNameNode的作用可以被NameNode取代,但是NameNode作为核心节点如果只有1个容易出现单点故障,所以实际过程中往往会舍弃SecondaryNameNode采用双NameNode结构来构成NameNode的HA(高可用)

hadoop 命令

hadoop fs -mkdir /news  创建目录
hadoop fs -put hadoop-2.7.1.tar.gz /    上传
hadoop fs -get /hadoop-2.7.1.tar.gz a.rpm 下载文件到当前目录下位a.rpm
hadoop fs -rm /hadoop-2.7.1.tar.gz  删除文件
hadoop fs -rmdir /news  删除目录
hadoop fs -cp /a/a.rpm /b/b.rpm 复制文件
hadoop fs -mv /a/a.rpm /b/b.rpm 移动文件
hadoop fs -ls / 查看
hadoop fs -lsr / 递归查看
hadoop fs -touchz /a.txt  创建一个空文件
hadoop fs -cat /a/a.txt  查看数据(数据较小)
hadoop fs -tail /a/a.txt  查看数据(较大,尾部2000的数据)
hadoop fs -getmerge /a merge.txt 合并下载(下载a路径下所有文件的内容到merge.txt里边)

八、回收站机制
1.HDFS中的回收站机制默认是不开启的

[root@hadoop01 hadoop-2.7.1]# cd etc/hadoop/
[root@hadoop01 hadoop]# vi core-site.xml
<!--垃圾回收间隔时间--><!--文件在挪入回收站之后,在回收站中的存活时间--><!--这个属性的值默认是0,单位是min--><property><name>fs.trash.interval</name><value>1440</value></property>
[root@hadoop01 hadoop]# hadoop fs -put /home/presoftware/hadoop-2.7.1.tar.gz /
[root@hadoop01 hadoop]# hadoop fs -rm /hadoop-2.7.1.tar.gz
21/09/04 22:22:09 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://hadoop01:9000/hadoop-2.7.1.tar.gz' to trash at: hdfs://hadoop01:9000/user/root/.Trash/Current

删除的文件移动到了user/root/.Trash/Current目录下

[root@hadoop01 hadoop]# hadoop fs -lsr /
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxr-xr-x   - root supergroup          0 2021-08-26 21:10 /gyj
drwxr-xr-x   - root supergroup          0 2021-08-26 18:38 /log
drwxr-xr-x   - root supergroup          0 2021-09-04 21:42 /news
drwx------   - root supergroup          0 2021-09-04 22:22 /user
drwx------   - root supergroup          0 2021-09-04 22:22 /user/root
drwx------   - root supergroup          0 2021-09-04 22:22 /user/root/.Trash
drwx------   - root supergroup          0 2021-09-04 22:22 /user/root/.Trash/Current
-rw-r--r--   1 root supergroup  210606807 2021-09-04 22:21 /user/root/.Trash/Current/hadoop-2.7.1.tar.gz
还原删除的文件,移动文件即可
[root@hadoop01 hadoop]# hadoop fs -mv /user/root/.Trash/Current/hadoop-2.7.1.tar.gz /a.rpm
start-dfs.sh  属于start-all.sh中的一部分

DFS目录
一、概述
1.dfs目录是在NameNode格式化的出现的
2. in_use.lock用于标记当前节点已经开启了对应进程
3. HDFS在第一次启动的时候,1min之后会自动进行一次edits文件的滚动

hadoop dfsadmin -rollEdits   强制滚动

扩展:
edits文件是一种字节码格式,机器可以看懂,如果人想要获取里边的信息,需要将其转换位人可以看懂的格式,比如转为xml文件

[root@hadoop01 current]# hdfs oev -i edits_0000000000000000001-0000000000000000002 -o a.xml
[root@hadoop01 current]# ls
a.xml
edits_0000000000000000001-0000000000000000002[root@hadoop01 current]# vi a.xml
<?xml version="1.0" encoding="UTF-8"?>
<EDITS><EDITS_VERSION>-63</EDITS_VERSION><RECORD><OPCODE>OP_START_LOG_SEGMENT</OPCODE><DATA><TXID>1</TXID></DATA></RECORD><RECORD><OPCODE>OP_END_LOG_SEGMENT</OPCODE><DATA><TXID>2</TXID></DATA></RECORD>
</EDITS>

4.在HDFS中,会对每一次的写操作分配一个全局递增的编号,编号称之为事务id - txid

5.在HDFS中,将开始记录日志和结束记录日志看作是一个写操作–每一个edits文件的开头和结尾都是OP_START_LOG_SEGMENT和
OP_END_LOG_SEGMENT
6.上传文件
a. OP_ADD:在HDFS上创建一个文件名_.COPYING_文件b. OP_ALLOCATE_BLOCK_ID:分配BlockID
c. OP_SET_GENSTAMP_V2∶设置时间戳编号
d. OP_ADD_BLOCK:给文件添加块–上传数据
e. OP _CLOSE:关流/关闭文件
f. OP_RENAME_OLD:重命名

7.文件在上传完成之后不能修改
8. md5文件是为了防止fsimage文件被篡改的,对fsimage文件进行校验的
9.VERSION:
a. clusterID-集群编号。在NameNode格式化的时候自动计算产生的,也就意味着NameNode每格式化一次clusterID就会重新计算。NameNode会将clusterlD分发给每一个DataNode ,DataNode也只接收一次。NameNode和DataNode之间的每一次通信都会携带这个clusterID
b. blockpoolID:块池编号。

注意:格式化多了之后 clusterID可能对不上,jsp会缺少进程,解决方法,删除tmp mkdir 一个tmp 重新格式化即可

[root@hadoop01 tmp]# pwd
/home/presoftware/hadoop-2.7.1/tmp

流程
一、读取流程/下载
1.客户端发起RPC请求到NameNode
2. NameNode收到请求之后会校验这个文件是否存在
3. 如果文件存在,NameNode给客户端一个信号
4. 客户端就会向NameNode要第一个Block的地址
5. NameNode在收到请求之后会读取元数据,然后将第一个Block的地址放入队列中返回给客户端
6.客户端收到队列之后从中选择一个较近的节点来读取第一个Block,读取完成之后,会对这个Block进checksum的验证;如果校验失败,客户端会给NameNode—个信号然后重新选取地址重新读取;如果校验成功,则客户端会向NameNode要第二个Block的地址,重复4.5.6过程
7.客户端读取完成所有的Block之后,会给NameNode一个结束信号。NameNode在收到信号之后会关闭文件

二、写入流程/上传
1.客户端发起RPC请求到NameNode
6. NameNode在接收到请求之后会进行校验∶
a.校验指定路径是否存在
b.校验写入路径是否有权限
c.校验指定路径中是否有同名文件
3.如果校验失败,则抛出异常﹔如果校验成功,记录元数据,NameNode会给客户端一个信号
4.客户端在收到信号之后会向NameNode要第一个Block的存储位置
7. NameNode在收到请求之后,会等待DataNode的心跳,选取DataNode的地址放入队列中返回给客户端。默认情况下,NameNode会选择3个地址
6.客户端收到队列中取出3个地址,从这些地址中选择一个较近(拓扑距离短)的节点写入第一个Block的第一个副本
7.第一个副本所在节点会通过pipeline (管道,实际上就是NIO中的Channel )将第二个副本写到其他节点上,第二个副本所在的节点再写第三个副本
8.写完之后,第三个副本所在的节点会给第立个副本所在的节点返回ack,第二个副本所在的节点收到ack之后会给第一个副本所在的节点返回ack,第一个副本所在的节点再给客户端返回ack
9.写完第一个Block之后,客户端会和NameNode要第二个Block的存储位置,然后重复5.6.7.8过程
10.当写完所有的Block之后,客户端会给NameNode—个结束信号,NameNode就会关闭文件/关流,文件关闭之后,这个文件就不可修改

三、删除流程
1.客户端发起rpc请求到NameNode
8. NameNode在收到请求之后,会将这个请求记录到edits文件中,然后更新内存中的元数据,内存更新成功之后会客户端返回一个ack信号,此时这个文件对应的Block依然存储在DataNode
3.在NameNode收到DataNode的心跳的时候,NameNode就会检查Block信息,会给DataNode进行心跳响应,要求删除对应的Block。DataNode在收到心跳响应之后才会真正删除Block

hadoop day02相关推荐

  1. 【备忘】最新spark/hadoop/hbase/hive/kafka/redies大数据视频教程

    day01 软件安装.Linux相关.shell     day02 自动化部署高级文本命令     day03 集群部署zookeeper     day04 并发动态大数据机制.Java反射.动态 ...

  2. 【备忘】2017零基础自学云计算分析hadoop/storm/spark大数据开发视频教程

    day01 软件安装.Linux相关.shell     day02 自动化部署高级文本命令     day03 集群部署zookeeper     day04 并发动态大数据机制.Java反射.动态 ...

  3. hadoop 添加删除机器以及设置免密登录

    添加hadoop机器 先在slaves中添加机器 然后启动datanode $: ./usr/hadoop-0.20.2-cdh3u4/bin/hadoop-daemon.sh start datan ...

  4. linux环境下快速配置hadoop集群免密登录

    背景 在hadoop的日常使用过程中经常需要登录某些机器,如何更好的免密登录呢?这将为我们节省大量的时间 操作 假设你需要在A机器上免密登录B机器,那么你首先要确定B机器下是有秘钥文件的.如何确定是否 ...

  5. hadoop问题小结

    20220322 https://blog.csdn.net/lt5227/article/details/119459827 hadoop控制台设置密码 访问验证 20220314 进入hive 高 ...

  6. hadoop,spark,scala,flink 大数据分布式系统汇总

    20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...

  7. spark,hadoop区别

    https://zhuanlan.zhihu.com/p/95016937 Spark和Hadoop的区别和比较: 1.原理比较: Hadoop和Spark都是并行计算,两者都是用MR模型进行计算 H ...

  8. 2021年大数据Hadoop(三十):Hadoop3.x的介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop3.x的介绍 介绍 Hadoop 3.0新特性 ...

  9. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  10. 2021年大数据Hadoop(二十七):YARN运行流程

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...

最新文章

  1. Python零碎知识(7):硬性出错
  2. Python做数据分析时中文乱码?matplotlib出现中文乱码3行代码解决
  3. Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)
  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
  5. 四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...
  6. weka分类器怎么设置类别_AI 迁移学习怎么玩?手把手教你实战迁移学习
  7. python消费kafka逻辑处理导致cpu升高_Kafka 消费迟滞监控工具 Burrow
  8. [BZOJ4621]Tc605
  9. [POJ3233] Matrix Power Series(矩阵快速幂)
  10. 初生牛犊不怕虎的我记录一次 web面试
  11. 云计算中存储继承知识
  12. 03 学生免费注册Pycharm专业版
  13. python单词库_python 单词库
  14. react 返回上一页
  15. TCP/IP多路复用
  16. discuz 3.1修改浏览器顶部标题 - Powered by Discuz!
  17. mstsc登录xubuntu16.04
  18. ORC 之 C++ 之 Reader
  19. matlab车牌匹配时读取,基于Matlab的车牌识别(完整版)详解.doc
  20. 码垛机械臂工作站系统设计

热门文章

  1. 手机序列号和IMEI号的区别
  2. MySQL学习笔记①_案例记录
  3. coreldraw的线条怎么变成圆头_CDR将照片变线条的三种方法
  4. java.lang.NoClassDefFoundError: Could not initialize class com.cyj.util.Jdbc
  5. FCC认证和3C认证区别
  6. 模拟退火(SA)算法实例介绍(JAVA)
  7. 【vishwaCTF】web题解wp
  8. 计算机在学前教育中作用论文,学前教育论文
  9. 刘德华--2初恋时节
  10. STR鉴定原理、流程已经报告数据解读指南