数据处理一般意义而言,具有三种不同的风格:
今天要聊的批处理,在前些年,有个忽悠人的外号,就是所谓的大数据。最经典的处理模式就是MapReduce,它起源于谷歌的《MapReduce:Simplified DataProcessing on Large Cluster》,初起风光,花式刷论文灌水,但是MapReduce饱受诟病,因为这是一个相当低层次的编程模型,类似于sql语句的group by。Hadoop的MapReduce作为一个逐渐走向没落的编程模型,我们学习更应该是其体现的理念,比如和Unix一样的,采用了统一的接口,对logic和wiring的分离。
让我们来简单看看Hadoop及其分布式文件系统,可以这么说,谷歌在04年发的那三篇论文最为核心的就是GFS,开源版本HDFS。HDFS的核心就是shared-nothing架构,通过网络来交流,使用NameNode作为leader,为了防止宕机,使用了block块存储在多个机器之上。更具体的细节,可以参考谷歌的那篇论文。说完了HDFS,我们再简单看看Map Reduce的执行模式:
整个的处理模型是相当简单的,值得注意的点可能就是是将运算移动到对应的机器上,而不是移动数据。这也是所有分布式计算应该遵守的原则。
现在再来看看更值得注意的join。Join是再数据处理当中最常见的运算符,可以将两张表根据相同的键将数据聚合起来。那么Map Reduce的实现呢?可以大致的分为在Reduce端join,Map端聚合。
说了这么多,最后再看看HDFS和分布式数据库的区别。
Hadoop的数据存储只需要byte sequence,可以使用任何数据模型和编码,而分布式数据库,则是针对特定数据模型的结构化的数据。
2.数据处理模型
Hadoop给与了工程师更大的权力选择独有的程序处理数据,但是分布式数据库则是独揽一切,只对外提供SQL接口。
其实Map Reduce不是很完美的模型,每个的Map Reduce都是独立的程序,中间的工作流需要自己组织,但是到后来,为了更适应迭代,spark之类的相对比较新的框架提出了dataflow的概念,将一系列的程序组织起来优化,为了解决fault的问题,使用的是重新计算而不是retry的方式。
这篇文章其实写的并不怎么好,因为这个话题更多的是工程的问题,数据模型其实是相当老的,所以值得讨论的点并不多。