1.1 HDFS存储机制
HDFS是Hadoop分布式计算中的数据存储系统。在HDFS中,文件的读写过程就是client和NameNode以及DataNode一起交互的过程。NameNode管理着文件系统的元数据,DataNode存储的是实际的数据,那么client就会联系NameNode以获取文件的元数据,而真正的文件读取操作是直接和DataNode进行交互的。所以存储过程大致如下:
Client要向集群中写入数据,首先询问NameNode,NameNode告知客户端向哪DataNode写入数据,在往DataNode写入数据的同时,DataNode与NameNode保持心跳,如果DataNode在执行任务失败,NameNode会通过心跳机制得知DataNode死掉,将重新分配新的任务到其他的DataNode,架构图如下图所示。
HDFS的副本放置车策略遵循以下几点(最优副本数为3):
1) 第一副本:放置在上传文件DataNode,如果是集群外提交,由NameNode选择一台磁盘不太满,cpu不太忙的节点。
2) 第二副本:放置在于第一副本不同的机架的节点上。
3)第三副本:与第二个副本相同集群的节点。
4)其他副本则随机选取节点。
1.2 测试数据
测试环境:linux 3.10.0-229.el7.x86_64
网络带宽:实测35MB/S-40MB/S
机器内存:32GB
硬盘空间:1T
硬盘IO:实测300MB/S
HADOOP版本:2.6
JDK版本:1.8
以下所有测试客户端和集群节点都不在同一台机器上,单个测试文件大小为100M。
伪分布式测试结果:
集群节点数(个) | 副本数(个) | 客户端数量(个) | 平均速度(MB/S) | 吞吐量(MB/S) |
1 | 1 | 1 | 31 | 31 |
1 | 1 | 2 | 18 | 36 |
1 | 1 | 3 | 13 | 39 |
1 | 3 | 1 | 31 | 31 |
1 | 3 | 2 | 18 | 36 |
初步分析结论:上传速度受客户端数量影响,不受副本数影响,并行客户端越多,单个写入速度越慢,集群吞吐量有小幅度提升,不超过网络带宽。
五节点集群(1个NameNode,4个DataNode):
集群节点数(个) | 副本数(个) | 客户端数量(个) | 平均速度(MB/S) | 吞吐量(MB/S) |
5 | 1 | 1 | 31 | 31 |
5 | 1 | 2 | 30 | 60 |
5 | 1 | 3 | 30 | 90 |
5 | 1 | 4 | 30 | 120 |
5 | 1 | 5 | 22 | 110 |
5 | 3 | 1 | 31 | 31 |
5 | 3 | 2 | 17 | 34 |
5 | 3 | 3 | 12 | 36 |
5 | 3 | 4 | 10 | 40 |
初步分析结论:上传速度受副本数和客户端数量影响。在副本数为1的情况下,客户端数量越多,吞吐量越高,当客户端数量达到DataNode节点数量的时候吞吐量几乎不变;在副本数为3的时候,客户端数量越高,平均速度越低,但是集群吞吐量有小幅度提升,但不超过带宽。
1.3测试总结
在16节点的hadoop集群环境下,网络为万兆网,假设1个NameNode节点,15个DataNode,那么理论上集群的总吞吐量为15GB/S(即吞吐量可随节点数增加而线性增长),但是由于IO性能的限制,每台机器(按照固态硬盘)的最大吞吐量也就250MB/S左右,那么集群最大吞吐量为3.5GB/S左右(不跑任何hadoop以外的程序)。
在极限情况下,单个客户端最大IO速度为250MB/S,如果副本数为3的话,一秒内的总流量为750MB,万兆网是完全可以支撑的。如果多个客户端的话,由于受集群吞吐量的影响会有所下降,大致满足以下公式关系(客户端数量为N,数据节点数量为M,网络带宽为B,副本数位P):
1)如果P * N < M,那么每台客户机的速度都可以达到IO极限。
2)如果P * N > M,那么平均速度为R= M * B/(P * N * 8)
上面算出来的速度并不是绝对的,因为不同的客户端可能会同时路由block到同一个DataNode,不过在海量数据的情况下,大致可以达到负载均衡。