数据仓库之HDFS磁盘
最近需要重新设计下HADOOP的集群,之前我们的Hadoop集群是部署在虚拟机上的,很多底层的东西没有考虑,现在有新的物理机用来部署Hadoop,我们来重新做下这一块的调研,本文主要是针对HDFS的配置。
RAID, JBOD, LVM
在我们继续深入研究Hadoop硬盘这一块相关选型之前,我们先看看这几个概念。
RAID: 由两个或更多磁盘组成的存储空间,通过并发地在多个磁盘上读写数据来提高存储系统的 I/O 性能。磁盘阵列中,数据分散在多个磁盘中,然而对于计算机系统来说,就像一个单独的磁盘。通过把相同数据同时写入到多块磁盘(典型地如镜像),或者将计算的校验数据写入阵列中来获得冗余能力,当单块磁盘出现故障时可以保证不会导致数据丢失。数据分散保存在 RAID 中的多个不同磁盘上,并发数据读写要大大优于单个磁盘,因此可以获得更高的聚合 I/O 带宽。RAID的优势:
大容量:由多个磁盘组成的 RAID 系统具有海量的存储空间, RAID 可用容量要小于所有成员磁盘的总容量,RAID 容量利用率在 50% ~ 90% 之间。
高性能:RAID 的高性能受益于数据条带化技术。单个磁盘的 I/O 性能受到接口、带宽等计算机技术的限制,性能往往很有 限,容易成为系统性能的瓶颈。通过数据条带化, RAID 将数据 I/O 分散到各个成员磁盘上,从而获得比单个磁盘成倍增长的聚合 I/O 性能。
可靠性:RAID 采用镜像和数据校验等数据冗余技术
可管理性:RAID 是一种虚拟化技术,它对多个物理磁盘驱动器虚拟成一个大容量的逻辑驱动器。对于外部主机系统来说, RAID 是一个单一的、快速可靠的大容量磁盘驱动器。
RAID0:一种简单的、无数据校验的数据条带化技术。实际上不是一种真正的 RAID ,因为它并不提供任何形式的冗余策略。RAID0 将所在磁盘条带化后组成大容量的存储空间,将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作,总线带宽得到充分利用。再加上不需要进行数据校验,RAID0 的性能在所有 RAID 等级中是最高的。理论上讲,一个由 n 块磁盘组成的 RAID0 ,它的读写性能是单个磁盘性能的 n 倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。
JBOD: 不是标准的 RAID 等级,它通常用来表示一个没有控制软件提供协调控制的磁盘集合。JBOD 将多个物理磁盘串联起来,提供一个巨大的逻辑磁盘。JBOD的数据存放机制是由第一块磁盘开始按顺序往后存储,当前磁盘存储空间用完后,再依次往后面的磁盘存储数据。JBOD 存储性能完全等同于单块磁盘,而且也不提供数据安全保护。它只是简单提供一种扩展存储空间的机制, JBOD 可用存储容量等于所有成员磁盘的存储空间之和。
LVM: 它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。
HDFS 硬盘配置选型
我们来看看CDH的官方文档关于硬盘的建议
https://docs.cloudera.com/documentation/other/reference-architecture/PDF/cloudera_ref_arch_cdp_dc.pdf
Disk Layout For Master nodes:
● 2 x Disks (capacity at least 500 GB) in RAID 1 (software or hardware) for OS and logs
● 2 x Disks (capacity at least 1 TB) in RAID 1 (software or hardware) for NameNode metadata
For Worker nodes:
● 2x Disks (capacity at least 500 GB) in RAID 1 (software or hardware) for OS and logs
● 12-24 SATA Disks JBOD mode (or as multiple single-drive RAID 0 volumes if using a RAID controller incapable of doing JBOD passthrough) no larger than 4 TB in capacity. If the RAID controller has cache, use it for write caching (preferably with battery backup) and disable read caching.
从这里可以看到, 其实并不是千篇一律的Hadoop就是raid1,raid0或者不做raid, 还是和节点的性质相关,首先任何节点的系统盘都是建议raid1, HDFS的Namenode也是建议Raid1来存储metadata。
关于HDFS的DATANODE在磁盘方面的选择:
RAID: HDFS所提供的节点间数据复制技术已可满足数据备份需求,无需使用RAID的冗余机制。那么除了RAID0以为其他的带备份冗余的都不需要考虑。
RAID0 VS JBOD: 初始选择的时候,我觉得RAID0会更好,读写性能更好,容量的损耗并不大。在<<HADOOP权威指南>>给出的解释是这样的,
尽管RAID 0条带化技术被广泛用户提升性能,但是其速度仍然比用在HDFS里的JBOD(Just a Bunch Of Disks)配置慢。JBOD在所有磁盘之间循环调度HDFS块。RAID 0的读写操作受限于磁盘阵列中最慢盘片的速度,而JBOD的磁盘操作均独立,因而平均读写速度高于最慢盘片的读写速度。需要强调的是,各个磁盘的性能在实际使用中总存在相当大的差异,即使对于相同型号的磁盘。针对某一雅虎集群的评测报告表明,在一个测试(Gridmix)中,JBOD比RAID0 快10%;在另一测试(HDFS写吞吐量)中,JBOD比RAID 0 快30%。最后,若JBOD配置的某一磁盘出现故障,HDFS可以忽略该磁盘,继续工作。而RAID0的某一盘片故障会导致整个磁盘阵列不可用,进而使相应节点失效。
LVM: Cloudera的官方建议如下
In RHEL/CentOS, the Logical Volume Manager (LVM) should not be used for data drives. It is not optimal and can lead to combining multiple drives into one logical disk, which is in complete contrast to how Hadoop manages fault tolerance across HDFS. It is beneficial to keep LVM enabled on the OS drives. Any performance impact that may occur is countered by the improvement to manageability of the system. Using LVM on the OS drives enables the admin to avoid over-allocating space on partitions. Space needs can change over time and the ability to dynamically grow a file system is better than having to rebuild a system. Do not use LVM to stripe or span logical volumes across multiple physical volumes to mimic RAID.
DataNode上的数据主要用于批量的读写,不需要这种特性,建议将每个磁盘单独分区,分别挂载到不同的存储目录下,从而使得数据跨磁盘分布,不同数据块的读操作可并行执行,有助于提升读性能。
HDFS:HDFS相关设置, <<HADOOP权威指南>>建议 :
You should also set the dfs.data.dir property, which specifies a list
of directories for a datanode to store its blocks. Unlike the
namenode, which uses multiple directories for redundancy, a datanode round-robins writes between its storage directories, so for
performance you should specify a storage directory for each local
disk. Read performance also benefits from having multiple disks for
storage, because blocks will be spread across them, and concurrent
reads for distinct blocks will be correspondingly spread across disks.
For maximum performance, you should mount storage disks with the
noatime option. This setting means that last accessed time information
is not written on file reads, which gives significant performance gains.
也就是说dfs.data.dir 需要设置a list of directories,每个数据节点specify a storage directory for each local disk。
File system: Cloudera recommends using an extent-based file system. This includes ext3, ext4, and xfs. Most new Hadoop clusters use the ext4 filesystem by default. Red Hat Enterprise Linux 7 uses xfs as its default filesystem. 我们在XFS上遇到过问题,感觉还是EXT4比较保险。
整体的梳理下:
HDFS的系统盘以及namenode:仍然是需要raid0 来保持高可用
HDFS的数据盘:JBOD>RAID0,不用LVM, 分区的话采用EXT4, 每个盘单独挂在不同的目录,并在HDFS中分别配置这些目录。