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
|