Storm作者Nathan Marz的大作《Big Data: Principles and Best Practices of Scalable Realtime Data Systems》原版授权翻译,未经允许不得转载!
理解这本书中我们将使用的工具的背景是很有帮助的。技术上的众多趋势深深影响着你构建大数据系统的方式。
我们已经开始意识到单个CPU运行速度的物理限制。这意味着如果你想扩展到更多的数据,你必须要能够并行化计算。
这导致了无共享的并行算法和它们相应系统的增长,比如MapReduce。不只是试图通过购买更好的机器进行扩展,这被称为垂直扩展,而是通过添加更多的机器进行扩展,这被称为水平扩展。
技术上的另一个趋势是弹性云在不断崛起,也作为IaaS(Infrastructure as a Service)。Amazon Web Services (AWS)的基础设施就是最著名的弹性云。弹性云允许你根据需求租用硬件,而不是在自己的场地中拥有自己的硬件。弹性云几乎可以瞬间让你增加或减小集群的大小,所以如果你有一个大的作业要运行,你可以临时地分配硬件。
弹性云大大简化了系统管理。它们还提供额外的存储和硬件分配选项,可以显著降低基础设施的价格。例如,AWS有一个被称为现买现卖(spot instances)的特性,即你对实例进行投标而不是支付固定的价格。如果有人出价比你更高,你就会失去该实例。因为现买现卖特性可以随时消失,所以它们往往是明显低于正常价格的实例。类似MapReduce的分布式计算系统,由于在软件层处理容错性,所以它们是很好的选择。
在过去的几年里,开源社区创造了数量庞大的大数据技术。本书中所授的所有技术都是开源且免费使用的。
你将学习五类的开源项目。记住,这不是一本调查书——目的不是只教一堆技术。目标是学习基本原则,这样你将能够评估和选择适合你需求的工具:
■ 批处理计算系统——批处理计算系统是高吞吐量、高延迟的系统。批处理计算系统可以做几乎任意的计算,但是它们可能需要几小时或几天。我们将唯一使用的批处理计算系统是Hadoop。Hadoop项目有两个子项目:Hadoop分布式文件系统(HDFS)和Hadoop MapReduce。HDFS是分布式的、容错的存储系统,可以扩展到PB级别的数据。MapReduce是一个集成了HDFS、水平可扩展的计算框架。
■ 序列化框架——序列化框架为不同语言间使用对象提供了工具和库。它们可以将任何语言的对象序列化为一个字节数组,然后将字节数组反序列化成任何语言的对象。序列化框架提供一种模式定义语言(Schema Definition Language)来定义对象和对象的字段,它们为安全地版本化对象提供了机制,这样不用使现有对象无效就可以形成模式。三个著名的序列化框架是Thrift、Protocol Buffers和Avro。
■ 随机访问NoSQL数据库——在过去的几年里,已经创建了大量的NoSQL数据库。Cassandra、HBase、MongoDB、Voldemort、Riak、CouchDB和其他数据库,很难追踪所有这些数据库。这些数据库都有一个共同点:它们牺牲SQL的完整表达,而专注于某些特定类型的操作。它们都有不同的语义,且用于特定目的。它们不是作为任意的数据仓库被使用的。在许多方面,选择使用NoSQL数据库,就像在程序中,在散列映射(hash map),排序映射(sorted map),链表(linked list),或者向量(vector)之间选择使用数据结构一样。事先你要知道你想要做什么,然后恰当地选择。Cassandra将被用作我们构建的示例应用程序的一部分。
■ 消息/队列系统——消息/队列系统提供了一种方法,以容错和异步的方式在进程之间发送和使用消息。消息队列是进行实时处理的一个关键组件。在这本书中我们将使用Apache Kafka。
■ 实时计算系统——实时计算系统是高吞吐量、低延迟、流处理的系统。它们做不了批处理系统计算范围内的计算,但它们处理消息非常迅速。在本书中我们将使用Storm。Storm拓扑很容易编写和扩展。
因为这些开源项目已经成熟,围绕它们的公司已经成形并提供企业支持。例如,Cloudera提供Hadoop支持,Data Stax提供Cassandra支持。其他项目都是公司产品。例如,Riak是Basho科技的产品,MongoDB是10gen的产品,RabbitMQ是SpringSource的产品,它是VMWare的一个部门。