Hadoop进程理解
进程理解
HDFS相关进程理解(NN,DN,SSN)
NameNode中存放的是数据文件与元数据的映射信息,数据文件和block快的映射信息,block块和DataNode的映射信息,前两者存放在磁盘里,Hadoop stop后不会消失,第三个存放在内存中,会消失;
DataNode通过PING PONG 机制被NameNode识别,每三秒中做一次应答,若失联十分钟则DataNode宕机,
宕机后,数据不完整,NameNode会自动将该DataNode上的block块在其他节点上的副本增加一个,并找个合适的地方存,若此时丢失的DataNode回来了,
block就会多一个,此时会慢慢将多余block块即副本数删去;
通过启动-汇报机制,向NameNode汇报所有block块信息,若某NameNode启动没启动起来,按宕机方法恢复
功能:
1、接受客户端的读/写服务
因为NameNode知道数据文件与DataNode的对应关系
2、保存文件的时候会保存文件的元数据信息
a. 文件的归属
b. 文件的权限
c. 文件的大小,时间
d. Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN向NN汇报。
3、收集Block的位置信息
3.1 系统启动
a. NN关机的时候是不会存储任何的Block与DataNode的映射信息的
b. DN启动的时候会自动将自己节点上存储的Block信息汇报给NN
c. NN接收请求之后会重新生成映射关系
File ----> Block
Block---> DN
d. 如果数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
3.2 集群运行中
a. NN与DN保持心跳机制,三秒钟发送一次
b. 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
c. 可以让客户端读取存活的DN节点
d. 如果NN与DN三秒没有心跳则认为DN出现异常,此时不会让新的数据写到这个异常的DN中,客户端访问的时候不提供异常DN节点地址
e. 如果超过十分钟没有心跳,那么NN会将当前DN节点存储的数据转移到其他的节点
4、NameNode为了效率,将所有的操作都在内存中进行
a. 执行速度快
b. NameNode不会和磁盘进行任何的数据交换
但是会存在两个问题:
1)数据的持久化
2)数据保存在内存中,断电丢失
DataNode(DN)
1、存放的是文件的数据信息,以及验证文件完整性的校验信息
2、数据会存放在硬盘上
a. 1m=1条元数据
b. 1G=1条元数据
c. NameNode非常排斥存储小文件(能存,但是不推荐!!面试必问)
一般小文件在存储之前需要进行压缩
3、汇报
1)启动时
汇报之前会验证Block文件是否被损坏
向NN汇报当前DN上block的信息
2)运行中
向NN保持心跳机制
4、当客户端读写数据的时候,首先会先去NN查询file与block与DN的映射,然后客户端直接与DN建立连接,然后读写数据
SecondaryNameNode(SNN)
1、传统的内存持久化方案
1)日志机制
a. 做任何操作之前先记录日志
b. 在数据改变之前先记录对应的日志,当NN停止的时候
c. 当我下次启动的时候,只需要重新按照以前的日志“重做一遍”即可
缺点:
a. log日志文件的大小不可控,随着时间的发展,集群启动的时间会越来越长
b. 有可能日志中存在大量的无效日志
优点:
a. 绝对不会丢失数据
2)拍摄快照
a. 我们可以将内存中的数据写出到硬盘上(序列化)
b. 启动时还可以将硬盘上的数据写回到内存中(反序列化)
缺点:
a. 关机时间过长
b. 如果是异常关机,数据还在内存中,没法写入到硬盘
c. 如果写出的频率过高,导致内存使用效率低
优点:
启动时间较短
2、SNN的解决方案(面试题)
1)解决思路
a. 让日志大小可控(每64M)
b. 快照需要定时保存(每隔1h)
c. 日志+快照
2)解决方案
a. 当我们启动一个集群的时候,会产生4个文件
/usr/local/soft/hadoop-2.7.6/tmp/dfs/name/current
b. 我们每次操作都会记录日志-->edits-inprogress- edits_00000001,随着时间的推移,日志文件会越来越大-当达到阈值的时候(64M或3600秒),会生成新的日志文件,edits_inprogress-000000001 -->edits_0000001,创建新的日志文件 edits_inprogress-0000000016。
格式化hdfs namenode -format后,会产生一个快照文件fsimage-0,和记录日志文件edits-inprogress,通过start -all.sh或start -dfs.sh启动,
随着时间的推移日志文件越来越大,到达阈值(64M或1h)后,会生产新的日志文件edits-1-100,
SecondaryNameNode会通过http(socket通信)获得之前的fsimage-0和新生成的日志文件edits-1-100进行合并生产新的快照fsimage-1,
并同步给namenode,后面以此类推。
安全模式
安全模式是 HDFS 的一种工作状态,处于安全模式的状态下,只向客户端提供文件的只读视图,不接受对命名空间的修改;同时 NameNode 节点也不会进行数据块的复制或者删除, NameNode 启动时, 1)首先将镜像文件( fsimage )载入内存,并执行编辑日志( edits )中的各项操作。 2)一旦在内存中成功建立文件系统元数据的映射,则创建一个新的 fsimage 文件和一个空的编辑日志。 3)NameNode 开始监听 RPC 和 Http 请求。 4)此时 NameNode 处于安全模式,只接受客户端的读请求。
5)处于这个状态是为了保护数据的安全所以只能被客户端访问读取数据
# 对安全模式的理解
# 1.工作流程
a.启动 NameNode,NameNode 加载 fsimage 到内存,对内存数据执行 edits log 日 志中的事务操作。
b.文件系统元数据内存镜像加载完毕,进行 fsimage 和 edits log 日志的合并,并创 建新的 fsimage 文件和一个空的 edits log 日志文件。
c.NameNode 等待 DataNode 上传 block 列表信息,直到副本数满足最小副本条件。
d.当满足了最小副本条件,再过 30 秒,NameNode 就会退出安全模式。最小副本条件指 整个文件系统中有 99.9%的 block 达到了最小副本数(默认值是 1,可设置)
# 在 NameNode 安全模式(safemode)
对文件系统元数据进行只读操作
当文件的所有 block 信息具备的情况下,对文件进行只读操作
不允许进行文件修改(写,删除或重命名文件)
# 2.注意事项
a.NameNode 不会持久化 block 位置信息;DataNode 保有各自存储的 block 列表信息。 正常操作时,NameNode 在内存中有一个 blocks 位置的映射信息(所有文件的所有文 件块的位置映射信息)。
b.NameNode 在安全模式,NameNode 需要给 DataNode 时间来上传 block 列表信息到 NameNode。如果 NameNode 不等待 DataNode 上传这些信息的话,则会在 DataNode 之间进行 block 的复制,而这在大多数情况下都是非必须的(因为只需要等待 DataNode 上传就行了),还会造成资源浪费。
c.在安全模式 NameNode 不会要求 DataNode 复制或删除 block。
d.新格式化的 HDFS 不进入安全模式,因为 DataNode 压根就没有 block。
# 4.命令操作
# 通过命令查看 namenode 是否处于安全模式:
hdfs dfsadmin -safemode get
Safe mode is ON HDFS 的前端 webUI 页面也可以查看 NameNode 是否处于安全模式。 有时候我们希望等待安全模式退出,之后进行文件的读写操作,尤其是在脚本中,此时:
`hdfs dfsadmin -safemode wait`
# your read or write command goes here 管理员有权在任何时间让 namenode 进入或退出安全模式。进入安全模式:
`hdfs dfsadmin -safemode enter`
Safe mode is ON 这 样 做 可 以 让 namenode 一 直 处 于 安 全 模 式 , 也 可 以 设 置 `dfs.namenode.safemode.threshold-pct` 为 1 做到这一点。 离开安全模式:
`hdfs dfsadmin -safemode leave`
Safe mode is OFF
系统中的数据块的位置并不是由 NameNode 维护的,而是以块列表的形式存储在 DataNode 中。 [root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/* [root@node01 ~]# scp -r root@node02:/var/yjx/hadoop/full/dfs/namesecondary/current/* /var/yjx/hadoop/full/dfs/name/current
安全模式下 a. 安全模式下,各个 DataNode 会向 NameNode 发送自身的数据块列表 b. 当 NameNode 有足够的数据块信息后,便在 30 秒后退出安全模式 c. NameNode 发现数据节点过少会启动数据块复制过程 如果 NN 收集的 Block 信息没有达到最少副本数,就会将缺失的副本 , 从有的 DN 上拷贝到其他 DN a. dfs.replication.min=2 b. 但是默认最低副本数为 1 c. 在拷贝的过程中系统还是处于安全模式 安全模式相关命令 hadoop dfsadmin -safemode leave 强制 NameNode 退出安全模式 hadoop dfsadmin -safemode enter 进入安全模式 hadoop dfsadmin -safemode get 查看安全模式状态 hadoop dfsadmin -safemode wait 等待一直到安全模式结束
HDFS的权限
HDFS对权限的控制
a. 只能防止好人做错事
b. 不能防止坏人做坏事
但是告诉你是谁,他就认为你是谁!!
机架感知
机架感知是为了保证副本在集群中的安全性 我们需要将节点放在不同的DN节点上,节点也需要一定的考量 可靠性,可用性,带宽消耗 第一个节点: 集群内部(优先考虑和客户端相同的节点作为第一个节点) 集群外部(选择资源丰富且不繁忙的节点作为第一个节点) 第二个节点: 第二个节点选择与第一个节点不同机架的其他节点 第三个节点: 与第二个相同机架相同的其他节点 第N个节点: 与前面节点不重复的其他节点
第一种模式:
第二种模式:
HDFS的读写流程(重点!)
写数据
写数据就是将客户端上的数据上传到HDFS
宏观过程
客户端通过put向HDFS发送数据请求,通过rpc的方式将客户端和namenode建立一个联系,再进行校验(文件的权限、路径等),若校验通过,namenode会创建一个空的entry对象,
并返回成功状态给DFS(文件分布式系统),
DFS接受后会创建一个FSDataOutputStream给客户端使用,客户端将block块分成多个packet(64k)进行传输,先传输到pipeline的第一个节点,并留下一个ack状态,等待确认,
再传输至第二个节点,留下ack状态,直至pipeline最后一个节点收到packet时,
方向反馈true状态进行确认,按此方式,直至最后一个block块传输完毕,客户端收到确认,并关闭FSDataOutputStream通道,结束写流程
1.客户端向HDFS发送写数据请求
hdfs dfs -put students.txt /shujia/
2. Filesystem通过rpc调用namenode的put方法
a. nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限
b. 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
c. 没有:直接抛出对应的异常,给予客户端错误提示信息
3.如果DFS接收到成功的状态,会创建一个FSDataOutputStream的对象给客户端使用
4.客户端要向nn询问第一个Block存放的位置
NN通过机架感知策略 (node1 node 2 node3)
5.需要将客户端和DN节点创建连接
pipeline(管道)
客户端 和 node1 创建连接 socket node1 和 node2 创建连接 socket node2 和 Node3 创建连接 socket 6.客户端按照文件块切分数据,但是按照packet发送数据 默认一个packet大小为64K,Block128M为2048个packet
7.客户端通过pipeline管道开始使用FDSOutputStream对象将数据输出
1. 客户端首先将一个 packet 发送给 node1, 同时给予 node1 一个 ack 状态
2. node1接受数据后会将数据继续传递给 node2, 同时给予 node2 一个 ack 状态
3. node2接受数据后会将数据继续传递给 node3, 同时给予 node3 一个 ack 状态
4. node3将这个 packet 接受完成后,会响应这个 ack 给 node2 为 true
5. node2会响应给 node1 , 同理 node1 响应给客户端
8.客户端接收到成功的状态 , 就认为某个 packet 发送成功了,直到当前块所有的 packet 都发送完成
1. 如果客户端接收到最后一个 pakcet 的成功状态 , 说明当前 block 传输完成,管道就会被撤销
2. 客户端会将这个消息传递给 NN , NN 确认传输完成
1. NN会将 block 的信息记录到 Entry, 客户端会继续向 NN 询问第二个块的存储位置 , 依次类推
block1 (node1 node2 node3)
block2 (node1 node3 node6)
....
blockn(node1 node4 node6)
3. 当所有的 block 传输完成后, NN 在 Entry 中存储所有的 File 与 Block 与 DN 的映射关系关闭
FsDataOutPutStream
微观过程(如何保证package发送的时候不出错呢?)
1.客户端首先从自己的硬盘中以流的形式将自己的数据读取到缓存中 2.然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64k)
1. chunk:checksum=128:1
2. checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
3. Packet中的数据分为两类,一类是实际数据包,另一类是 header 包。
4. 一个 Packet 数据包的组成结构(分两类,一类是实际的数据包,另一类是header包。)
一个数据包的组成结构:
参数理解
3.(默认生成的快,发送的慢)当packet满的时候添加到dataqueue 4.datastreamer开始从dataqueue队列上读取一个packet,通过FDSDataOPS发送到Poepleline 在取出的时候,也会将 packet 加入到 ackQueue, 典型的生产者消费者模式
客户端发送一个 Packet 数据包以后开始接收 ack ,会有一个用来接收 ack 的 ResponseProcessor 进程,如果收到成功的 ack
1. 如果某一个 packet 的 ack 为 true, 那么就从 ackqueue 删除掉这个 packet
2. 如果某一个 packet 的 ack 为 false, 将 ackqueue 中所有的 packet 重新挂载到 发送队列 , 重新发送
读数据
1.首先客户端发送请求到 DFS ,申请读取某一个文件 2.DFS 去 NN 查找这个文件的信息 ( 权限 , 文件是否存在 ) 如果文件不存在,抛出指定的错误 如果文件存在,返回成功状态 3.DFS 创建 FSDataInputStream 对象,客户端通过这个对象读取数据 4.客户端获取文件第一个 Block 信息 , 返回 DN1 DN2 DN8 5.客户端直接就近原则选择 DN1 对应的数据即可 6.依次类推读取其他块的信息,直到最后一个块 , 将 Block 合并成一个文件 7.关闭 FSDataInputStream
Hadoop进程理解的更多相关文章
- Hadoop的理解笔记
1.2Hadoop与云计算的关系1.什么是云计算:一种基于互联网的计算,在其中共享的资源.软件和信息以一种按需的方式提供给计算机和设备 , 就如同日常生活中的电网一样. 什么是Hadoop:Hadoo ...
- Hive分析hadoop进程日志
想把hadoop的进程日志导入hive表进行分析,遂做了以下的尝试. 关于hadoop进程日志的解析 使用正则表达式获取四个字段,一个是日期时间,一个是日志级别,一个是类,最后一个是详细信息, 然后在 ...
- 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)
什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...
- 学习Hadoop整体理解
HDFS是Hadoop的核心模块之一,围绕HDFS是什么.HDFS的设计思想和HDFS的体系结构三方面来介绍. Hadoop的设计思想受到Google公司的GFS设计思想的启示,基于一种开源的理念实现 ...
- 使用process_monitor.sh监控hadoop进程的crontab配置
可以从下列链接找到process_monitor.sh:https://github.com/eyjian/libmooon/blob/master/shell/process_monitor.sh ...
- Linux进程理解与实践(五)细谈守护进程
一. 守护进程及其特性 守护进程最重要的特性是后台运行.在这一点上DOS下的常驻内存程序TSR与之相似.其次,守护进程必须与其运行前的环境隔离开来.这些环境包括未关闭的文件描述符,控制终端, ...
- Linux进程理解与实践(三)进程终止函数和exec函数族的使用
进程的几种终止方式(Termination) (1)正常退出 从main函数返回[return] 调用exit 调用_exit或者_Exit 最后一个线程从其启动处返回 从最后一个线程调用pthrea ...
- Linux进程理解与实践(二)僵尸&孤儿进程 和文件共享
孤儿进程与僵尸进程 孤儿进程: 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程.(注:任何一个进程都必须有父进程) [cpp] view plaincopy #include & ...
- Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)
进程 and 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...
随机推荐
- snippet,让你编码效率翻倍
为什么谈到Snippet 今天下午在用vscode做小程序的时候,发现很不方便,因为商店里提供的代码片段极为有限,而且平时几乎每天都需要用到代码片段,所以就在思考他们是怎么做到给别人提供代码的,我可以 ...
- 动态div点击事件传递对象参数格式-草稿889
<button type='button' style='border: 1px solid #eeeeee;color: #717070;height: 20px;border-radius: ...
- kali添加开机自启[亲测有效]
kali添加开机自启 采用systemd的方法,kali默认是没有rc.local的,需要自己创建.本方法也适用于ubuntu 18.04 64bit 改写rc-local.service 文件 先从 ...
- python---从尾到头打印链表
class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: # 返回从尾部到头部的列表值序 ...
- UML中类关系表示与Java代码中的对应关系
UML中类关系表示与Java代码中的对应关系 1. 类的UML表示法 上图中,Employee 类有两个String类型的私有属性和一个返回值为String类型public 方法 getName(); ...
- 【云原生小课堂】高性能、高可用、可扩展的MySQL集群如何组建?
本期[云原生小课堂]将带你入门PXC--公认的MySQL集群优选方案.
- C++五子棋(五)——实现AI落子
AI思考落子点 在之前我们已经实现计算权值了,现在要想让AI落子,应根据之前的计算结果使棋子落在分值最大点上.当然可能会出现多个分值相同的最大点,这时在其中随机取一个点落下即可. chessData. ...
- JavaScript基础第04天笔记
JavaScript基础第04天笔记 1 - 数组 1.1 数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式. 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以 ...
- AcWing 158. 项链 (最小表示法)
项链 题源:https://www.acwing.com/problem/content/160/ 题目 原理:最小表示法 找字典序最小的字符串 循环移位,破环成链 (把原串复制一倍) memcpy ...
- JavaScript学习基础2
##JavaScript基本对象 1 .function:函数(方法)对象 * 创建: 1.var fun =new Function(形式参数,方法体): 2.function 方法名(参数){ 方 ...