大数据的性能是个永恒的话题。不过,在实际工作中我们发现,许多人都不知道如何进行最简单的性能估算,结果经常被大数据厂商忽悠:)。
这个办法我在以往的文章中也提到过,不过没有以这个题目明确地点出来。
其实很简单,就是算一下这些数据从硬盘上取出来用的时间。除了个别按索引取数的运算外,绝大多数运算都会涉及对数据的整体遍历,比如分组汇总统计、按条件查询(非索引字段);那么,这些运算耗用的时间,无论如何不可能小于硬盘访问的时间,我们就能算出一个理论上的极限值。
比如,有人宣称实现10T数据的OLAP汇总只需要3秒。那么这意味着什么呢?
常见的15000转硬盘,在操作系统下的访问速度也就不到200M/秒,SSD会快一些,但也没数量级的提升,大概3秒读1G的样子。这样,从单块硬盘中读出10T数据就需要30000秒以上,如果想在3秒内完成汇总,那就需要1万块硬盘!作为用户,你是否做了这个准备呢?
当然,硬盘及硬盘在不同环境下的速度不尽相同,可能更快或更慢,但总之都可以用这个简单的办法去估算。不知道自家硬盘的速度?那弄个大文件读一下试试就知道了,拿到实验数据再去计算会更准确。要强调的是,不能简单地看硬盘厂商标称的性能指标,在文件系统下,那个理想值常常连一半都达不到,还是实测的最可靠。
这样,我们就能知道某个大数据问题最理想的情况能够达到什么性能,比这个指标还好的期望,在用于估算指标的硬件条件下都是不可能实现的,没有必要再去琢磨软件产品和技术方案了。
这种估算也指明了一个优化方向,就是减少存储量和访问量。
减少存储量当然不能减少数据本身,用于计算的数据一条也不能少,否则就出现错误结果。减少存储量要靠数据压缩的手段。10T的原始数据,如果有好的压缩手段,实际在硬盘上存储下来可能只有1T甚至更少,这时候3秒汇总这些数据就不再需要1万块硬盘了。
在存储量不能再减少的情况下,还有些软件手段来减少访问量,常用的方法就是列存。一个数据表有100列占了10T,如果只访问三列进行汇总,那大概只需要访问300G数据,这时候3秒完成汇总当然也不需要1万块硬盘了。
不过,大数据厂商在宣称10T、3秒这种性能指标时,一般不会明确指出采用压缩或列存技术后存储量和访问量能降到多少。这就容易给用户造成错觉,以为这个技术能够通用地解决大数据问题,而经常,有些数据的压缩率无法做得很高,对于访问列较多的运算列存也没啥优势。
要更准确地估算性能极限,也要考虑减少存储量和访问量的手段。尝试一下自己的数据能有多大的压缩率(用常规的zip软件就可以),并且检查运算是否是从很多列中取出很少列的情况。