亚马逊还是不断创新,每年召开 reInvent 大会推广新的云产品和分享成功案例,在这里面我随便说几个,像 S3 是简单面向对象的存储,DynamoDB 是对关系型数据库的补充,Glacier 对冷数据做归档处理,Elastic MapReduce 直接对 MapReduce 做打包提供计算服务,EC2 就是基础的虚拟主机,Data Pipeline 会提供图形化界面直接串联工作任务。
这边还可以说一下 Redshift,它是一种(Massively Parallel Computer)架构,是非常方便的数据仓库解决方案,就是 SQL 接口,跟各个云服务无缝连接,最大特点就是快,在 TB 到 PB 级别非常好的性能,我在工作中也直接使用,它还支持不同硬件平台,如果想速度更快,可以使用 SSD 的,当然支持容量就小些。
在数据库领域,我就列出三种代表,一类是关系型数据库管理系统,它的特点是 A(Atomic)、C(consistent)、I(isolation)、D(duration),连起来就是 ACID(酸)。简单说,就是支持事务回滚和外键关联,而 NoSQL 是与之对应的 Base(碱),所谓 Basic 可用,为了扩大 Scale,牺牲一些一致性和事务。而谷歌提出 F1,希望解决在大规模数据同时还要做到事务强一致性。在这里面都是非常常见的 NoSQL, 这些公司可能你都没听过,但它们都是融资过亿,估值都非常高,在几个 Billion 以上。
我会花一些篇幅介绍 Hadoop,首先看 Hadoop 从哪里开始的,不得不提谷歌的先进性,在 10 多年前,谷歌出了 3 篇论文论述分布式系统的做法,分别是 GFS、MapReduce、BigTable,非常牛逼的系统,但没人见过,在工业界很多人痒痒的,就想按其思想去仿作。
当时,Apache Nutch Lucene 作者 Doug Cutting 也是其中之一,后来他们被雅虎收购,专门成立团队去投入做,就是 Hadoop 的开始和大规模发展的地方,之后随着雅虎衰落,牛人去了 Facebook、谷歌,也有成立 Cloudera、Hortonworks 等大数据公司,把 Hadoop 的实践带到各个硅谷公司。
而谷歌还没停止,又出了新的三辆马车:Pregel、Caffeine 和 Dremel,后来又有很多步入后尘,开始新一轮开源大战。
那么为啥 Hadoop 就比较适合做大数据呢?首先扩展很好,直接通过加节点就可以把系统能力提高,它有个重要思想是:移动计算而不是移动数据,因为数据移动是很大的成本需要网络带宽。
其次,它提出的目标就是利用廉价普通计算机(硬盘),这样虽然可能不稳定(磁盘坏的几率),但通过系统级别上的容错和冗余达到高可靠性。并且非常灵活,可以使用各种data,二进制、文档型、记录型。使用各种形式(结构化、半结构化、非结构化所谓的schemaless),在按需计算上也是个技巧。
另一个问题,我们提到 Hadoop 一般不会说某个东西,而是指生态系统,在这里面太多交互的组件了,涉及到 IO、处理、应用、配置、工作流。在真正的工作中,当几个组件互相影响,你的头疼的维护才刚刚开始。
我也简单说几个:Hadoop Core 就三个 HDFS、MapReduce、Common,在外围有 NoSQL: Cassandra、HBase,有 Facebook 开发的数据仓库 Hive,有雅虎主力研发的 Pig 工作流语言,有机器学习算法库 Mahout,工作流管理软件 Oozie,在很多分布式系统选择 Master 中扮演重要角色的 Zookeeper.
下面是 Hortonworks 提出的数据平台,这个公司比较强势,它有最多的 Hadoop Committee 成员,是真正的标准制定者,而 2.0 就是由它们提出。
在 Hadoop 1.0 前,是 0.16 到 0.19、0.20,还有一只是 0.23 进化成现在的 2.0,应该说,现在大致都被 2.0 取代了,主要区别是 1.0 只能支持 MapReduce 框架、资源和数据处理限制在一起。
而 2.0 首先抽象出 Yarn 这个资源管理器,然后上层可以支持各种插件机制,便于扩展,Hortonworks 还研发了 Tez 作为加速引擎把一些相关任务合并共享或者并行来优化。
下面这个是英特尔给出的 Hadoop Stack,英特尔也是个对技术前沿由追求的公司,虽然它主业是处理器,但在互联网的时代,为抓住一些软件机会,它们也在积极融合,为生态系统做贡献。
另外,Cloudera 是老牌 Hadoop 公司,成立 7、8 年了,当年 Hadoop 之父就是在那做首席架构,它提出的 CDH 版本是很多公司的稳定 Hadoop 版本,一般公司也不会自己去搭 Hadoop 最新版,否则出了 Bug 会很痛苦,它提供了一个打包方便部署。
涉及技术细节甚至源代码
下面内容涉及技术细节甚至源代码,可能有些枯燥,我也尽量深入浅出。我们先说 HDFS,所谓 Hadoop 的分布式文件系统,它是能真正做到高强度容错。并且根据 locality 原理,对连续存储做了优化。
简单说,就是分配大的数据块,每次连续读整数个。如果让你自己来设计分布式文件系统,在某机器挂掉还能正常访问该怎么做?首先需要有个 master 作为目录查找(这里就是 Namenode),那么数据节点是作为分割好一块块的,同一块数据为了做备份不能放到同一个机器上,否则这台机器挂了,你备份也同样没办法找到。
HDFS 用一种机架位感知的办法,先把一份拷贝放入同机架上的机器,然后在拷贝一份到其他服务器,也许是不同数据中心的,这样如果某个数据点坏了,就从另一个机架上调用,而同一个机架它们内网连接是非常快的,如果那个机器也坏了,只能从远程去获龋这是一种办法,现在还有基于 erasure code 本来是用在通信容错领域的办法,可以节约空间又达到容错的目的,大家感兴趣可以去查询。
接着说 MapReduce,首先是个编程范式,它的思想是对批量处理的任务,分成两个阶段,所谓的 Map 阶段就是把数据生成 key、value pair 再排序,中间有一步叫 shuffle,把同样的 key 运输到同一个 reducer 上面去,而在 reducer 上,因为同样 key 已经确保在同一个上,就直接可以做聚合,算出一些 sum, 最后把结果输出到 HDFS 上。对应开发者来说,你需要做的就是编写 Map 和 reduce 函数,像中间的排序和 shuffle 网络传输,容错处理,框架已经帮你做好了。但据说,谷歌内部早不用这种,又有新的强大工具出现了。