目录
- 概览
- 性能范围
- 块大小
- HDFS读写过程
- 写过程
- 读过程
- HDFS调优参数
- 0 调优
- 1 HDFS Block Size
- 2 HDFS Replication
- 3 NameNode,DataNode system
- 4 栗子:分布式复制
- HDFS健壮性
- 健壮性如何达到?
概览
可扩展的分布式文件系统
将数据以节点形式分布在本地磁盘上
高度容错:可以使用低成本商业硬件
数以千计的节点:需要处理节点或硬盘的failure
轻量级
高流通量
Approach:
- 一致性模型:写一次读多次
- 数据复制:可以处理硬件failure
- 将计算放在数据附近
- 放宽一部分POSIX约束,来实现流式读取文件系统数据的目的。
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。什么是POSIX? – 问答 – 云+社区 – 腾讯云 (tencent.com)
- 单个NameNode:管理文件系统的命名空间以及用户访问文件的规范,追踪情况
- 多个DataNode:一般每个节点有一个DataNode。管理存储、为用户提供读写request,数据块的增删改
性能范围
- 给定文件大小决定block的数量
- 受块大小影响的关键HDFS和系统组件
块大小
- 默认为64MB
- 10GB文件会被分为:10*1024/64=160块
为什么块很重要?
- Namenode内存使用:每个块都代表一个object
- map task的数量是基于块的数量的
为什么最好不要有很多很小的文件?
- 内存使用:基本上每个object有150byte大小
- 网络加载:check这些datanode的状态会加重网络负担
- Map task:会产生许多排队任务,延迟,硬盘读写的效率低下
解决方法for大量小文件: - 合并文件
- 序列文件?(sequence file):文件名作为key,data作为value
- HBase&Hive
- CombineFileInputFormatCombineFileInputFormat 文件分片总结_程序员小陶的大数据分享-CSDN博客
我们并不希望一个小文件就产生一个 map 任务,为了有效利用集群资源,优化任务的执行。CombineFileInputFormat通过将多个“小文件”合并为一个”切片”(在形成切片的过程中也考虑同一节点、同一机架的数据本地性),让每一个Mapper任务可以处理更多的数据,从而提高MR任务的执行速度。
HDFS读写过程
写过程
- 用户请求创建文件,数据首先被缓存在本地
- 数据积累到block的size时联系namenode,获得进一步的信息。
- namenode反馈一组datanodes(namenode是机架感知的)
机架感知(RackAwareness)IT探的博客-CSDN博客_机架感知
机架感知是一种计算不同计算节点(TaskTracker)的距离的技术,用以在任务调度过程中尽量减少网络带宽资源的消耗,这里用尽量,想表达的是当一个TT(TaskTracker)申请不到本地化任务时,JT(JobTracker)会尽量调度一个机架的任务给他,因为不同机架的网络带宽资源比同一个机架的网络带宽资源更可贵。
数据一共复制三份(三个datanode),第一份在client所在的机架(rack)上,后两份在另一个机架上。
4. 第一个datanode接受client的data并写入本地,并且同时将data传递至下一个datanode——是一个pipeline
5. namenode提交文件创建(持续状态)
6. namenode接收heartbeat和节点报告: Hadoop-2.4.1源码分析–HDFS HeartBeat(心跳检测)整体结构_HelloWorld-CSDN博客_hadoop heartbeat
心跳就是HDFS中从节点DataNode周期性的向名字节点NameNode做汇报,汇报自己的健康情况、负载状况等,并从NameNode处领取命令在本节点执行,保证NameNode这一HDFS指挥官熟悉HDFS的全部运行情况,并对从节点DataNode发号施令,以完成来自外部的数据读写请求或内部的负载均衡等任务。
读过程
- client从namenode处获得datanode列表
- HDFS寻找离reader最近的replica
HDFS调优参数
0 调优
调优环境通常在HDFS XML配置文件中,例如HDFS -site. XML中。一般的商业供应商会提供一些管理控制台。
1 HDFS Block Size
可以根据workload改变,例如128MB
dfs.blocksize
或dfs.block.size
2 HDFS Replication
默认是3,dfs.replication
tradeoffs:
- 降低会减少复制的成本
- 减低健壮性:难以恢复数据
- 提高会导致更多的worker可以使用本地数据
- 降低可以获得更多的空余空间
3 NameNode,DataNode system
基本不需要更改,更多可以看这个网页:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
4 栗子:分布式复制
并行文件系统中复制32个文件(总大小:512GB)
改变map和node数量
HDFS健壮性
健壮性如何达到?
failure:
- DataNode Failure:服务器宕机、磁盘损坏、数据损坏
- Network Failure
- NameNode Failure:磁盘故障、节点故障
减少failure: - 周期性的heartbeat:从datanode到namenode
- 如果最近失去了heartbeat:
- 标记为dead,不再发送IO
- 在另一个节点上重新复制
- 如果最近失去了heartbeat:
- checksum(Hadoop数据完整性与CheckSum校验原理_雾幻的博客-CSDN博客_hadoop 文件校验)
检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和(checksum)并存储,在数据进行传输后再次计算校验和进行对比,如果计算所得的新校验和和原来的校验和不匹配,就认为数据已损坏。但该技术并不能修复数据——它只能检测出数据错误。(这正是不使用低端硬件的原因。具体说来,一定要使用ECC内存。)注意,校验和也是可能损坏的,不只是数据,但由于校验和比数据小得多,所以损坏的可能性非常小。
- 创建文件时计算,存储在HDFS的命名空间
- 读文件时进行校验,如果和创建文件时的checksum不一样的话就从其他replica读取
- copy一些namenode(metadata)默认是人工切换。