欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDFS详解

程序员文章站 2024-03-22 13:48:04
...

1.三个进程

NameNode (NN): 名称节点 –》client第一个操作的对象
DataNode (DN): 数据节点 –》存储数据的
Secondary NameNode(SNN): 第二名称节点

2.block(数据块)

大小:
64M
128M

参数: dfs.blocksize

3.副本数

dfs.replication : 3
一个块会变为3个块

hadoop2.x一般公司就3个
hadoop3.0 : 1.5(新特性 纠删码) 1+0.5

4.案例

1个文件130M : 128M 2M 两个块
实际存储: 130M*3
多少个块: 6

1桶水130ml, 两个瓶子(128ml规格),第一个装满了128,第二个瓶子只装2ml,实际存储了多少的水?130ml

悬念(面试题):
多出2M,占一个数据块,会有问题?
答案:会维护在NN的内存,会可能oom

    比如文件都是小文件,3M、5M ?
合并小文件/设计的时候,尽量让一个文件是120--128M

5.架构设计

NameNode: 文件系统的命名空间 (面试题)
1.文件名称
2.文件目录结构
3.文件的属性(权限 创建时间 副本数)

4.文件对应哪些数据块–》这些数据块对应哪些DataNode节点上
不会持久化存储这个映射关系,是通过集群的启动和运行时,datanode定期发送blockReport给NN,
以此NN在【内存】中动态维护这种映射关系。

      存储:维护文件系统树及整个树内的所有文件和目录,这些信息以两种文件形式永久保存在本地磁盘上
       命名空间镜像文件fsimage+编辑日志editlog(hadoop.tmp.dir指定的目录中)

DataNode:
存储: 数据块+数据块校验和
与NN通信:
1.每隔3秒发送一次心跳 参数可配置
2.每隔10次心跳发送一次blockReport (30s)

Secondary NameNode:
存储: 命名空间镜像文件fsimage+编辑日志editlog
作用: 定期合并fsimage+editlog文件为新的fsimage,推送给NN,称为检查点,checkpoint
参数: dfs.namenode.checkpoint.period: 3600 秒

实验: NN挂了,SNN去恢复(企业不用)
http://hmilyzhangl.iteye.com/blog/1407214

6.副本放置策略

在机架中,如果是DN上传的文件,会在本地放置一个,然后再在另外的放置两个。如果不是DataNode上传的,那么会选一个最快最好的放第一个。

7、读流程 FSDataInputStream

HDFS详解

1、client通过FileSystem.open(filePath)方法,去NN进行RPC通信,返回该文件的部分或者全部的block块,也就是返回FSDataInputStream对象;
2、获取block地址列表,去datanode相应地址读取。
3、第一个副本坏了,就读第二个,直到读取成功或副本全部损坏失败。

8、写流程 FSDataOutputStream

HDFS详解
1、客户端传给DFS文件系统将要写入的文件的路径
2、去NN校验路径是否存在,文件是否存在,权限等等。NN返回FSDataOutputStream对象
3、此时NN创建一个文件名,但是不包含block块、副本数等信息。
4、调用写入方法,write packet,优先写入本地(如果本地有DN的话),然后写入不同网段的DN中,再写入不同网段不同ip的主机中。
5、三个副本写完后依次报告给前一个,返回的是ack packet,然后由第一个返回给FSDataOutputStream对象
6、调用FSDataOutputStream的close方法,再flush刷新缓存。然后调用DFS的一个方法complete告诉NN写入完成(否则需要30s心跳后NN才知道)。

9.命令jps(查看进程)

[aaa@qq.com hsperfdata_hadoop]$ jps -l
3462 org.apache.hadoop.hdfs.server.namenode.NameNode
3558 org.apache.hadoop.hdfs.server.datanode.DataNode
4923 sun.tools.jps.Jps
3691 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
[aaa@qq.com hsperfdata_hadoop]$ 

[aaa@qq.com ~]$ jps 
54450 Jps
10611 NodeManager
5720 NameNode
6030 SecondaryNameNode
5823 DataNode
10511 ResourceManager
[aaa@qq.com ~]$ 
[aaa@qq.com ~]$ which jps
/usr/java/jdk1.8.0_45/bin/jps
[aaa@qq.com ~]$ 


[aaa@qq.com ~]# cd /tmp/hsperfdata_hadoop/
[aaa@qq.com hsperfdata_hadoop]# ll
total 160
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:11 10511
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:11 10611
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:11 5720
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:11 5823
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:11 6030

9.1 正常流程 (出现这种情况,首先看进程的所属用户,ps -ef查看,然后切到所属用户再查看。如果用户正确,出现了这种情况,ps-ef查看 进程是否存在,然后再进行删除动作。)

[aaa@qq.com hsperfdata_hadoop]# jps
10611 -- process information unavailable
6325 jar
54487 Jps
5720 -- process information unavailable
6030 -- process information unavailable
5823 -- process information unavailable
10511 -- process information unavailable
[aaa@qq.com hsperfdata_hadoop]# ps -ef |greo 10611
找到该进程的使用用户名称

[aaa@qq.com hsperfdata_hadoop]# su - hadoop
[aaa@qq.com ~]$ jps
10611 NodeManager
5720 NameNode
54524 Jps
6030 SecondaryNameNode
5823 DataNode
10511 ResourceManager
[aaa@qq.com ~]$ 

9.2 异常流程

[aaa@qq.com rundeck]# jps
10611 -- process information unavailable
6325 jar
5720 -- process information unavailable
6030 -- process information unavailable
54591 Jps
5823 -- process information unavailable
10511 -- process information unavailable
[aaa@qq.com rundeck]# 
[aaa@qq.com rundeck]# kill  -9 10611

[aaa@qq.com rundeck]# jps
10611 -- process information unavailable
6325 jar
5720 -- process information unavailable
54605 Jps
6030 -- process information unavailable
5823 -- process information unavailable
10511 -- process information unavailable
[aaa@qq.com rundeck]# ps -ef|grep 10611
root     54618 48324  0 10:15 pts/1    00:00:00 grep 10611
[aaa@qq.com rundeck]# 
10611信息残留,去/tmp/hsperfdata_hadoop文件夹删除该10611文件

[aaa@qq.com hsperfdata_hadoop]# ll
total 160
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:17 10511
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:15 10611
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:17 5720
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:17 5823
-rw-------. 1 hadoop hadoop 32768 Dec 17 10:16 6030
[aaa@qq.com hsperfdata_hadoop]# rm -f 10611
[aaa@qq.com hsperfdata_hadoop]# 
[aaa@qq.com hsperfdata_hadoop]# jps
54626 Jps
6325 jar
5720 -- process information unavailable
6030 -- process information unavailable
5823 -- process information unavailable
10511 -- process information unavailable
[aaa@qq.com hsperfdata_hadoop]# su - hadoop
[aaa@qq.com ~]$ jps
54661 Jps
5720 NameNode
6030 SecondaryNameNode
5823 DataNode
10511 ResourceManager
[aaa@qq.com ~]$ 

10.hadoop和hdfs 文件系统命令

hadoop fs
等价与
hdfs dfs (查看bin/hadoop和bin/hdfs文件里的fs和dfs调用的class类就能发现是同一个类)

[aaa@qq.com hadoop]$ bin/hdfs dfs -ls /
[aaa@qq.com hadoop]$ bin/hdfs dfs -mkdir -p /rzdatadir001/001
[aaa@qq.com hadoop]$ bin/hdfs dfs -cat /test.log

[aaa@qq.com hadoop]$ bin/hdfs dfs -put rzdata.log1 /rzdatadir001/001
[aaa@qq.com hadoop]$ bin/hdfs dfs -get /rzdatadir001/001/rzdata.log1 /tmp/    
[aaa@qq.com hadoop]$ bin/hdfs dfs -get /rzdatadir001/001/rzdata.log1 /tmp/rzdata.log123   重命名

上传:[-moveFromLocal <localsrc> ... <dst>]
下载:[-moveToLocal <src> <localdst>]

删除:
1.配置回收站

[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]

在core-site.xml下添加:
fs.trash.interval : 10080(七天)

2.测试
bin/hdfs dfs -rm -r -f /xxxx —》进入回收站,是可以恢复的
bin/hdfs dfs -rm -r -f -skipTrash /xxxx —》不进入回收站,是不可以恢复的
被删除的文件默认放到hdfs系统里面/user/hadoop/.Trash/Current下面(删除的时候会提示),想要恢复直接移动即可。

[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-du [-s] [-h] [-x] <path> ...]

11.机器磁盘数据分布问题

1.多台机器的磁盘存储分布不均匀?

解决方案: 1.1 不加新机器,原机器的磁盘分布不均匀:

   [aaa@qq.com ~]$ hdfs dfsadmin -setBalancerBandwidth  52428800
   Balancer bandwidth is set to 52428800
    带宽设大点,快速迁移

   [aaa@qq.com sbin]$ ./start-balancer.sh  
   等价于
   [aaa@qq.com sbin]$ hdfs balancer 

   Apache Hadoop集群环境:  shell脚本每晚业务低谷时调度
   CDH集群环境: 忽略
   可以参考:
   http://blog.itpub.net/30089851/viewspace-2052138/
2.加新机器,原机器的磁盘比如450G(500G),现在的新机器磁盘规格是5T
在业务低谷时,先将多台新机器加入到HDFS,做DN;
然后选一台的DN下架掉,等待hdfs自我修复块,恢复3份(网络和io最高的,也是最有风险性的)
3.一台机器的多个磁盘分布不均匀?

3.1.无论加不加磁盘,且多块磁盘的分布不均匀
可以参考官网:https://hadoop.apache.org/docs/r3.0.0-alpha2/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html
使用这两个命令:
hdfs diskbalancer -plan node1.mycluster.com
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json

Apache Hadoop3.x   版本或者  CDH5.12+ 才有

根据若泽数据课堂笔记改编。