10亿+文件数压测,阿里云JindoFS轻松应对

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

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

主要介绍


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亿文件数,从而测试其是否可以保持稳定的性能。


测试环境

主实例组 (MASTER) 核心实例组 (CORE)

主机数量: 3

机型规格: ecs.g5.8xlarge

CPU: 32核

内存: 128GB

数据盘配置: 640GB ESSD云盘*1

主机数量: 4

机型规格: ecs.i2g.8xlarge

CPU: 32核

内存: 128GB

数据盘配置: 1788GB 本地盘*2


数据集(共4组)

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


元数据磁盘空间占用

0文件数(初始状态)

1亿文件数

5亿文件数

10亿文件数

50MB

17GB

58GB

99GB


文件大小的分布(以10亿文件数为例)

文件大小

比例

0(目录)

1.47%

0(文件)

2.40%

大于0,小于等于128KB

33.66%

大于128KB,小于等于1MB

16.71%

大于1MB,小于等于8MB

15.49%

大于8MB,小于等于64MB

18.18%

大于64MB,小于等于512MB

9.26%

大于512MB

2.82%

另外,目录层级主要分布在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个)


测试结果

操作 0文件数 1亿文件数 5亿文件数 10亿文件数
create_write 5836 5791 5598 5153
open_read 24853 24097 23521 23567


image.png

TPS

create_write

7000

6000

5836

5791

5598

5153

5000

4000

3000

2000

1000

0文件数

1亿文件数

10亿文件数

5亿文件数

image.png

TPS

openread

26000

24853

24000

24097

23567

23521

22000

20000

18000

16000

14000

12000

10000

10亿文件数

1亿文件数

0文件数

5亿文件数


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

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



TPC-DS测试

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

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

image.png

99个查询总耗时对比:

查询 0文件数 1亿文件数 5亿文件数 10亿文件数
总计 13032.51 13015.226 13022.914 13052.728


通过观察发现,去掉误差影响,随着元数据规模从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


测试结果(单位:秒)

操作 1亿文件数 5亿文件数 10亿文件数
ls -R 7.321 7.322 7.425
count 5.425 5.445 5.478


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


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

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

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


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

image.png

耗时(秒)

7.602

7.425

5.609

5.478

ls-R

COunT

热启动

冷启动

通过观察发现,冷启动情况下,这些操作耗时增加了约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


image.png

LS耗时(秒)

1.693

1.686

0.6

目录

目录c

目录

目录b

HDSS

JindoFs



递归 list 操作

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


image.png

LSR耗时(秒)

11.999

12

10.532

8.249

3.851

3.77

3.249

目录

目录

目录

HDFS

JindoFs



du 操作

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

image.png

DU耗时(秒)

11.569

1.978

1845

1.788

1.603

1.382

目录

目录a

目录b

目录c

HDFS

JindoFs


count 操作

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

image.png

COUNT耗时(秒)

12

4.071

2.006

1.83

1.777

1.398

1398

1.35

目录d

目录b

目录c

目录

HDRSWJindFs

结果分析

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



总结


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


另外,JindoFS SDK可以单独使用,替代Hadoop社区OSS客户端实现。相比于Hadoop社区实现,JindoFS SDK对读写OSS的能力上做了很多的性能优化,可以访问github repo下载使用。


欢迎试用

欢迎对阿里云 JindoFS 感兴趣的朋友加入阿里云EMR钉钉群交流测试,群内会定期进行精品内容分享,测试请@扬流,钉钉群如下

309470c69d24477bae208ed320d9ad8a.jpg

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
存储 Kubernetes 算法
ASI 2021 年双十一万级别超大规模集群的高性能提升
ASI 作为云原生的引领实施者,它的高性能,高可用,它的稳定性影响着甚至决定着阿里集团和云产品的业务的发展。
2453 12
ASI 2021 年双十一万级别超大规模集群的高性能提升
|
1月前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
55 8
|
存储 弹性计算 自然语言处理
PB级数据量背后阿里云 Elasticsearch 的内核优化实践
本文将揭秘阿里云在面对 PB 级数据量挑战下所做的内核优化实践。
5982 0
PB级数据量背后阿里云 Elasticsearch 的内核优化实践
|
1月前
|
NoSQL 关系型数据库 MySQL
百万数据量优化实战
在现代互联网业务中,处理百万级别的数据量是家常便饭。传统的单体数据库架构在面对如此庞大的数据量时,往往显得力不从心。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
62 4
|
7月前
|
测试技术 UED
PTS压测问题之资源准备好慢如何解决
PTS(Performance Testing Service)是一项面向网站、应用等提供的压力测试服务,用于模拟不同场景下的用户访问,评估系统的性能表现;在进行PTS压测时,可能会出现一些异常或报错,本合集将PTS压测中频繁出现的问题及其解决办法进行汇编,旨在帮助用户更有效地进行性能测试和问题定位。
296 1
|
6月前
|
运维 Serverless Nacos
Serverless 应用引擎产品使用合集之在访问量过大的情况下,函数配置的cpu和内存会自动扩容吗
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
缓存 NoSQL 架构师
并发量很大?阿里上传在GitHub的亿级流量百万并发手册真的火了!
亿级流量对于电商有什么作用? 对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术。然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度。然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师、Java资深工程师、Java架构师这些高阶的职位发展的过程中,都是完全不够用的。技术成长出现瓶颈,在自己公司的项目中,没有任何高并发与高可用的挑战性项目,自己不知道如何成长,
141 0
百万级PV 千万级PV | 并发 的架构图
百万级PV 千万级PV | 并发 的架构图,生产环境可使用
百万级PV 千万级PV | 并发 的架构图
|
缓存 NoSQL 架构师
并发量很大?阿里上传在GitHub的亿级流量百万并发手册真的火了
对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术。然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度。然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师、Java资深工程师、Java架构师这些高阶的职位发展的过程中,都是完全不够用的。技术成长出现瓶颈,在自己公司的项目中,没有任何高并发与高可用的挑战性项目,自己不知道如何成长,自己也不知道如何让自己的技术更
并发量很大?阿里上传在GitHub的亿级流量百万并发手册真的火了
|
存储 缓存 数据库
百万QPS系统的缓存实践
标题有些吸引眼球了,但并不浮夸,甚至还会远远超过百万,现在的平均响应时间在1ms内,0.08ms左右 如此高的QPS,如此低的AVG,为什么会有如此效果,关键点可能就在多级缓存上 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流
674 0
百万QPS系统的缓存实践