随着企业收集和分析的数据量不断增长,人们越来越关注会影响到性能的数据存储成本的管理。Hadoop提供了一种可扩展且快速的方式来存储和分析数据,但在Hadoop中存储数据通常比对象存储等替代方案的成本更高。
对于寻求可扩展、经济高效存储的企业而言,内部部署和云部署(例如AWS S3)采用对象存储的方案更普遍。然而,对象存储相较于Hadoop性能更低,因此程序开发者可能不愿意在两者间进行权衡选择。企业注重成本优势,云服务提供商的定价透明,但没有很好地解决成本与性能的权衡。
Alluxio是一个虚拟分布式文件系统,它创建了一个统一化各种不同存储系统的数据层,并且可以达到内存级别的访问速度。数据无论存储在Hadoop HDFS中,还是对象存储中,都可以通过全局命名空间中的单个源进行访问。这使得企业可以设计两全其美的数据存储方案,即在利用低成本存储的同时不降低性能。
Alluxio是世界上第一个内存级别速度的虚拟分布式文件系统。它统一化数据访问并桥接了计算框架和存储。应用程序只需要与Alluxio连接即可访问存储在底层任何持久化存储系统中的对象或文件数据。此外,Alluxio架构支持以内存级别速度访问数据,以提供最快的I/O操作。
在大数据生态环境中,Alluxio是一个位于计算和存储之间的数据层。它可以带来明显的性能提升,尤其在跨越多个数据中心的云可用区。Alluxio抽象了底层持久化存储系统中的对象或文件,为应用提供共享数据访问。Alluxio兼容Hadoop和对象存储,支持对持久化存储的读写操作。现有的数据分析应用(如Hive,HBase和Spark SQL)可以直接在Alluxio上运行而无需更改任何代码。
最常见的大数据存储架构包含了并置(co-located)的计算和存储,具体地使用HDFS存储系统作为MapReduce,Spark,Hive,Presto等计算框架的存储,如图1所示。数据和计算位于同一节点,计算和存储紧耦合能够带来高性能但可扩展性和成本却不容乐观。扩展存储的同时会迫使无需扩展的计算也进行了扩展(反之亦然)。随着时间的推移,Hadoop集群可能会变得庞大,并积累了大量较旧的,不太活跃的冷数据。
图 1:使用Hadoop HDFS的传统大数据体系结构
部署Alluxio会创建一个带有虚拟数据层的系统架构,从而统一存储在HDFS和对象存储中的数据,如图2所示。集群中的性能与仅有HDFS的配置情况相当,因为Alluxio会缓存来自对象存储的数据。同时可以将不常使用的数据转移到性价比最高的对象存储,并且存储和计算可以独立扩展。
图 2:使用Alluxio作为虚拟数据访问层的大数据架构
在此存储架构中,Alluxio提供以下功能:
• 现代的计算存储分离的弹性架构:资源可以独立管理和扩展,标准API和插件架构支持未来新技术的对接。
• 统一化的数据层创建“虚拟数据湖”:在Alluxio全局命名空间中访问对象和文件,就好像它们位于一个单个系统中。
• 快速本地访问重要且经常使用的数据,无需维护永久副本:Alluxio智能地只缓存所需的数据块,而不是整个文件。
• 通过将数据迁移到成本较低的商品存储来优化存储成本,而不会降低性能。
• 灵活性:Alluxio中的数据可以在不同的工作负载和计算框架(如查询,批处理分析和机器学习)之间共享。支持行业标准接口,包括HDFS和S3A。
为了说明对性能的影响,我们运行了一个简单的测试,你可以在自己的环境中轻松复现。在实验中,我们使用MapReduce,HDFS,Alluxio和AWS S3存储桶创建了一个示例配置。实验表明,云的对象存储与内部HDFS部署相比可以达到近似的性能表现。
集群包含6个Amazon EC2实例(类型为M4.4XL)。该集群配置了五个Alluxio工作节点分别与各自的HDFS DataNodes位于相同位置,每个工作节点都预留了30GB的内存。NameNode和Alluxio Master位于同一主机,此HDFS部署作为Alluxio根文件系统。
实验运行如下:Teragen生成存储在HDFS中的数据(100 GB),通过MapReduce对数据运行Terasort。然后,HDFS和S3存储桶挂载到Alluxio命名空间下,利用Alluxio统一文件系统特性将现有数据从HDFS迁移到S3。最后,通过MapReduce对S3中的数据运行Terasort。
• 生成数据集
为了提供数据给Terasort,使用teragen在本地HDFS上生成100GB数据集:
$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teragen 1000000000 /teraInput
• 运行Terasort(HDFS)
为了获得基准性能,在本地HDFS运行Terasort。
$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar terasort /teraInput /teraOutput
• 将数据迁移到S3
Alluxio统一文件系统功能提供了一种在支持的文件系统之间迁移数据的简单方法。使用Alluxio shell命令将数据从本地HDFS迁移到S3。首先,将S3存储桶挂载到Alluxio命名空间。
• 通过Alluxio将数据集复制到S3
$ bin/alluxio fs mount --option aws.accessKeyId= --option aws.secretKey= /s3-mount s3a://alluxio-terasort/input
根据你为Alluxio配置的写入类型,可能需要手动将数据加载到Alluxio命名空间。
$ bin/alluxio fs cp -R /teraInput /s3-mount
• 运行Terasort(数据通过Alluxio来自S3 )
Terasort结果输出到本地HDFS,以获得数据读取路径的可靠性能。
$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar terasort alluxio:///s3-mount/teraInput /teraOutput
内部部署HDFS配置的总运行时间为39分钟13秒。采用Alluxio从S3访问数据,可使得总时间为37分钟17秒,实际上快了近5%。
Alluxio支持任何提供标准接口的商业对象存储平台,包括内部部署和主要云服务提供商给出的解决方案。如果想要自己尝试Alluxio,你可以在几分钟内下载并开始使用,来加速AWS中的示例数据集或运行上述实验。