简介: Apache Hadoop FileSystem (HDFS) 是被广为使用的大数据存储方案,其核心元数据服务 NameNode 将全部元数据存放在内存中,因此所能承载的元数据规模受限于内存,单个实例所能支撑的文件个数大约 4亿。JindoFS块模式是阿里云基于 OSS 海量存储自研的一个存储优化系统,提供了高效的数据读写加速能力和元数据优化能力。JindoFS 实际表现如何,我们在 10亿文件数规模下做了压测,验证 JindoFS 在达到这个规模的时候是否还可以保持稳定的性能。

主要介绍


Apache Hadoop FileSystem (HDFS) 是被广为使用的大数据存储方案,其核心元数据服务 NameNode 将全部元数据存放在内存中,因此所能承载的元数据规模受限于内存,单个实例所能支撑的文件个数大约 4亿。JindoFS块模式是阿里云基于 OSS 海量存储自研的一个存储优化系统,提供了高效的数据读写加速能力和元数据优化能力。在设计上避免了 NameNode 上的内存限制,与HDFS不同的一点是,JindoFS元数据服务采用RocksDB作为底层元数据存储,RocksDB可以存储在大容量本地高速磁盘,解决了内存容量瓶颈问题。借助于内存缓存,将10%~40%的热文件元数据存放于内存缓存,从而保持稳定的优秀的读写性能。借助于Raft机制,JindoFS元数据服务可以组成3个主备实例,实现服务高可用。JindoFS 实际表现如何,我们在 10亿文件数规模下做了压测,验证 JindoFS 在达到这个规模的时候是否还可以保持稳定的性能。同时在一些关键的元数据操作上,我们也跟 HDFS 做了个测试对比。

JindoFS 10亿文件数测试


HDFS NameNode 单个实例所能支撑的文件个数大约 4亿,主要原因是受限于内存大小。除此之外,由于文件数增加,需要处理的DataNode上报块也增加,造成了性能上的巨大抖动。大量文件信息保存在一个很大的FsImage文件,用于下次启动时加载,而很大的FsImage文件使得 NameNode 启动需要花费10分钟以上的时间。

JindoFS 解决了以上系列问题,它使用 RocksDB 存储元数据,相比于 NameNode 可以存储更大规模的文件数,不受限于内存。另外不需要Worker节点上报块信息,没有性能抖动的问题。JindoFS 元数据服务可以在1s内完成启动,毫秒内完成主备节点切换。所以本次测试,我们分别测试了 JindoFS 从1亿文件数增长到10亿文件数,从而测试其是否可以保持稳定的性能。

数据集(共4组)

为了测试在不同的元数据规模下,JIndoFS元数据服务的性能。我们准备4组数据。分别是:初始状态(0文件数)、1亿文件数、5亿文件数、10亿文件数。我们使用一份真实的经过用户脱敏的HDFS FsImage文件,将其还原到JindoFS元数据服务当中。文件大小按1:1相应地创建block信息一起存入JindoFS元数据。最终生成的数据集如下。

元数据磁盘空间占用

另外,目录层级主要分布在5到7级目录居多。数据集的文件大小分布、目录层级分布一定程度上比较接近生产环境的情况。

NNBench测试

NNBench全称NameNode Benchmark,是HDFS官方自带的用于测试NameNode性能的工具。由于它使用的是标准的FileSystem接口,因此我们可以使用它来测试JindoFS服务端的性能。NNBench的执行参数如下:

测试写性能

-operation create_write  -maps 200  -numberOfFiles 5000 -bytesToWrite 512

测试读性能

-operation open_read  -maps 200  -numberOfFiles 5000 -bytesToWrite 512

启动200个Map Task,每个Task写(读)5000个文件,共计100万个文件。(受测试集群规模限制,实际同时执行Map个数为128个)

测试结果

NNBench的结果很好地反馈了随着元数据规模增长,元数据服务的性能变化曲线。通过结果我们可以分析得出:

  1. 当达到10亿文件数时,写入TPS受到略微影响,TPS 下降为原先的88%。
  2. 当达到5亿文件数时,读TPS受到略微影响,TPS 下降为原先的94%。而10亿文件数时,读TPS保持稳定,跟5亿文件数时基本持平。

TPC-DS测试

使用的是官方TPC-DS数据集,5TB数据量,使用的是ORC格式,Spark作为执行引擎进行测试。

测试成绩如下,时间单位秒:

99个查询总耗时对比:

通过观察发现,去掉误差影响,随着元数据规模从0增加到10亿文件数,TPC-DS成绩基本不受影响。

ls -R/count测试

上述NNBench工具主要测试高并发下元数据服务单点写入、单点查询的性能。然而,文件列表导出(ls -R)操作、文件大小统计(du/count)操作也是用户使用频率较高的操作,这些命令的执行时间,反应了元数据服务遍历操作的执行效率。

我们使用两个样本数据进行测试:

  1. 对一个表(半年数据,154个分区,270万个文件)执行ls -R操作,统计执行时间,使用以下命令

time hadoop fs -ls -R jfs://test/warehouse/xxx.db/tbl_xxx_daily_xxx > /dev/null

  1. 对一个数据库(50万个目录,1800万个文件)执行count操作,统计执行时间,使用以下命令

time hadoop fs -count jfs://test/warehouse/xxx.db

测试结果发现,对于遍历(ls -R/count)相同数量的文件(目录),元数据服务的性能保持稳定,不会随着元数据总量的增长有所变化。

对于10亿级别的文件数,磁盘占用有近100GB,JindoFS元数据服务只会缓存部分热文件元数据,那么元数据文件的page cache是否会对性能有所影响?我们为此做了测试。

热启动:直接重启元数据服务服务,此时系统存在page cahe。

冷启动:我们使用命令echo 3 > /proc/sys/vm/drop_caches清空缓存,并重启元数据服务。

测试结果如下(使用10亿文件数据集)

通过观察发现,冷启动情况下,这些操作耗时增加了约0.2秒,只受到细微的影响。

与HDFS横向对比测试


通过上面的测试我们得知 JindoFS 在10亿文件数下,依然保持了稳定的性能。另外我们补充测试了 JindoFS 跟 HDFS 的对比。由于 HDFS 存储10亿规模文件数需要极高规格的机器,因此本轮测试我们主要测试1亿文件数场景,我们通过横向对比list、du、count等常用操作,对比两者的性能差异。

样本说明

抽取 a, b, c, d 共 4 组目录,

目录 a:Hive warehouse目录包含 31.7万目录,1250万文件;

目录 b:某 database 目录包含 1万2目录,32万文件;

目录 c:某 table 目录包含 91个目录,7.7万文件;

目录 d:spark 结果存放目录包含4.2万目录,7.1万文件;

测试结果(用时更短,性能更好)

单层 list 操作

对单层目录进行展开并输出,采样方法: time hadoop dfs -ls [DIR] > /dev/null

递归 list 操作

对目录进行逐层展开并输出,采样方法: time hadoop dfs -ls -R [DIR] > /dev/null

du 操作

对目录占用的存储空间进行计算,采样方法: time hadoop dfs -du [DIR] > /dev/null

count 操作

对目录的文件(夹)数量、容量进行计算,采样方法: time hadoop dfs -count [DIR] > /dev/null

结果分析

通过上述测试结果,可以明显发现 JindoFS 在list、du、count等常用操作上速度明显快于 HDFS。分析原因,HDFS NameNode 内存中使用了全局的读写锁,所以对于查询操作,尤其是对目录的递归查询操作都需要拿读锁。拿锁之后使用了单线程串行的方式做目录递归操作,速度较慢。拿锁时间长继而又影响了其它rpc请求的执行。JindoFS 从设计上解决了这些问题。它对目录的递归操作使用了多线程并发加速,因此在对目录树的递归操作上速度更快。同时使用了不同的目录树存储结构,配合细粒度锁,从而减少了多个请求之间的影响。

总结


JindoFS 块模式可以轻松地存储10亿+文件数,并且提供高性能的读写请求处理能力。跟 HDFS NameNode 相比占用内存更小、性能更好、运维更加简单。我们可以利用 JindoFS 作为存储引擎,将底层数据存放在对象存储(比如OSS)上,并且利用 JindoFS 的本地缓存加速能力,组成一个云上稳定、可靠、高性能的大数据存储方案,给上层计算分析引擎提供强大有力的支撑。

作者:苏昆辉,花名抚月,阿里巴巴计算平台事业部 EMR 技术专家, Apache HDFS committer,目前从事开源大数据存储和优化方面的工作。

原文链接

本文为阿里云原创内容,未经允许不得转载

10亿+文件数压测,阿里云JindoFS轻松应对的更多相关文章

  1. 10 月 30 日 北京 LiveVideoStack 阿里云视频云专场限量赠票 100 张

    10 月 30 日 | 北京 LiveVideoStack 将携手阿里云共邀 4 位技术大咖,一同探讨从上云到创新,视频云的新技术与新场景.阿里云视频云依托阿里云服务数百万开发者的卓越服务能力与实践, ...

  2. <亲测>阿里云centos7 挂载数据盘配置

    阿里云centos7 挂载数据盘配置 2018年07月17日 15:13:53 阅读数:235更多 个人分类: linux阿里云ECS数据盘挂载   查看磁盘情况 fdisk -l  其中/dev/v ...

  3. 阿里云解析记录应对家里动态IP

    <?php #需要配置的项 define('ACCESSKEYID',''); #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/ ...

  4. <亲测>阿里云centos7安装redis

    安装redis yum install redis 启动redis systemctl start redis.service 设置redis开机启动 systemctl enable redis.s ...

  5. [转载]点评阿里云、盛大云等国内IaaS产业

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:刘黎明      原文地址:http://www.chinacloud.org ...

  6. “军装照”背后——天天P图如何应对10亿流量的后台承载。

    WeTest 导读 天天P图"军装照"活动交出了一份10亿浏览量的答卷,一时间刷屏朋友圈,看到这幕,是不是特别想复制一个如此成功的H5?不过本文不教你如何做一个爆款H5,而是介绍天 ...

  7. 用阿里云ecs部署kubernetes/K8S的坑(VIP、slb、flannel、gw模式)

    1 阿里云ecs不支持keepalived vip 1.1 场景描述 本来计划用keepalived配合nginx做VIP漂移,用以反代多台master的apiserver的6443端口,结果部署了v ...

  8. wrk 及扩展支持 tcp 字节流协议压测

    wrk 及扩展支持 tcp 字节流协议压测 高性能.方便使用的 HTTP(s) 的流量压测工具,结合了多个开源项目开发而成: redis 的 ae 事件框架 luajit openssl http-p ...

  9. 精准容量、秒级弹性,压测工具 + SAE 方案如何完美突破传统大促难关?

    作者 | 代序 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文 ...

  10. 阿里云视频直播PHP-SDK

    阿里云 视频直播 配置 及 PHP-SDK 接入教程准备工作域名管理配置鉴权地址生成器及DEMO演示-熟悉鉴权接入SDK推流回调的配置阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿 ...

随机推荐

  1. 小程序登录V2

    参考:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801(通知) https:/ ...

  2. c语言之被遗漏的角落---#pragma pack

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. CAST电子部单片机方向授课——串口通信 预习文档

    CAST电子部单片机方向授课--串口通信 预习文档 课前小准备 安装串口调试助手 第一步:进入Microsoft Store 第二步:在Microsoft Store中搜索 "串口调试助手& ...

  4. .NET周刊【3月第2期 2024-03-17】

    国内文章 开源.NET8.0小项目伪微服务框架(分布式.EFCore.Redis.RabbitMQ.Mysql等) https://www.cnblogs.com/aehyok/p/18058032 ...

  5. System design summary

    system design https://github.com/donnemartin/system-design-primer Performance vs scalability scalabi ...

  6. 从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

    一.引 在前面的几篇文章中,我们从 dbt core 聊到了 dbt 项目工程化,我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发,那么到现在我们更迫切需要解决的是如何让数据更新做到定时化 ...

  7. Anaconda 创建新环境

    使用conda 命令创建一个名为 python311 的python版本为3.11的环境 conda create -n python311 python=3.11 接着使用 conda activa ...

  8. 没有Python基础,如何学习用Python写机器学习

    前言 我是一个完全没用过python的人,所以,想写机器学习,就得从语法入手. 首先上W3cSchool去学习基础语法. 基础语法都差不多,重点看一下函数,模块,面向对象. 函数的写法稍有不同,格式上 ...

  9. BorderDet:通过边界特征大幅提升检测准确率,即插即用且速度不慢 | ECCV 2020 Oral

    边界对于定位问题十分重要,BorderDet的核心思想BorderAlign巧妙又有效,将边界特征融入到目标定位预测中,而且能够简单地融入到各种目标检测算法中带来较大的性能提升下.在开源实现中,对Bo ...

  10. KingbaseES V8R6集群运维案例之---同一主机节点部署多个集群

    案例说明: 在同一主机环境,由于生产需要,需要部署两个集群:本案例详细描述了两个集群的部署过程. 注意:同一主机部署多个集群需要先部署securecmdd服务,节点之间通过securecmdd服务通讯 ...