《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一导读

简介: Preface 前  言 当第一次进入大数据的世界时,我仿佛置身于软件开发的美国西部荒原。许多人放弃了关系型数据库,转而选择带有高度受限模型的NoSQL数据库,主要是因为其使用体验良好、熟悉度较高且这种数据库可以扩展到成千上万台机器上。


a58a388ae6302e5d1751be35d4e22b2eae2cd180



前  言
当第一次进入大数据的世界时,我仿佛置身于软件开发的美国西部荒原。许多人放弃了关系型数据库,转而选择带有高度受限模型的NoSQL数据库,主要是因为其使用体验良好、熟悉度较高且这种数据库可以扩展到成千上万台机器上。NoSQL数据库的数量巨大,堪称铺天盖地,这些数据库中很多都只有细微的差别。一个名为“Hadoop”的新项目开始崭露头角,它宣称具备基于海量数据进行数据深度分析的能力。但弄清楚如何使用这些新工具很令人困惑。
当时,我正试图处理所在公司面临的扩展性问题。系统架构非常复杂—该Web系统包含共享关系型数据库、队列、工作节点、主节点和从节点。数据损坏渗透至数据库,为了处理这些损坏,我们使用了应用程序中的特殊代码,但从节点的操作总是落后于其他节点。我决定探索其他大数据技术,看看是否有比我们的数据架构更好的设计。
早期的软件工程职业生涯的经历,深刻影响了我对“系统该如何架构”的观点。我的一位同事花了几个星期将来自互联网的数据收集到一个共享文件系统。他在等待收集足够的数据,以便能在其上进行数据分析。有一天,在做一些日常维护时,我不小心删除了他的所有数据,导致他的项目延期了好几周。
我知道自己犯了一个大错,但作为一个软件工程师新手,我并不知道这会导致什么样的后果。我会不会因为粗心被解雇呢?我发了一封电子邮件向团队诚挚地道歉—让我惊喜的是,大家对此都表示非常同情。我永远不会忘记那个时刻—一个同事来到我的办公桌旁,拍着我的背说:“恭喜你!你现在是一个专业的软件工程师了!”
他玩笑式的表述道出了软件开发中不言而喻的“真理”—我们不知道如何创造完美的软件。软件可能有bug而且会被部署到生产中。如果应用程序可以写入数据库中,那么bug也可能写入数据库中。当着手重新设计我们的数据架构时,这样的经历深深地影响了我。我知道,新架构不但必须是可扩展的、对机器故障是可容错的,并且要易于推断故障原因—但对人为错误也可容错。
重构那套系统的经验,促使我走上了一条“在数据库和数据管理方面怀疑一切我认为是正确的”道路。我想出了一个基于不可变数据和批量计算的架构,令我很惊讶的是,与仅仅基于增量计算的系统相比,新系统要简单得多。一切都变得更容易,包括操作、不断发展的系统以支持新的功能、从人为错误中恢复和性能优化等方面。该方法很通用,似乎可以用于任何数据系统。
但有些事情困扰着我。当观察其他行业时,我发现几乎没有人使用类似的技术。相反,在使用基于增量更新数据库的庞大集群架构中,令人生畏的复杂性是为人所接受的。这些架构的许多复杂性已经通过我所开发的方法完全避免或大大缓减了。
在接下来的几年中,我扩展了该方法,并使之正式成为我戏称的Lambda架构。在初创公司BackType工作时,我们的5人团队构建了一个社会化媒体分析产品,该产品支持在超过100TB的数据上进行多样化实时分析。我们的小团队还负责拥有数百台机器的集群的管理部署、运营和系统监控。当我们向别人展示自己的产品时,他们对这个团队只有5个人感到非常惊讶。他们经常会问“这么几个人做了这么多事情?怎么可能!?”我的回答很简单:“不是我们在做什么,而是我们没有做什么。”通过使用Lambda架构,我们避免了困扰传统架构的复杂性。通过避免这些复杂性,我们大大提高了工作效率。
大数据运动只是放大了已经存在了几十年的数据架构的复杂性。主要基于增量更新的大型数据库架构将遭受这些复杂性的折磨,从而导致错误、繁重的操作,并阻碍了生产力。尽管SQL和NoSQL数据库通常被描述成对立或相互对偶的关系,但从最基本的方面来说,它们实际上是一样的。它们都鼓励使用这种相同的架构—该架构具有不可避免的复杂性。复杂性是一个邪恶的野兽,无论你承认与否,它都会“咬”你。
为了传播Lambda架构以及它如何避免传统架构的复杂性等知识,我写了本书。它是我开始从事大数据工作时就希望有的。我希望你把这本书作为一个旅程—挑战你以为自己已经知道的关于数据系统的知识,并发现从事大数据工作也可以优雅、简单和有趣。

Nathan Marz

目录
译 者 序
前  言
关于本书
致  谢
第1章 大数据的新范式
1.1  本书是如何组织的
1.2  扩展传统数据库
1.2.1 用队列扩展
1.2.2 通过数据库分片进行扩展
1.2.3 开始处理容错问题
1.2.4 损坏问题
1.2.5 到底是哪里出错了
1.2.6 大数据技术是如何起到帮助作用的
1.3  NoSQL不是万能的
1.4  基本原理
1.5  大数据系统应有的属性
1.5.1 鲁棒性和容错性
1.5.2  低延迟读取和更新
1.5.3 可扩展性
1.5.4 通用性
1.5.5 延展性
1.5.6 即席查询
1.5.7 最少维护
1.5.8 可调试性
1.6  全增量架构的问题
1.6.1 操作复杂性
1.6.2 实现最终一致性的极端复杂性
1.6.3 缺乏容忍人为错误
1.6.4 全增量架构解决方案与 Lambda架构解决方案
1.7  [Lambda架构]https://yq.aliyun.com/articles/89620)
1.7.1 批处理层
1.7.2 服务层
1.7.3 批处理层和服务层满足几乎所有属性
1.7.4 速度层
1.8  技术上的最新趋势
1.8.1 CPU并不是越来越快
1.8.2 弹性云
1.8.3 大数据充满活力的开源生态系统
1.9  示例应用:SuperWebAnalytics.com
1.10 总结
第一部分 批处理层
第2章 大数据的数据模型
2.1  数据的属性
2.1.1 数据是原始的
2.1.2 数据是不可变的
2.1.3 数据是永远真实的
2.2  基于事实的数据表示模型
2.2.1 事实的示例及属性
2.2.2 基于事实的模型的优势
2.3  图模式
2.3.1 图模式的元素
2.3.2 可实施模式的必要性
2.4 SuperWebAnalytics.com的完整数据模型
2.5 总结42
第3章大数据的数据模型:示例
3.1  为什么使用序列化框架
3.2  Apache Thrift
3.2.1 节点
3.2.2 边
3.2.3 属性
3.2.4 把一切组合成数据对象
3.2.5 模式演变
3.3  序列化框架的局限性
3.4  总结
第4章 批处理层的数据存储
4.1 主数据集的存储需求
4.2 为批处理层选择存储方案
4.2.1 使用键/值存储主数据集
4.2.2 分布式文件系统
4.3 分布式文件系统是如何工作的
4.4 使用分布式文件系统存储主数据集
4.5 垂直分区
4.6 分布式文件系统的底层性质
4.7 在分布式文件系统上存储SuperWebAnalytics.com的主数据集
4.8 总结
第5章 批处理层的数据存储:示例
5.1 使用HDFS
5.1.1 小文件问题
5.1.2 转向更高层次的抽象
5.2 使用Pail在批处理层存储数据
5.2.2 序列化对象到Pail中
5.2.3 使用Pail进行批处理操作
5.2.4 使用Pail进行垂直分区
5.2.5 Pail文件格式与压缩
5.2.6 Pail优点的总结
5.3 存储SuperWebAnalytics.com的主数据集
5.3.1 Thrift对象的结构化Pail
5.3.2 SuperWebAnalytics.com的基础Pail
5.3.3 用于垂直分区数据集的分片Pail
5.4 总结
第6章 批处理层
6.1 启发性示例
6.1.1 给定时间范围内的页面浏览量
6.1.2 性别推理
6.1.3 影响力分数
6.2 批处理层上的计算
6.3 重新计算算法与增量算法
6.3.1 性能
6.3.2 容忍人为错误
6.3.3 算法的通用性
6.3.4 选择算法的风格
6.4 批处理层中的可扩展性
6.5 MapReduce:一种大数据计算的范式
6.5.1 可扩展性
6.5.2 容错性
6.5.3 MapReduce的通用性
6.6 MapReduce的底层特性
6.6.1 多步计算很怪异
6.6.2 手动实现连接非常复杂
6.6.3 逻辑和物理执行紧密耦合
6.7 管道图—一种关于批处理计算的高级思维方式
6.7.1 管道图的概念
6.7.2 通过MapReduce执行管道图
6.7.3 合并聚合器
6.7.4 管道图示例
6.8 总结
第7章 批处理层:示例
7.1 一个例证
7.2 数据处理工具的常见陷阱
7.2.1 自定义语言
7.2.2 不良的可组合抽象
7.3 JCascalog介绍
7.3.1 JCascalog的数据模型
7.3.2 JCascalog查询的结构
7.3.3 查询多个数据集
7.3.4 分组和聚合器
7.3.5 对一个查询示例进行单步调试
7.3.6 自定义谓词操作
7.4 组合
7.4.1 合并子查询
7.4.2 动态创建子查询
7.4.3 谓词宏
7.4.4 动态创建谓词宏
7.5 总结
第8章 批处理层示例:架构和算法
8.1 SuperWebAnalytics.com批处理层的设计
8.1.1 所支持的查询
8.1.2 批处理视图
8.2 工作流概述
8.3 获取新数据
8.4 URL规范化
8.5 用户标识符规范化
8.6 页面浏览去重
8.7 计算批处理视图
8.7.1 给定时间范围内的页面浏览量
8.7.2 给定时间范围内的独立访客
8.7.3 跳出率分析
8.8 总结
第9章 批处理层示例:实现
9.1 出发点
9.2 准备工作流
9.3 获取新数据
9.4 URL规范化
9.5 用户标识符规范化
9.6 页面浏览去重
9.7 计算批处理视图
9.7.1 给定时间范围内的页面浏览量
9.7.2 给定时间范围内的独立访客
9.7.3 跳出率分析
9.8 总结
第二部分 服务层
第10章 服务层概述
10.1 服务层的性能指标
10.2 规范化/非规范化问题的服务层解决方案
10.3 服务层数据库的需求
10.4 设计SuperWebAnalytics.com的服务层
10.4.1 给定时间范围内的页面浏览量
10.4.2 给定时间范围内的独立访客
10.4.3 跳出率分析
10.5 对比全增量的解决方案
10.5.1 给定时间范围内的独立访客的全增量方案
10.5.2 与Lambda架构解决方案的比较
10.6 总结
第11章 服务层:示例
11.1 ElephantDB的基本概念
11.1.1 ElephantDB中的视图创建
11.1.2 ElephantDB中的视图服务
11.1.3 使用ElephantDB
11.2 创建SuperWebAnalytics.com的服务层
11.2.1 给定时间范围内的页面浏览量
11.2.2 给定时间范围内的独立访客数量
11.2.3 跳出率分析
11.3 总结
第三部分 速度层
第12章 实时视图
12.1 计算实时视图
12.2 存储实时视图
12.2.1 最终一致性
12.2.2 速度层中存储的状态总量
12.3 增量计算的挑战
12.3.1 CAP原理的有效性
12.3.2 CAP原理和增量算法之间复杂的相互作用
12.4 异步更新与同步更新
12.5 过期实时视图
12.6 总结
第13章 实时视图:示例
13.1 Cassandra的数据模型
13.2 使用Cassandra
13.3 总结
第14章 队列和流处理
14.1 队列
14.1.1 单消费者队列
14.1.2 多消费者队列
14.2 流处理
14.2.1 队列和工作节点
14.2.2 队列和工作节点的缺陷
14.3 更高层次的一次一个的流处理
14.3.1 Storm模型
14.3.2 保证消息处理
14.4 SuperWebAnalytics.com速度层
14.5 总结
第15章 队列和流处理:示例
15.1 使用Apache Storm定义拓扑结构
15.2 Apache Storm集群及其部署
15.3 保证消息处理
15.4 实现SuperWebAnalytics.com给定时间范围内的独立访客的速度层3
15.5 总结
第16章 微批量流处理
16.1 实现有且仅有一次语义
16.1.1 强有序处理
16.1.2 微批量流处理
16.1.3 微批量流处理的拓扑结构
16.2 微批量流处理的核心概念
16.3 微批量流处理的扩展管道图
16.4 完成SuperWebAnalytics.com的速度层
16.4.1 给定时间范围内的页面浏览量
16.4.2 跳出率分析
16.5 另一个跳出率分析示例
16.6 总结
第17章 微批量流处理:示例
17.1 使用Trident
17.2 完成SuperWebAnalytics.com的速度层
17.2.1 给定时间范围内的页面浏览量
17.2.2 跳出率分析
17.3 完全容错、基于内存及微批量处理
17.4 总结
第18章 深入Lambda架构
18.1 定义数据系统
18.2 批处理层和服务层
18.2.1 增量的批处理
18.2.2 测量和优化批处理层的资源使用
18.3 速度层
18.4 查询层
18.5 总结

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
25天前
|
存储 大数据 数据处理
PHP 与大数据:构建高效数据处理系统
传统的数据处理系统往往难以应对大规模数据的处理需求,而PHP作为一种常用的服务器端脚本语言,在数据处理方面也有其独特的优势。本文将探讨如何利用PHP构建高效的大数据处理系统,结合实际案例分析其应用场景及优势所在。
15 2
|
4月前
|
SQL Oracle 物联网
助力工业物联网,工业大数据之数仓维度层DWS层构建【十二】
助力工业物联网,工业大数据之数仓维度层DWS层构建【十二】
47 0
|
4月前
|
SQL Oracle 关系型数据库
助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】
助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】
47 0
|
4月前
|
存储 分布式计算 负载均衡
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
59 0
|
4月前
|
存储 分布式计算 Hadoop
【大数据技术Hadoop+Spark】HDFS概念、架构、原理、优缺点讲解(超详细必看)
【大数据技术Hadoop+Spark】HDFS概念、架构、原理、优缺点讲解(超详细必看)
121 0
|
16天前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
56 1
|
1月前
|
SQL 存储 监控
构建端到端的开源现代数据平台
构建端到端的开源现代数据平台
54 4
|
1月前
|
人工智能 DataWorks 数据可视化
心动基于阿里云DataWorks构建游戏行业通用大数据模型
心动游戏在阿里云上构建云原生大数据平台,基于DataWorks构建行业通用大数据模型,如玩家、产品、SDK、事件、发行等,满足各种不同的分析型应用的要求,如AI场景、风控场景、数据分析场景等。
335 1
|
2月前
|
SQL 并行计算 大数据
【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)
关于Flink服务的搭建与部署,由于其涉及诸多实战操作而理论部分相对较少,小编打算采用一个独立的版本和环境来进行详尽的实战讲解。考虑到文字描述可能无法充分展现操作的细节和流程,我们决定以视频的形式进行分析和介绍。因此,在本文中,我们将暂时不涉及具体的搭建和部署步骤。
497 3
【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)
|
2月前
|
存储 数据可视化 JavaScript
基于Echarts构建大数据招聘岗位数据可视化大屏
基于Echarts构建大数据招聘岗位数据可视化大屏
59 0

热门文章

最新文章