MPP 与 Hadoop是什么关系?
1. hadoop(hive)跟mpp的本质区别是什么,这个有的时候界限很模糊,比如说存储,如果我把mpp的存储架在hdfs上,那存储模型就没有区别了,所以地下我打算还是用比较传统的认知来作区别。
2. hive跟mpp的存储模型不一样,hive用的hdfs,而mpp需要自己做切分,自己做切分就带来动态调整的问题,hdfs的扩展是通过元数据来做的,他有中心节点用来存元数据,在加入新的节点的时候,只需要修改元数据就可以了,所以hdfs的扩展能力是受到管理元数据那台机器的性能限制的,一般来说可以到10k这个规模,再向上就不行了。但是mpp通常采用的是没有中心节点的存储模型,比如hash,你每次增加节点的时候,都需要rehash,这样当规模到了几百台的时候,扩展能力就下来了。当然,现在可以把存储架在hdfs上,这样在存储上就没有太大区别了。
3. hive跟mpp的内存管理方式不大一样,mpp内存管理比较精细,他主要的想法是在每个机器上放个数据库,传统数据库的内存管理比较复杂,主要是内外存交互的东西,这样的架构决定了mpp在小数据量的时候,latency可以做的比较小,但是在大数据量的时候,throughput做不上去。而hive的内存管理非常粗放,他后来就是mapreduce的job,mr的job是没有太多精细的内存管理的,他就是拼了命地scan,完了顶多就是个spill,这样的架构导致throughput很大,但是latency很高,当你集群规模很大的时候,你一般会追求很大的throughput,当数据量很大的时候,如果你用mpp那种传统的内存管理的话,大批量的计算反而会慢,而且更加占资源,所以vertica这种一开始就考虑了列式存储就是这个道理。
4.事务,你可以认为hive不支持传统意义上的那种高并发的事务,而mpp试图想要支持,一旦你要上分布式事务,基本上你的可扩展性就上不去了,至于为啥,陈皓有一篇文章写的不错,建议看下。hive的ddl是可以多个并发的,但是dml不行,而ddl他是通过传统的数据库去做的,所以这个也是个中心节点,dml不行的话,就决定了他可以在底层跑mr这么重粒度的东西,他跑的时候,会在整个表上面加一把大锁。
5.failover机制,hive的failover就是mr的failover,job挂掉了重新换机器跑就完了,但是mpp如果采用传统架构的话,他的计算是要attach到数据节点上去的,如果你规模上去,那么fail的可能性就上去了,这样如果你每次计算都有台机器挂了,你一挂,别人就要等你,而不是换台机器继续跑,那么这个也限制了可扩展性,当然,如果mpp在底层用了统一的存储,完了计算也可以到处转移,再想个办法把中间状态记录下来,也可以扩展(这个实际上就是sparksql)