10亿+文件数压测,阿里云JindoFS轻松应对
简介: 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的结果很好地反馈了随着元数据规模增长,元数据服务的性能变化曲线。通过结果我们可以分析得出:
- 当达到10亿文件数时,写入TPS受到略微影响,TPS 下降为原先的88%。
- 当达到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)操作也是用户使用频率较高的操作,这些命令的执行时间,反应了元数据服务遍历操作的执行效率。
我们使用两个样本数据进行测试:
- 对一个表(半年数据,154个分区,270万个文件)执行ls -R操作,统计执行时间,使用以下命令
time hadoop fs -ls -R jfs://test/warehouse/xxx.db/tbl_xxx_daily_xxx > /dev/null
- 对一个数据库(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轻松应对的更多相关文章
- 10 月 30 日 北京 LiveVideoStack 阿里云视频云专场限量赠票 100 张
10 月 30 日 | 北京 LiveVideoStack 将携手阿里云共邀 4 位技术大咖,一同探讨从上云到创新,视频云的新技术与新场景.阿里云视频云依托阿里云服务数百万开发者的卓越服务能力与实践, ...
- <亲测>阿里云centos7 挂载数据盘配置
阿里云centos7 挂载数据盘配置 2018年07月17日 15:13:53 阅读数:235更多 个人分类: linux阿里云ECS数据盘挂载 查看磁盘情况 fdisk -l 其中/dev/v ...
- 阿里云解析记录应对家里动态IP
<?php #需要配置的项 define('ACCESSKEYID',''); #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/ ...
- <亲测>阿里云centos7安装redis
安装redis yum install redis 启动redis systemctl start redis.service 设置redis开机启动 systemctl enable redis.s ...
- [转载]点评阿里云、盛大云等国内IaaS产业
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:刘黎明 原文地址:http://www.chinacloud.org ...
- “军装照”背后——天天P图如何应对10亿流量的后台承载。
WeTest 导读 天天P图"军装照"活动交出了一份10亿浏览量的答卷,一时间刷屏朋友圈,看到这幕,是不是特别想复制一个如此成功的H5?不过本文不教你如何做一个爆款H5,而是介绍天 ...
- 用阿里云ecs部署kubernetes/K8S的坑(VIP、slb、flannel、gw模式)
1 阿里云ecs不支持keepalived vip 1.1 场景描述 本来计划用keepalived配合nginx做VIP漂移,用以反代多台master的apiserver的6443端口,结果部署了v ...
- wrk 及扩展支持 tcp 字节流协议压测
wrk 及扩展支持 tcp 字节流协议压测 高性能.方便使用的 HTTP(s) 的流量压测工具,结合了多个开源项目开发而成: redis 的 ae 事件框架 luajit openssl http-p ...
- 精准容量、秒级弹性,压测工具 + SAE 方案如何完美突破传统大促难关?
作者 | 代序 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文 ...
- 阿里云视频直播PHP-SDK
阿里云 视频直播 配置 及 PHP-SDK 接入教程准备工作域名管理配置鉴权地址生成器及DEMO演示-熟悉鉴权接入SDK推流回调的配置阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿 ...
随机推荐
- 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧
很多人都听说过爬虫,我也不例外.曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大.因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容.广告? ...
- 关于初始化page入参的设计思路
最近在重构老的代码,在写的过程中发现之前的逻辑如果遇到没有入参pageNo会Npe,于是乎我想找找公司项目有啥方式处理page入参的有两种如下 使用三元表达式直接判断是否null,然后赋值 使用map ...
- window10-yarn-使用vite创建vue3项目失败-文件夹或目录不正确
前置条件 window10 本地已经安装nodejs yarn已经通过npm全局安装(npm install -g yarn) 问题 yarn脚手架方式搭建vue3项目失败(command faile ...
- 如何理解UDP 和 TCP? 区别? 应用场景?
一.UDP UDP(User Datagram Protocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层 ...
- 记录--手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向.对于数据可视化,很多互联网公司是很看重这一块的,包括 ...
- Linux Mint下Qt Creator无法输入中文解决办法
注,本文所指的是linux中使用fcitx输入框架下,Qt程序输入中文的解决办法 如果是ibus输入框架,则不需要任何操作,可以直接输入中文 但是微信使用的是fcitx输入框架,且比较常用,故只能使用 ...
- KingbaseES 优化之sql优化方法
金仓数据库在sql层面提供了多种优化手段,但是这些的前提时需要保证我们的统计信息准确,优化器已经在正确信息下选择了它认为的最优的执行计划, 优化手段包括 •使用索引 索引解决的问题用于在进行表的扫描时 ...
- 内核模块的makefile规则详解
内核中的Makefile 这里主要对内核源码各子集目录中的Kbulid(内核的编译系统)Makfile进行简单介绍 这部分式内核驱动或设备驱动开发这最长接触到的 Makefile 的语法包括几个方面 ...
- Scala 类和对象与Java的对比
一.包 1 package com{ 2 3 import com.atguigu.scala.Inner 4 5 // 在外层包中定义单例对象 6 object Outer{ 7 var out: ...
- 一文搞懂Java的工具类和API
1.工具类(Utility Class) 在Java中,工具类通常包含一系列静态方法,用于执行常见的任务,这些任务可能不直接关联到特定的业务逻辑,而是用于处理一些基础的数据转换.字符串操作.文件操作等 ...