本文主要是对http://hortonworks.com/blog/heterogeneous-storages-hdfs/的学习笔记,由于水平所限,领悟不到位的地方,请多多指教。
可以搭建各种存储类型,每个应用可根据自身的性能或者成本要求选择一个最合适的。
每种存储类型可以主要从三类性能指标进行衡量:
1. 每M字节成本
2. 持久性
该指标是对数据成功写入介质之后持久性进行衡量。现代磁盘都是高度耐用的,但是对于数量足够大的硬盘集来说,常规的硬盘故障是具有统计确定性的。
在对磁盘故障的大规模研究中发现,对于已使用1-2年的硬盘来说,年故障率在2%-8%之间[1]。
3. 性能
两个关键指标.
1.吞吐量:该存储类型能够提供的最大原始读/写率,通常以字节/秒(MBps)衡量。它是批处理应用程序所关心的主要指标。
2.每秒的IO操作数:该指标受到workload(工作类型?)和IO大小的影响。旋转磁盘的旋转延迟时间限制了最大的IOPS( 每秒输入输出),
从而也限制了交互查询应用程序的性能。比如对于纯随机IO工作类型,7200转硬盘(典型的商用硬件)的理论上的最大IOPS为240。
下表列出了不同存储类型的各个指标特点:
Storage Type | Throughput | Random IOPS | Data Durability | Typical Cost |
HDD | High | Low | Moderate, failures can occur at any time. | 4c/GB |
SSD | High | High | Moderate, failures can occur at any time. | 50c/GB for internal SATA SSD. roughly costs 10x or more of HDD |
NAS (Network attached storage) | High | Varies | May employ RAID for high durability | Varies based on features, typically falls between HDD and SSD. |
RAM | Very high | Very high | No durability, data is lost on process restart | >$10/GB roughly costs 100x or more of HDD |
设计原则:
根据以下目标进行设计:
1.HDFS不必知道各个存储类型的性能特点,只是提供一个将各个存储类型暴露给应用程序的机制。唯一的例外是硬盘,它是默认的后备存储类型。
虽然在未来可能也会是可配的,根据这个推论,我们避免使用分层存储这个术语(Tiered Storage or Hierarchical Storage)。
2.根据1,不提供根据性能特点列举或选择存储类型的API。存储类型将被明确地罗列出来。
3.管理员必须能够限制用户对各个存储类型的使用。
HDFS存储结构的变化
旧的namenode和HDFS客户端将每个datanode视作单一的存储单元。namenode不能感知给定datanode上的存储卷数量以及其对应的存储类型和容量。
datanode根据以下类型的信息上报他们的存储状态:
1. storage report.
存储报告包含了容量和使用细节等存储状态的概要信息。它包含在心跳包中。
2. block report.
块报告包含某个datanode上各个块数据块的详细信息。块报告分为增量和全量两种类型:增量报告定期地汇报新接收和删除的块;全量报告较不频繁地定期报告该datanode的所有数据块。
目前datanode发送的存储报告和块报告中包含了所有存储聚合信息。
根据异构存储,datanode把各个存储的类型和使用情况暴露给namenode。这是对HDFS内在机制的根本性改变,允许namenode在放置数据块时不仅仅可以选择在哪个datanode上,而且可以指定存储类型。
采用这种方式分离datanode的存储,通过减小各个块报告的大小,让namenode处理得更快,将可以扩展datadode的存储容量。
References
- Eduardo Pinheiro et. al. 2007. Failure Trends in a Large Disk Drive Population.
- Design document – ‘Heterogeneous Storage for HDFS‘.
- HDFS-2832. Enable support for heterogeneous storages in HDFS.
- HDFS-5682. Heterogeneous Storage phase 2 – APIs to expose Storage Types.