最近在网上又看到有关于Hadoop适用性的讨论[1]。想想今年大数据技术开始由互联网巨头走向中小互联网和传统行业,估计不少人都在考虑各种“纷繁复杂”的大数据技术的适用性的问题。这儿我就结合我这几年在Hadoop等大数据方向的工作经验,与大家讨论一下HadoopSparkHBaseRedis等几个主流大数据技术的使用场景(首先声明一点,本文中所指的Hadoop,是很“狭义”的Hadoop,即在HDFS上直接跑MapReduce的技术,下同)。

我这几年实际研究和使用过大数据(包含NoSQL)技术包括HadoopSparkHBaseRedisMongoDB等,这些技术的共同特点是不适合用于支撑事务型应用,特别是与“钱”相关的应用,如“订购关系”、“超市交易”等,这些场合到目前为止还是Oracle等传统关系型数据库的天下。

先说Hadoop/MapReduceSpark,他们俩最适合的都是做离线型的数据分析,但Hadoop特别适合是单次分析的数据量“很大”的情景,而Spark则适用于数据量不是很大的情景。这儿所说的“很大”,是相对于整个集群中的内存容量而言的,因为Spark是需要将数据HOLD在内存中的。一般的,1TB以下的数据量都不能算很大,而10TB以上的数据量都是算“很大”的。比如说,20个节点的一个集群(这样的集群规模在大数据领域算是很小的了),每个节点64GB内存(不算很小,但也不能算大),共计1.28TB。让这样规模的一个集群把500GB左右的数据HOLD在内存中还是很轻松的。这时候,用Spark的执行速度都会比Hadoop快,毕竟在MapReduce过程中,诸如spill等这些操作都是需要写磁盘的。

这儿有2点需要提一下:1)一般情况下,对于中小互联网和企业级的大数据应用而言,单次分析的数量都不会“很大”,因此可以优先考虑使用Spark,特别是当Spark成熟了以后(Hadoop已经出到2.5了,而Spark才刚出1.0呢)。比如说,中国移动的一个省公司(在企业级,移动公司的数据量还是算相当大的),他们单次分析的数量一般也就几百GB,连1TB都很少超过,更不用说超过10TB了,所以完全可以考虑用Spark逐步替代Hadoop2)业务通常认为Spark更适用于机器学习之类的“迭代式”应用,但这仅仅是“更”。一般地,对于中等规模的数据量,即便是不属于“更适合”范畴的应用,Spark也能快25倍左右。我自己做过一个对比测试,80GB的压缩数据(解压后超过200GB),10个节点的集群规模,跑类似sumgroup-by的应用,MapReduce花了5分钟,而spark只需要2分钟。

【待续】

 

1. Hadoop虽然强大,但不是万能的。http://database.51cto.com/art/201402/429789.htm