HDFS详解

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

这里写图片描述

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

8、写流程 FSDataOutputStream

这里写图片描述
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(查看进程)

[hadoop@hadoop003 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
[hadoop@hadoop003 hsperfdata_hadoop]$ 

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


[root@rzdatahadoop002 ~]# cd /tmp/hsperfdata_hadoop/
[root@rzdatahadoop002 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查看 进程是否存在,然后再进行删除动作。)

[root@rzdatahadoop002 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
[root@rzdatahadoop002 hsperfdata_hadoop]# ps -ef |greo 10611
找到该进程的使用用户名称

[root@rzdatahadoop002 hsperfdata_hadoop]# su - hadoop
[hadoop@rzdatahadoop002 ~]$ jps
10611 NodeManager
5720 NameNode
54524 Jps
6030 SecondaryNameNode
5823 DataNode
10511 ResourceManager
[hadoop@rzdatahadoop002 ~]$ 

9.2 异常流程

[root@rzdatahadoop002 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
[root@rzdatahadoop002 rundeck]# 
[root@rzdatahadoop002 rundeck]# kill  -9 10611

[root@rzdatahadoop002 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
[root@rzdatahadoop002 rundeck]# ps -ef|grep 10611
root     54618 48324  0 10:15 pts/1    00:00:00 grep 10611
[root@rzdatahadoop002 rundeck]# 
10611信息残留,去/tmp/hsperfdata_hadoop文件夹删除该10611文件

[root@rzdatahadoop002 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
[root@rzdatahadoop002 hsperfdata_hadoop]# rm -f 10611
[root@rzdatahadoop002 hsperfdata_hadoop]# 
[root@rzdatahadoop002 hsperfdata_hadoop]# jps
54626 Jps
6325 jar
5720 -- process information unavailable
6030 -- process information unavailable
5823 -- process information unavailable
10511 -- process information unavailable
[root@rzdatahadoop002 hsperfdata_hadoop]# su - hadoop
[hadoop@rzdatahadoop002 ~]$ jps
54661 Jps
5720 NameNode
6030 SecondaryNameNode
5823 DataNode
10511 ResourceManager
[hadoop@rzdatahadoop002 ~]$ 

10.hadoop和hdfs 文件系统命令

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

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

[hadoop@rzdatahadoop002 hadoop]$ bin/hdfs dfs -put rzdata.log1 /rzdatadir001/001
[hadoop@rzdatahadoop002 hadoop]$ bin/hdfs dfs -get /rzdatadir001/001/rzdata.log1 /tmp/    
[hadoop@rzdatahadoop002 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 不加新机器,原机器的磁盘分布不均匀:

   [hadoop@rzdatahadoop002 ~]$ hdfs dfsadmin -setBalancerBandwidth  52428800
   Balancer bandwidth is set to 52428800
	带宽设大点,快速迁移
   
   [hadoop@rzdatahadoop002 sbin]$ ./start-balancer.sh  
   等价于
   [hadoop@rzdatahadoop002 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+ 才有
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值