本节书摘来自华章出版社《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一书中的第1章,第1.1节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren) 著 马延辉 向 磊 魏东琦 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5 大数据系统应有的属性
你应该使大数据系统努力具备尽可能多的关于复杂性和可扩展性的属性。大数据系统不仅要运行良好、有效地使用资源,还必须易于推理。下面逐一介绍这些属性。
1.5.1 鲁棒性和容错性
面对分布式系统的挑战,构建“做正确的事”的系统并非易事。尽管会遇到机器随机出现故障、分布式数据库中一致性的复杂语义、重复的数据、并发性等问题,但系统仍需能够正确运行。这些挑战使得“推断系统在做什么”变得很难。使大数据系统具备鲁棒性的一部分工作是为了避免这些复杂性(挑战),以便你能很容易推断系统(即探索系统)。
正如之前所讨论的,系统必须是可以容忍人为错误的。这是系统中经常被忽视的属性,开发者应予以重视。在生产系统中,偶尔有人出差错是不可避免的,比如部署错误代码损坏了数据库中的值。如果你将不变性和重新计算性构建到大数据的核心系统中,那么该系统通过提供一个清晰、简单的恢复机制,就能很容易地适应人为错误。这些内容将在第2~7章中详细描述。
1.5.2 低延迟读取和更新
一方面,绝大多数的应用程序需要对读取操作有很低的延迟—这一时间通常是几毫秒到几百毫秒;另一方面,更新延迟的需求在不同应用程序之间有着很大的区别。一些应用程序需要更新操作立即传播,但其他应用程序延迟几个小时也是可以的。无论如何,大数据系统中如果需要低延迟更新,你就必须能够实现它。更重要的是,你需要在不影响系统鲁棒性的前提下,能够实现低延迟读取和更新。本书将从第12章开始介绍如何在速度层实现低延迟更新。
1.5.3 可扩展性
面对数据或负载的增加,可扩展性能够通过将资源添加到系统中来保持性能。Lambda架构在系统堆栈的所有层是水平可扩展的—扩展是通过添加更多的机器来实现的。
1.5.4 通用性
一个通用系统可以支持大多数应用程序。事实上,如果本书所述内容没有推及大多数的应用程序,那么它不会是非常有用的。因为Lambda架构是基于所有数据功能的,可以推广到所有应用程序,无论是财务管理系统、社交媒体分析、科学应用、社交网络,还是其他应用。
1.5.5 延展性
每次添加相关功能或对系统的工作方式做出一些改变时,你不需要重复劳动。具备可延展性的系统允许以最小的开发成本添加功能。
通常,一个新特性或一个现有功能的改变需要将旧数据迁移成新格式。系统具备可延展性的要素之一就是它容易实现大规模迁移。能够轻松、快捷地完成大规模迁移,是你将学习的方法的核心。
1.5.6 即席查询
几乎每个大型数据集中都有意料之外的值,因此,能够对数据进行即席(ad hoc)查询是非常重要的。此外,能够任意地挖掘数据集为业务优化和新的应用程序也提供了可能。最终,除非你可以问这些数据任意问题,否则你将不能利用数据发现有趣的事情。本书的第6章和第7章在讨论批处理时,将介绍进行即席查询的方法。
1.5.7 最少维护
维护是开发人员的重负,它是需要保持系统平稳运行的工作。包括预测什么时候添加用于扩展的机器、保持进程启动并运行以及调试生产环境中的任何错误。
减少维护的一个重要途径是选择实现复杂性尽量低的组件,即依赖底层具有简单机制的组件。特别是分布式数据库,它往往有着非常复杂的内部结构。系统越复杂,出错的可能性就越大,你越需要了解有关系统调试和优化的知识。
通过依靠简单的算法和组件,来降低实现复杂性,进而实现最少维护。Lambda架构采用的一个技巧是:将复杂性推出核心组件,并将其送到几小时后输出是可丢弃的系统的片段中。所使用的最复杂的组件,如读/写分布式数据库,在输出最终是可丢弃的这一层中。本书第12章在讨论速度层时将详细讨论该技术。
1.5.8 可调试性
一旦出错,大数据系统必须提供必要的信息来调试系统。关键是能够追踪系统中的每一个值,并能明确该值是如何产生的。
“可调试性”是在Lambda架构中通过批处理层的功能特性和尽可能使用重新计算算法来实现的。
将所有这些属性组合在同一个系统中实现,这看起来是一个令人生畏的挑战。但从基本原理出发,正如Lambda架构做的,这些属性将从最终的系统设计中自然而然地生成。
在深入介绍Lambda架构之前,我们来看更传统的架构—以依赖增量计算为特征—以及它们无法满足这些属性的原因。