Hadoop 架构、小文件、Block块

Posted by Jackson on 2017-08-18

block块、 副本数 、小文件、hdfs架构、NN、SNN

1.block块

在hdfs-site.xml查看查看:https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

dfs.blocksize 134217728 128M block块大小默认128M
dfs.replication 3 副本数默认是3

一个文件160M,HDFS blocksize大小是128M,副本数是3
实际存储的块的个数是6
实际存储的空间是160*3 = 480M

即使文件未满128M,也可能是占用1个block文件

2.hdfs小文件

HDFS不适合小文件存储,过多的小文件会大量占用NN的存空间
如果产生小文件应该怎么做呢?
可以启动一个线程单独合并小文件,写shell脚本,对于低于10M(假设)的小文件进行合并,合并的时候注意将不同业务之间的文件进行区分,不要混乱

3.HDFS架构

3.1 Namenode: 主节点

存储: 文件系统的命名空间

  • a.文件的名称
  • b.文件的目录结构
  • c.文件的属性 权限 创建时间 副本数
  • d.文件对应被切割为哪些数据块+副本数–》数据块分布在哪些DN节点上
  • e.NameNode节点不会持久化存储这种映射关系,而是通过集群启动和运行时候,DataNode会定期发送blockreport给NameNode,在NameNode内存中动态维护这种映射关系。

需要注意的是:一个DataNode 节点上面不可能存储同一个block块的多个副本。

操作:测试上传文件,查看block的大小情况,上传一个文件414M

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[hadoop@bigdata01 dfs]$ hadoop fs -ls -h /
19/12/03 22:11:40 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
-rw-r--r-- 1 hadoop supergroup 414.2 M 2019-12-03 22:09 /hadoop-2.6.0-cdh5.16.2.tar.gz
drwxr-xr-x - hadoop supergroup 0 2019-12-02 12:36 /hadooptest
drwx------ - hadoop supergroup 0 2019-12-02 21:46 /tmp
drwxr-xr-x - hadoop supergroup 0 2019-12-02 21:46 /wordcount
[hadoop@bigdata01 dfs]$


[hadoop@bigdata01 subdir0]$ pwd
/tmp/hadoop-hadoop/dfs/data/current/BP-196862025-192.168.52.50-1575212732331/current/finalized/subdir0/subdir0

[hadoop@bigdata01 subdir0]$ ll
total 427720
-rw-rw-r-- 1 hadoop hadoop 42 Dec 2 12:36 blk_1073741825
-rw-rw-r-- 1 hadoop hadoop 11 Dec 2 12:36 blk_1073741825_1001.meta
-rw-rw-r-- 1 hadoop hadoop 98 Dec 2 21:45 blk_1073741826
-rw-rw-r-- 1 hadoop hadoop 11 Dec 2 21:45 blk_1073741826_1002.meta
-rw-rw-r-- 1 hadoop hadoop 62 Dec 2 21:47 blk_1073741834
-rw-rw-r-- 1 hadoop hadoop 11 Dec 2 21:47 blk_1073741834_1010.meta
-rw-rw-r-- 1 hadoop hadoop 349 Dec 2 21:47 blk_1073741835
-rw-rw-r-- 1 hadoop hadoop 11 Dec 2 21:47 blk_1073741835_1011.meta
-rw-rw-r-- 1 hadoop hadoop 33573 Dec 2 21:47 blk_1073741836
-rw-rw-r-- 1 hadoop hadoop 271 Dec 2 21:47 blk_1073741836_1012.meta
-rw-rw-r-- 1 hadoop hadoop 141096 Dec 2 21:47 blk_1073741837
-rw-rw-r-- 1 hadoop hadoop 1111 Dec 2 21:47 blk_1073741837_1013.meta
-rw-rw-r-- 1 hadoop hadoop 134217728 Dec 3 22:09 blk_1073741838
-rw-rw-r-- 1 hadoop hadoop 1048583 Dec 3 22:09 blk_1073741838_1014.meta
-rw-rw-r-- 1 hadoop hadoop 134217728 Dec 3 22:09 blk_1073741839
-rw-rw-r-- 1 hadoop hadoop 1048583 Dec 3 22:09 blk_1073741839_1015.meta
-rw-rw-r-- 1 hadoop hadoop 134217728 Dec 3 22:09 blk_1073741840
-rw-rw-r-- 1 hadoop hadoop 1048583 Dec 3 22:09 blk_1073741840_1016.meta
-rw-rw-r-- 1 hadoop hadoop 31701278 Dec 3 22:09 blk_1073741841
-rw-rw-r-- 1 hadoop hadoop 247675 Dec 3 22:09 blk_1073741841_1017.meta

这里查看到的是22:09点上传的文件一共是4个,这里设置的副本数是1 剩下的4个.meta 文件是校验文件
415M文件 被切分成3个128M的文件和一个31M的文件一共四个文件

查看的目录是/tmp/hadoop-用户/dfs/data/…

NameNode 的作用

管理文件系统的命名空间。维护文件系统树的所有文件和文件夹。
这些信息以两个文件形式永久的保存在本地磁盘上:镜像文件fsimage 编辑日志文件editlog

3.2 DataNode

存储:数据块和数据块校验和

通信:
a.通过心跳机制每3秒发送心跳包给NameNode dfs.heartbeat.interval 3 ===> hdfs-site.xml 文件中

b.每隔一定的时间发生一次 blockreport 块报告
dfs.blockreport.intervalMsec 21600000ms=6h 块报告
dfs.datanode.directoryscan.interval 21600s=6h 目录扫描

1
2
3
4
5
6
7
8
9
10
[hadoop@bigdata01 subdir0]$ hdfs debug 
Usage: hdfs debug <command> [arguments]

These commands are for advanced users only.

Incorrect usages may result in data loss. Use at your own risk.

verifyMeta -meta <metadata-file> [-block <block-file>] ===>校验meta信息
computeMeta -block <block-file> -out <output-metadata-file> ===>计算校验信息
recoverLease -path <path> [-retries <num-retries>] ===>修复
1
2
手动修复: 多副本
[ruoze@ruozedata001 current]$ hdfs debug recoverLease -path xxx -retries 10

4.SNN

存储: fsimage+editlog
作用: 定期合并 fsimage+editlog文件作为新的fsimage,推送给NameNode,替换NameNode的fsimage
简称为checkpoint 检查点

dfs.namenode.checkpoint.period 3600s 1h
dfs.namenode.checkpoint.txns 1000000 操作100次

这里是为了解决NameNode的单点故障问题,所以加入了一个SecondaryNameNode的角色,1h的备份机制,虽然能够减轻单点故障,但是还会有风险。

5.镜像文件校验

NameNode:

1
2
3
4
5
6
7
8
[hadoop@bigdata01 current]$ ll
hadoop 1048576 Dec 3 22:36 edits_inprogress_0000000000000000139
hadoop 1757 Dec 3 22:08 fsimage_0000000000000000121
hadoop 62 Dec 3 22:08 fsimage_0000000000000000121.md5
hadoop 1898 Dec 3 22:36 fsimage_0000000000000000138
hadoop 62 Dec 3 22:36 fsimage_0000000000000000138.md5
hadoop 4 Dec 3 22:36 seen_txid
-rw-rw-r-- 1 hadoop hadoop 205 Dec 3 22:08 VERSION

SecondaryNameNode:

1
2
3
4
5
6
7
8
9
hadoop      42 Dec  2 10:15 edits_0000000000000000002-0000000000000000003
hadoop 1048576 Dec 2 22:18 edits_0000000000000000014-0000000000000000118
hadoop 42 Dec 2 22:18 edits_0000000000000000119-0000000000000000120
hadoop 1141 Dec 3 22:36 edits_0000000000000000122-0000000000000000138
hadoop 1757 Dec 3 22:36 fsimage_0000000000000000121
hadoop 62 Dec 3 22:36 fsimage_0000000000000000121.md5
hadoop 1898 Dec 3 22:36 fsimage_0000000000000000138
hadoop 62 Dec 3 22:36 fsimage_0000000000000000138.md5
hadoop 205 Dec 3 22:36 VERSION

NameNode的 fsimage_0000000000000000138 = SecondaryNameNode的fsimage_0000000000000000121 + edits_0000000000000000122-0000000000000000138

SecondaryNameNode辅助管理元数据信息的流程:

  • a.NameNode滚动editlog
  • b.SecondaryNameNode从NameNode拉取fsimage和edits文件
  • c.SecondaryNameNode合并fsimage和edits文件===>生成新的fsimage
  • d.将生成的fsimage.ckpt 传输给NameNode

6.md5校验:

1
2
[hadoop@bigdata01 current]$ which md5sum 
/bin/md5sum

手动使用md5校验fsimage_0000000000000000121 文件生成校验结果对比fsimage_0000000000000000121结果查看是否相同,保证文件不会损坏

1
2
3
4
5
[hadoop@bigdata01 current]$ /bin/md5sum fsimage_0000000000000000121
087408590b49c9c4835b46015280f8b1 fsimage_0000000000000000121
[hadoop@bigdata01 current]$ cat fsimage_0000000000000000121.md5
087408590b49c9c4835b46015280f8b1 *fsimage_0000000000000000121
[hadoop@bigdata01 current]$

7.改变HDFS存储目录

1
2
3
4
5
6
7
[hadoop@bigdata01 subdir0]$chmod -R 777 /home/hadoop/tmp
[hadoop@bigdata01 subdir0]$ mv /tmp/hadoop-hadoop/dfs/ /home/hadoop/tmp/
[hadoop@bigdata01 subdir0]$ vim core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>

重启hdfs,重新上传文件测试,进入目录可以看到新上传的文件在我们配置的目录下面

1
2
3
4
5
6
7
8
9
10
11
[hadoop@bigdata01 subdir0]$ pwd
/home/hadoop/tmp/dfs/data/current/BP-196862025-192.168.52.50-1575212732331/current/finalized/subdir0/subdir0
[hadoop@bigdata01 subdir0]$ ll
-rw-rw-r-- 1 hadoop hadoop 134217728 Dec 3 22:09 blk_1073741839
-rw-rw-r-- 1 hadoop hadoop 1048583 Dec 3 22:09 blk_1073741839_1015.meta
-rw-rw-r-- 1 hadoop hadoop 134217728 Dec 3 22:09 blk_1073741840
-rw-rw-r-- 1 hadoop hadoop 1048583 Dec 3 22:09 blk_1073741840_1016.meta
-rw-rw-r-- 1 hadoop hadoop 31701278 Dec 3 22:09 blk_1073741841
-rw-rw-r-- 1 hadoop hadoop 247675 Dec 3 22:09 blk_1073741841_1017.meta
-rw-rw-r-- 1 hadoop hadoop 80965035 Dec 4 11:19 blk_1073741842
-rw-rw-r-- 1 hadoop hadoop 632547 Dec 4 11:19 blk_1073741842_1018.meta