Hadoop-03

1、HDFS:分布式文件系统,在hadoop中支持很多种文件系统,hdfs是使用最多的,可以看成是一个软件,将各个服务器的磁盘连成一体,来完成某项任务。

2、FileSystem是抽象类:有很多的实现类不同的实现类有不同的功能;①localfileSystem:本地文件系统(指代linux的文件系统)②:distributeFileSystem:分布式文件系统(HDFS);③ webhdfs:支持浏览器方式对文件系统操作;④harfilesystem:小文件操作

3、数据存入每个note节点,有些文件路径一样,我们需要在机器中记录具体是哪个node节点;当单个文件过大时,我们一个node节点存储容量不够,我们可以把文件切割split开(默认每块128M大小),然后存入两个node节点,此时我们在读取文件时,需要记录住两个node节点的地址,也就是一个数据存储在两个node上;在存储时,我们担心数据丢失,会对数据进行备份,默认备份2份,共3份(HDFS就做了上述内容,namenode管理元数据,datanode存储数据)

4、namenode和datanode之间具有心跳机制(保证name和data的连接,如果一定时间内没有心跳连接,则认为“死亡”)、负载均衡机制(某台机器快满,尽量存储到其他机器中)、副本机制(data会定时上报自己的块信息,name会实时查看上报信息中块的信息是否足够3个,不够就添加,多了就删除)这三个机制

5、namenode存储在内存中,datanode存储在本地磁盘中,且每个文件都有一个block.id

6、HDFS不准许用户对文件进行修改,只能读取操作。文件权限很弱,你告诉我你是谁,你就是谁

7、常用HDFS的操作命令:help(查看帮助)、ls(列出文件)、mkdir(创建目录)、put(上传)、get(下载)、mv(在hadoop系统中移动)、rm(删除)、cp(复制)、tail(查看后几行)、setrep(设置副本个数,默认3个)

8、HDFS高级命令:

文件限额配置:对某一个目录进行数量和空间大小的限制(比如百度网盘)------限制数量:hdfs dfsadmin -setQuota 2 lisi------限制大小:hdfs dfsadmin -setSpaceQuota 4k /user/root/lisi
安全模式:hadoop进入安全模式下,不准许用户进行增删改的操作,只能查询,hadoop在启动后的30s内(自检),是安全模式,之后退出安全模式------hdfs dfsadmin -safemode get/enter(关/开)

9、HDFS将所有的文件都抽象为block块来进行存储,在hadoop2中默认大小是128M,简化操作;不论存储的文件有多大,只要大于128M,我们就会对数据进行切割;可以针对每一个块设置备份,提高高可用。支持块缓存(某些文件经常使用,可以提取出来放在内存中,加快提取速度)

10、一个元数据大概120字节,128g的内存,大概能存10亿个文件。_

11、block的三个副本再存储的时候,会在同机架服务器上再存一个,第三个副本会存在于另一台机架服务器上,避免共同损失;不把三个副本全部分开存储是为了读取的时候会速度快,更方便。

12、hadoop写入数据流程

1、client客户端请求namenode,执行写入操作
2、namenode接收到客户端的请求后,验证是否有权限以及文件是否已经存在,如果没有权限或者文件存在,直接抛出异常,如果ok,通知client可以上传
3、客户端开始对文件进行切割,默认每个128M
4、client再次请求namenode,询问第一个block放置在哪些机器总
5、namenode根绝副本的数量和机架感知原理,以及网络拓扑关系寻找更为合适的机器,返回给客户端机器列表
6、client连接列表中第一台的节点,第一台节点连接第二台几点,第二台连接第三台节点,共同建立起pipeline管道
7、client开始往管道传输数据,数据以package(64kb)发送数据,当第一台接收到后,会将数据发送到第二台,第二台再把数据传输给第三台,每一次发送完成后,都会有一个应答队列
8、当每一个datanode接收到数据后,都给ack应答响应,告知已经接受完毕了
9、当第一块发送完成后,再次请求namenode,询问第二个block应该放置在哪些机器中,再次重复步骤操作,直至存储数据完成

13、在传输过程中,有三台机器接受数据,当接收机器过半后,就会认为存储成功,剩下的后面的机器没有接收完成,在namenode检查机制中会进行更新。

14、HDFS读取数据流程:

1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址;  这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后; 
3、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性); 
4、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕; 
5、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表; 
6、 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。 
7、 read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
8、 最终读取来所有的 block 会合并成一个完整的最终文件。

如果出现某一个datanode和client处在同一个服务器中,采用短路策略,直接读取本datanode,不会再起询问namenode

15、个人总结的读取数据

1、客户端发送请求到namenode,询问是否可以读取对应的文件
2、客户端接收到请求后,验证用户的权限和是否存在这个文件,如果不通过,直接抛出异常,验证成功,返回部分或者全部的block地址列表
3、客户端根据namenode给出的block地址,并发访问对应的地址,获取block数据
4、如果namenode返回的是部分列表,再次请求namenode,继续获取剩余的地址列表
5、最终获取所有的block文件块,拼接成一个完整的文件。

16、namenode:管理元数据信息,元数据信息是保存在内存中的,断电消失。 因此元数据信息必定会持久在磁盘中

17、冷备份保存的是某时刻之前的信息,热备份是实时保存备份

1、snn当达到一定的时机后(空间大小100万次、时间大小1h),会通知我们的namenode切换edits文件,把带有inprogress文件进行切换
2、snn将namenode中edits文件和fsimage文件拷贝到自己的目录下(防止丢失),以发送http请求的方式
3、将edits文件和fslmage文件加载到自己的内存中,执行合并操作。问题:如果snn的内存没有namenode内存大,合并将会失败,所以实际生产中,snn的内存一定不小于namenode的内存
4、合并后,就会产生一个新的fslmage文件,将新的fslmage文件发送给namenode
5、namenode用新的fslmage替换旧的fslmage文件------(以上是一个冷备份)

18、HDFS是一个主/从(Mater/Slave)体系结构, 由三部分组成: NameNode和DataNode以及SecondaryNamenode

1、NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息
2、DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本
3、Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信息

19、HDFS系统的操作:hdfs dfs -help 操作命令------主要记住ls(查看文件)、mkdir(创建文件夹)、put(将本地文件上传到hadoop系统中)、get(将hadoop中的文件下载到本地文件上)、mv(剪切,重命名)、cp(复制)、cat(查看文件内容)、tail(显示文件末尾部分)、chmod(修改权限421)、chown(改变文件的所属用户或所属组)、df(统计文件系统的可用空间信息)、du(统计文件夹的大小信息)、count(统计一个指定目录下的文件节点数量)

20、HDFS的高级命令

hdfs dfsadmin -setQuota 2  dir      # 给该文件夹下面设置最多上传两个文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/dir  # 清除文件数量限制
hdfs dfsadmin -setSpaceQuota 4k /user/root/dir   # 限制空间大小4KB

21、假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。 在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求]()。在,当整个系统达到安全标准时,HDFS自动离开安全模式。30s

22、块缓存:通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。提速!

23、Secondary NameNode的工作机制

 1) Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
 2) Secondary NameNode请求执行checkpoint。
 3) namenode滚动正在写的edits日志
 4) 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
 5) Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
 6) 生成新的镜像文件fsimage.chkpoint
 7) 拷贝fsimage.chkpoint到namenode
namenode将fsimage.chkpoint重新命名成fsimage

以上需要特别注意,fsmage.chkpoint是静止的,后面的更新是依据的编辑日志的更新,也就是edits的更新,所以,snn不需要再拿到镜像fsmage.chkpoint,用自己具有的和edits日志就可以合成新的了_(目前个人这样认为)

24、datanode的工作机制

1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。(dfs.blockreport.intervalMsec)
3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器

2.1)当DataNode读取block的时候,它会计算checksum
2.2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
2.3)client读取其他DataNode上的block.
2.4)datanode在其文件创建后周期验证checksum

后编写

1、hadoop这个软件框架,首要的基础功能就是它是一个文件系统,在hadoop中使用FileSystem这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪一种,需要看我们具体的实现类,在我们实际工作中,用到的最多的就是HDFS(分布式文件系统)以及LocalFileSystem(本地文件系统)了

2、namenode:存储文件元数据 , 存储在内存当中
datanode::存储文件数据 , 存储在本地磁盘中, 每一个文件都会有一个block.id

3、元数据保存在内存(快速)中,文件内容保存在磁盘中

4、在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为**分布式文件系统** 。HDFS分布式文件系统,我拿一部分,你拿一部分,最后凑成一个整体的过程

hdfs:分布式的文件系统
	在hadoop中, 支持很多种文件系统,只不过hdfs文件系统是实际开发中使用最多的问价系统
	FileSystem抽象类: 很多的实现类, 不同的实现类对应不同的文件系统
			localfileSystem:本地文件系统(指代linux的文件系统)
			distributeFileSystem:  分布式文件系统(hdfs)
			webhdfs :  支持浏览器方式对文件系统操作
			harFileSystem: 对小文件处理

hdfs的特性:
	1)主从的架构:master /slave
	2)分块存储数据:在hdfs每一块文件大小最多是 128M
	3)名称空间:每一个文件都有一个特定路径指定文件的位置,每一个文件,都会对应一份元数据信息(120字节~150字节)
	4)Namenode 元数据管理,Namenode 负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的block块信息(block 的id,及所在的datanode 服务器)。
	5)Datanode数据存储,文件的各个block的具体存储管理由datanode节点承担。每一个block都可以在多个datanode上。Datanode需要定时向Namenode汇报自己持有的block信息。存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
	6)副本机制:默认为3个,为了容错,文件的所有 block 都会有副本。
	7)一次写入,多次读取 
	不允许用户为文件进行修改操作,因为每一次修改,首先先修改namenode中元数据信息, 就会修改每一个副本中的数据

5、基础操作

help:
	格式 : hdfs dfs -help 操作命令
	作用 : 查看某一个操作命令的参数信息
ls:
	格式 :hdfs dfs -ls  URI
	作用 :类似于Linux的ls命令,显示文件列表
lsr:
	格式 : hdfs  dfs -lsr URI
	作用 : 在整个目录下递归执行ls, 与UNIX中的ls-R类似
mkdir:
	格式 : hdfs  dfs  -mkdir [-p] <paths>
	作用 :<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录
put:
	格式 :hdfs dfs -put <localsrc >  ... <dst>
	作用 :将单个的源文件src或者多个源文件srcs从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中
moveFromLocal:
	格式:hdfs  dfs -moveFromLocal  <localsrc>   <dst>
	作用: 和put命令类似,但是源文件localsrc拷贝之后自身被删除
copyFromLocal:
	格式: hdfs dfs -copyFromLocal <localsrc> ... <dst>
	作用: 从本地文件系统中拷贝文件到hdfs路径去
appendToFile:
	格式: hdfs dfs -appendToFile <localsrc> ... <dst>
	作用: 追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入.
get:
	格式:hdfs dfs  -get [-ignorecrc ]  [-crc]  <src> <localdst>
	作用:将文件拷贝到本地文件系统。 CRC 校验失败的文件通过-ignorecrc选项拷		贝。 文件和CRC校验可以通过-CRC选项拷贝
getmerge:
	格式: hdfs dfs -getmerge <src> <localdst>
	作用: 合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, 		log.2,log.3,...
copyToLocal:
	格式:  hdfs dfs -copyToLocal <src> ... <localdst>
	作用:  从hdfs拷贝到本地
mv:
	格式  : hdfs  dfs -mv URI   <dest>
	作用: 将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令		不能跨文件系统
rm:
	格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】
	作用:删除参数指定的文件,参数可以有多个。此命令只删除文件和非空目录。
	如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而	直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件	 暂时放到回收站中。
cp:
	格式: hdfs  dfs  -cp URI [URI ...] <dest>
	作用:将文件拷贝到目标路径中。如果<dest>  为目录的话,可以将多个文件拷贝	到该目录下。
	-f选项将覆盖目标,如果它已经存在。
	-p选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。
cat:
	格式:hdfs dfs  -cat  URI [uri  ...]
	作用:将参数所指示的文件内容输出到stdout
tail:
	格式: hdfs dfs -tail path
	作用: 显示一个文件的末尾
text:
	格式:hdfs dfs -text path
	作用: 以字符形式打印一个文件的内容
chmod:
	格式: hdfs   dfs  -chmod  [-R]  URI[URI  ...]
	作用:改变文件权限。如果使用  -R 选项,则对整个目录有效递归执行。使用这	  一命令的用户必须是文件的所属用户,或者超级用户。
chown:
	格式: hdfs   dfs  -chmod  [-R]  URI[URI  ...]
	作用:改变文件的所属用户和用户组。如果使用-R 选项,则对整个目录有效递归	 执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
df:
	格式: hdfs dfs  -df  -h  path
	作用: 统计文件系统的可用空间信息
du:
	格式: hdfs dfs -du -s -h path
	作用: 统计文件夹的大小信息
count:
	格式: hdfs dfs -count path
	作用: 统计一个指定目录下的文件节点数量
setrep:
	格式:  hdfs dfs -setrep num filePath
	作用: 设置hdfs中文件的副本数量
	注意: 即使设置的超过了datanode的数量,副本的数量也最多只能和datanode的数	 量是一致的
expunge :(不要用)
	格式:  hdfs dfs  -expunge
	作用: 清空hdfs垃圾桶 

6、高级命令:在多人共用HDFS的环境下,配置设置非常重要。特别是在Hadoop处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。Hdfs的配额设定是针对目录而不是针对账号,可以 让每个账号仅操作某一个目录,然后对目录设置配置。hdfs文件的限额配置允许我们以文件个数,或者文件大小来限制我们在某个目录下上传的文件数量或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量。

hdfs dfs -count -q -h /user/root/dir1  #查看配额信息
hdfs dfs  -mkdir -p /user/root/dir    #创建hdfs文件夹
hdfs dfsadmin -setQuota 2  dir      # 给该文件夹下面设置最多上传两个文件,但发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/dir  # 清除文件数量限制
hdfs dfsadmin -setSpaceQuota 4k /user/root/dir   # 限制空间大小4KB
dd if=/dev/zero of=1.txt  bs=1M count=2     #生成2M的文件
hdfs dfsadmin -clrSpaceQuota /user/root/dir  #清楚空间配额限制

7、HDFS的安全模式

安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。 在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求]()。在,当整个系统达到安全标准时,HDFS自动离开安全模式。30s

hdfs  dfsadmin  -safemode  get #查看安全模式状态
hdfs  dfsadmin  -safemode  enter #进入安全模式
hdfs  dfsadmin  -safemode  leave #离开安全模式

8、HDFS的block块默认128M大小,**块缓存:**通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。

9、每个元数据大小大概120个字节,也就是120byte,服务器一般128g内存,所有能存10亿个元数据大概。所以在datanode中存储数据的时候,合适于大文件的存储, 文件个数取决于namenode的内存大小不适合存储小文件数据

10、Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在 HDFS 上存放三份, 存储策略为本地一份, 同机架内其它某一节点上一份, 不同机架的某一节点上一份。

11、HDFS文件写入过程

  1. Client 发起文件上传请求, 通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件是否已存在, 父目录是否存在, 返回是否可以上传

  2. Client 请求第一个 block 该传输到哪些 DataNode 服务器上

  3. NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配, 返回可用的 DataNode 的地址如: A, B, CHadoop 在设计时考虑到数据的安全与高效, 数据文件默认在 HDFS 上存放三份, 存储策略为本地一份, 同机架内其它某一节点上一份, 不同机架的某一节点上一份。

  4. Client 请求 3 台 DataNode 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline ), A 收到请求会继续调用 B, 然后 B 调用 C, 将整个 pipeline 建立完成, 后逐级返回 client

  5. Client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存), 以 packet 为单位(默认64K), A 收到一个 packet 就会传给 B, B 传给 C. A 每传一个 packet 会放入一个应答队列等待应答

  6. 数据被分割成一个个 packet 数据包在 pipeline 上依次传输, 在 pipeline 反方向上, 逐个发送 ack(命令正确应答), 最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client7) 当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个 block 到服务

1) client客户端请求namenode, 执行写入的操作
2) namenode接收到客户端的请求后, 验证是否有权限以及文件是否已经存在
	如果没有权限, 或者文件已经存在, 直接抛异常
	如果ok. 通知client可以上传
3) 客户端开始对文件进行切分, 默认 128M, 
4) client再次请求namenode, 询问第一个block放置在那些机子当中
5) namenode根据 副本的数量和机架感知原理, 以及网络拓扑关系寻找更为合适的机器
	返回给客户端机器列表
6)client连接列表中第一台的节点,第一台节点连接第二台节点,第二台连接第三台节点
	建立pipeline管道
7) client开始往管道传输数据, 数据以 package(64kb)发送数据
	当第一台接收到, 将数据发送给第二台, 第二台接收到发送给第三台, 
	每一次发送完成以后,都会有一个应答队列
8) 当每一个datanode接收到数据后, 都给ack的应答响应, 告知已经接收完毕了
9)当第一块发送完成后, 再次请求namenode, 询问第二个block应该放置在那些机子中
	再次第5步依次类推, 直至将数据全部保存到datanode中

12、HDFS文件读取过程

  1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
  2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
  3. Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
  4. 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
  5. 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
  6. 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
  7. read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
  8. 最终读取来所有的 block 会合并成一个完整的最终文件
1) 客户端发送请求namenode, 询问是否可以读取对应的文件
2) namenode接收到请求后, 验证用户的权限和是否存在这个文件
	如果验证不通过, 直接抛异常	
	如果验证成功, 返回部分或者全部的block的地址列表
3) 客户端根据namenode给出的block地址, 并发的访问对应的地址, 获取block数据
4) 如果namenode返回的是一部分的列表,再次请求namenode,获取下一批的block地址列表
5) 最终将所有block的文件块拼接在一起, 形成一个完整的文件
如果datanode和client在同一个服务器中,则不经过namenode,直接短路读取!!

13、namenode工作机制

1) 第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2) 客户端对元数据进行增删改的请求
3) namenode记录操作日志,更新滚动日志。
4) namenode在内存中对数据进行增删改查

14、Secondary NameNode工作机制

1) Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
2) Secondary NameNode请求执行checkpoint。
3) namenode滚动正在写的edits日志
4) 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
5) Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
6) 生成新的镜像文件fsimage.chkpoint
7) 拷贝fsimage.chkpoint到namenode
8)namenode将fsimage.chkpoint重新命名成fsimage

15、所有的元数据信息都保存在了FsImage与Eidts文件当中,这两个文件就记录了所有的数据的元数据信息。客户端对hdfs进行写文件时会首先被记录在edits文件中。edits修改时元数据也会更新。每次hdfs更新时edits先更新后客户端才会看到最新信息。fsimage:是namenode中关于元数据的镜像,一般称为检查点。

​ 一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?------因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。

​ secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上。fsimage与edits的合并时机取决于两个参数,第一个参数是默认1小时fsimage与edits合并一次。第二个参数是HDFS操作达到100万次(需要获取hdfs操作的次数_),也会进行合并。

dfs.namenode.checkpoint.period 3600	# 时间达到一个小时fsimage与edits就会进行合并
dfs.namenode.checkpoint.txns  1000000 #	hdfs操作达到1000000次也会进行合并
dfs.namenode.checkpoint.check.period 60 #	每隔多长时间检查一次hdfs的操作次数

16、datanode的工作机制

1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。(dfs.blockreport.intervalMsec)
3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器
数据完整性:
1)当DataNode读取block的时候,它会计算checksum
2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
3)client读取其他DataNode上的block.
4)datanode在其文件创建后周期验证checksum

17、和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。

18、冷备份:保存之前的数据 热备份:实时保存数据

datanode:
	如果某一个datanode宕机, 导致副本的数量不足, namenode检测到某一个datanode宕机, 将datanode中数据重新拷贝一份出来交给新的机器存储
	如果宕机后, 再次恢复后, namenode会不会认为永远死去了呢?不会的一旦恢复后, 副本数量多于 设置的副本数量, namenode会进行删除

datanode数据存储的路径:
	datanode的文件路径也是可以配置多个的, 如果配置多个, 相当于给hdfs进行扩容, 备份取决于 副本的设置
	一个服务器是可以挂载多个磁盘的, 每一个磁盘都有自己的挂载路径:df -lh 在生产环境下配置的时候,这个value值有可能会配置多个, 每一个目录代表的是一个磁盘
	这种方式, 相当于在一个服务器中对hdfs进行扩容, 这个扩容是有上限的,一般启动之前都设置完成了
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas,/shar/1,/shar/2</value>
	</property>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值