文章目录
一、Hadoop篇_HDFS
(一)学习指引
1. 掌握HDFS组织架构及其作用
2. 掌握HDFS读写流程,及读写异常时HDFS的操作
3. 掌握HDFS常见命令
(二)内容介绍
1、HDFS的组织架构及作用
HDFS主要由四个部分组成,分别为Client,nameNode、DataNode、以及Secondary NameNode组成。
1.1 namenode
1.1.1 作用
- 管理HDFS的名称空间(Namespace管理):负责管理文件系统中的树状目录结构以及文件与数据块的映射关系
- 管理数据块信息:负责管理文件系统中文件的物理块与实际存储位置的映射关系BlockMap
- 集中式缓存管理:从Hadoop2.3开始,支持datanode将文件缓存到内存中,这部分缓存通过NN集中管理
- 配置副本策略
- 处理客户端请求
1.1.2 存储结构
- 内存:Namespace数据,BlockMap数据,其它信息
- 文件:
1)已持久化的namespace数据:FsImage
2)持久化的namespace操作:Edits
1.2 Client(客户端)
- 文件切分:文件上传HDFS的时候,client根据需求将文件切分成一个一个的小数据块(block),然后进行存储。
- 每个小数据块(block)在其他服务器上都有副本,client会与namenode进行通信,获取文件及其副本位置,为以后做打算。
- 与DataNode进行通信,读取或写入数据。
- client可以管理HDFS,比如启动或关闭。
1.3 DataNode(执行者)
DataNode主要就是存储数据块和读写数据块用的:
- 实际存储的数据块(block)
- 执行数据块的读写操作
1.4 secondary nameNode
主要作用如下:
- 定期合并nameNode中的fsimage(映像文件)和fsedits(日志),并推送给nameNode,避免nameNode中的fsedits过大。
- 在紧急情况下,可辅助恢复nameNode。
2、HDFS写流程以及常见问题
2.1 HDFS写流程
-
client客户端发送上传请求,通过RPC与namenode建立通信,namenode检查该用户是否有上传权限,以及上传的文件是否在hdfs对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息
-
client根据文件的大小进行切分,默认128M一块,切分完成之后给namenode发送请求第一个block块上传到哪些服务器上
-
namenode收到请求之后,根据网络拓扑和机架感知以及副本机制进行文件分配,返回可用的DataNode的地址
注:Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在 HDFS 上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份, 不同机架的某一节点上一份
-
客户端收到地址之后与服务器地址列表中的一个节点如A进行通信,本质上就是RPC调用,建立pipeline,A收到请求后会继续调用B,B在调用C,将整个pipeline建立完成,逐级返回client
-
client开始向A上发送第一个block(先从磁盘读取数据然后放到本地内存缓存),以packet(数据包,64kb)为单位,A收到一个packet就会发送给B,然后B发送给C,A每传完一个packet就会放入一个应答队列等待应答
-
数据被分割成一个个的packet数据包在pipeline上依次传输,在pipeline反向传输中,逐个发送ack(命令正确应答),最终由pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client
-
当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个 block ,namenode重新选择三台DataNode给client
2.2 HDFS写流程常见问题及解决方式
1、如果在写数据过程中,如果其中一个 DataNode 突然挂掉了怎么办
- 客户端上传文件时与DataNode建立pipeline管道,管道正向是客户端向DataNode 发送的数据包,管道反向是 DataNode 向客户端发送 ack 确认,也就是正确接收到数据包之后发送一个已确认接收到的应答。
- 当 DataNode 突然挂掉了,客户端 接收不到这个 DataNode 发送的 ack 确认 ,客户端会通知 NameNode,NameNode 检查该块的副本与规定的不符, NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不 再让它参与文件上传与下载。
3、HDFS读流程以及常见问题
3.1 HDFS读流程
-
client向namenode发送RPC请求。请求文件block的位置
-
namenode收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后
-
Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)
-
底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕
-
当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表
-
读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读
-
read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据
-
最终读取来所有的 block 会合并成一个完整的最终文件
3.2 HDFS读流程常见问题及解决方式
1、HDFS 在读取文件的时候,如果其中一个块突然损坏了怎么办
客户端读取完 DataNode 上的块之后会进行 checksum 验证,也就是把客户端读 取到本地的块与 HDFS 上的原始块进行校验,如果发现校验结果不一致,客户端 会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读取。
4、HDFS中的配置及常见问题
1、副本放置策略
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
2、文件与数据块
块的大小在创建文件的时候可以指定,不指定则使用系统默认的设置(在hadoop2里面是128M)
一个文件有多少个块:取决于文件的大小与块的大小
920M的文件,块的大小为100M,则总共块的个数为10,前9个块占用的空间为100M,最后一个块占用的空间:20M。
5、HDFS中的shell命令
序号 | 命令 | 含义 | 备注 |
---|---|---|---|
1 | hadoop fs -mkdir /sanguo | 在根目录下创建sanguo文件路径 | |
2 | hadoop fs -helo rm | 查找rm 命令的使用用法 | 把本地文件上传到HDFS |
3 | hadoop fs -moveFromLocal 路径1 路径2 | 从本地剪切粘贴到HDFS | |
4 | hadoop fs -copyFromLocal 路径1 路径2 | 从本地文件系统中拷贝文件到HDFS路径中 | 从本地文件上传到HDFS |
5 | hadoop fs -put 路径1 路径2 | 从本地文件系统中拷贝文件到HDFS路径中 | 生产环境中更习惯用put |
6 | hadoop fs -appendToFile 路径1文件 路径2文件 | 追加一个文件到已经存在的文件末尾 | |
7 | hadoop fs -copyToLocal 路径1文件 路径2文件 | 从HDFS拷贝到本地 | 下载 |
8 | hadoop fs -get 路径1文件 路径2文件 | 从HDFS拷贝到本地 | 生产环境更习惯用get |
9 | hadoop fs -ls 文件夹 | 显示文件信息 | |
10 | hadoop fs -cat 文件 | 显示文件内容 | |
11 | hadoop fs -chmod/-chown/-chgrp 数字权限 文件 | 修改文件所属权限 | |
12 | hadoop fs -cp | 从HDFS的一个路径拷贝到HDFS文件的另一个路径 | |
13 | hadoop fs -mv 路径1 路径2 | 在HDFS目录中移动文件 | |
14 | hadoop fs -tail 文件 | 显示一个文件末尾1kb的数据 | |
15 | hadoop fs -rm 文件/文件夹 | 删除文件或文件夹 | |
16 | hadoop fs -rm -r 文件/文件夹 | 递归删除目录以及目录里的内容 | |
17 | hadoop fs -du -h -s 文件/文件夹 | 统计文件夹的大小信息 | 第1个数字表示文件大小,第2个数字=第1个数字*副本数 |
18 | hadoop fs -setrep 文件/文件夹 | 设置HDFS中文件的副本数量 | 看DataNode数量以及设备数,3台设备,副本数最多是3 |