本书以Spark 0.9版本为基础进行编写,是一本全面介绍Spark及Spark生态圈相关技术的书籍,是国内首本深入介绍 Spark 原理和架构的技术书籍。主要内容有 Spark 基础功能介绍及内部重要模块分析,包括部署模式、调度框架、存储管理以及应用监控;同时也详细介绍了 Spark 生态圈中其他的软件和模块,包括 SQL 处理引擎 Shark 和 Spark SQL、流式处理引擎 Spark Streaming、图计算框架 Graphx 以及分布式内存文件系统 Tachyon。本书从概念和原理上对 Spark 核心框架和生态圈做了详细的解读,并对 Spark 的应用现状和未来发展做了一定的介绍,旨在为大数据从业人员和 Spark爱好者提供一个更深入学习的平台。
本书适合任何大数据、Spark 领域的从业人员阅读,同时也为架构师、软件开发工程师和大数据爱好者展现了一个现代大数据框架的架构原理和实现细节。相信通过学习本书,读者能够熟悉和掌握 Spark 这一当前流行的大数据框架,并将其投入到生产实践中去。
全球首部全面介绍Spark及Spark生态圈相关技术的技术书籍俯览未来大局,不失精细剖析,呈现一个现代大数据框架的架构原理和实现细节透彻讲解Spark原理和架构,以及部署模式、调度框架、存储管理及应用监控等重要模块Spark生态圈深度检阅:SQL处理Shark和Spark SQL、流式处理Spark Streaming、图计算Graphx及内存文件系统Tachyon
夏俊鸾 现任阿里巴巴数据平台部高级技术专家,Apache Spark项目Committer,曾就职于英特尔亚太研发中心,微博账号@Andrew-Xia。
刘旭晖 现任蘑菇街数据平台资深架构师(花名天火),曾就职于英特尔亚太研发中心大数据软件部,Spark/Hadoop/Hbase/Phoenix 等众多大数据相关开源项目的积极贡献者。乐于分享,著有CSDN博客 blog.csdn.net/colorant。
邵赛赛 英特尔亚太研发有限公司开发工程师,专注于大数据领域,开源爱好者,现从事Spark相关工作,Spark代码贡献者。
程浩 英特尔大数据技术团队软件工程师,Shark和Spark SQL活跃开发者,致力于SQL on Big Data的性能调优与优化。
史鸣飞 英特尔亚太研发有限公司大数据软件部工程师,专注于大数据领域,主要从事Spark及相关项目的开发及应用,Spark及Shark代码贡献者,现在主要投身于Tachyon项目的开发。
黄洁 目前就职于英特尔亚太研发中心大数据技术中心,担任高级软件工程师,致力于大数据技术的性能优化及开发工作,涉及Hadoop、Spark、HBase等开源项目。在多年的工作过程中,积累了一定的分布式大数据框架性能调优经验,并且是Apache Chukwa项目的PMC成员和Committer。在此之前,毕业于上海交通大学并获硕士及学士学位。
第1章 Spark系统概述 15
1.1 大数据处理框架 15
1.2 Spark大数据处理框架 17
1.2.1 RDD表达能力 17
1.2.2 Spark子系统 18
1.3 小结 21
第2章 Spark RDD及编程接口 23
2.1 Spark程序“Hello World” 23
2.2 Spark RDD 26
2.2.1 RDD分区(Partition)27
2.2.2 RDD优先位置(preferredLocations)28
2.2.3 RDD依赖关系(Dependencies)29
2.2.4 RDD分区计算(Compute) 34
2.2.5 RDD分区函数(partitioner)35
2.3 创建操作 39 第1章 Spark系统概述 15
1.1 大数据处理框架 15
1.2 Spark大数据处理框架 17
1.2.1 RDD表达能力 17
1.2.2 Spark子系统 18
1.3 小结 21
第2章 Spark RDD及编程接口 23
2.1 Spark程序“Hello World” 23
2.2 Spark RDD 26
2.2.1 RDD分区(Partition)27
2.2.2 RDD优先位置(preferredLocations)28
2.2.3 RDD依赖关系(Dependencies)29
2.2.4 RDD分区计算(Compute) 34
2.2.5 RDD分区函数(partitioner)35
2.3 创建操作 39
2.3.1 集合创建操作 39
2.3.2 存储创建操作 40
2.4 转换操作 42
2.4.1 RDD 基本转换操作 42
2.4.2 键值RDD 转换操作 52
2.4.3 再论RDD 依赖关系 59
2.5 控制操作(control operation) 61
2.6 行动操作(action operation) 63
2.6.1 集合标量行动操作 63
2.6.2 存储行动操作 68
2.7 小结 72
第3 章 Spark 运行模式及原理 74
3.1 Spark 运行模式概述 74
3.1.1 Spark 运行模式列表74
3.1.2 Spark 基本工作流程 75
3.1.3 相关基本类 77
3.2 Local 模式 80
3.2.1 部署及程序运行80
3.2.2 内部实现原理 80
3.3 Standalone 模式 81
3.3.1 部署及程序运行 81
3.3.2 内部实现原理 85
3.4 Local-cluster 模式 86
3.4.1 部署及程序运行 86
3.4.2 内部实现原理 86
3.5 Mesos 模式 87
3.5.1 部署及程序运行 87
3.5.2 内部实现原理 88
3.6 Yarn standalone / Yarn cluster 模式 91
3.6.1 部署及程序运行 91
3.6.2 内部实现原理 93
3.7 Yarn Client 模式 94
3.7.1 部署及程序运行 94
3.7.2 内部实现原理 95
3.8 各种模式的实现细节比较 96
3.8.1 环境变量的传递 97
3.8.2 Jar 包和各种依赖文件的分发 99
3.8.3 任务管理和序列化 101
3.8.4 用户参数配置 102
3.8.5 用户及权限控制 103
3.9 Spark 1.0 版本之后的变化 104
3.10 小结 105
第4 章 Spark 调度管理原理 106
4.1 Spark 作业调度管理概述 106
4.2 Spark 调度相关基本概念 107
4.3 作业调度模块顶层逻辑概述 108
4.4 作业调度具体工作流程 112
4.4.1 调度阶段的拆分113
4.4.2 调度阶段的提交 117
4.4.3 任务集的提交 119
4.4.4 完成状态的监控 119
4.4.5 任务结果的获取 121
4.5 任务集管理模块详解 122
4.6 调度池和调度模式分析 124
4.7 其他调度相关内容 126
4.7.1 Spark 应用之间的调度关系 126
4.7.2 调度过程中的数据本地性问题 127
4.8 小结 127
第5章 Spark 的存储管理 128
5.1 存储管理模块整体架构 128
5.1.1 通信层架构 129
5.1.2 通信层消息传递 132
5.1.3 注册存储管理模块 133
5.1.4 存储层架构 134
5.1.5 数据块 (Block) 136
5.2 RDD 持久化 137
5.2.1 RDD 分区和数据块的关系 137
5.2.2 内存缓存 138
5.2.3 磁盘缓存 139
5.2.4 持久化选项 141
5.2.5 如何选择不同的持久化选项 142
5.3 Shuffle 数据持久化 143
5.4 广播(Broadcast)变量持久化 146
5.5 小结 146
第6 章 Spark 监控管理 148
6.1 UI 管理 148
6.1.1 实时UI 管理 149
6.1.2 历史UI 管理 154
6.2 Metrics 管理 155
6.2.1 Metrics 系统架构 156
6.2.2 Metrics 系统配置 157
6.2.3 输入源(Metrics Source)介绍 159
6.2.4 输出方式(Metrics Sink)介绍 160
6.3 小结 162
第7 章 Shark 架构与安装配置 163
7.1 Shark 架构浅析 164
7.2 Hive/Shark 各功能组件对比分析 165
7.2.1 MetaStore 165
7.2.2 CLI/ Beeline 165
7.2.3 JDBC/ODBC 166
7.2.4 HiveServer/2 与 SharkServer/2 166
7.2.5 Driver 167
7.2.6 SQL Parser 168
7.2.7 查询优化器(Query Optimizer)169
7.2.8 物理计划与执行 169
7.3 Shark 安装配置与使用 171
7.3.1 安装前准备工作 171
7.3.2 不同运行模式下的安装Shark 172
7.3.2.1 单机运行模式 172
7.3.2.2 集群运行模式 172
7.3.2.3 运行在亚马逊AWS 174
7.4 Shark SQL 命令行工具(CLI)174
7.5 使用Shark Shell 178
7.6 启动SharkServer 178
7.7 SharkServer2 配置与启动 179
7.8 缓存数据表 180
7.8.1 数据缓存级别 180
7.8.2 创建不同缓存级别的Shark 数据表 180
7.8.3 指定数据表缓存策略 181
7.8.4 使用Tachyon 182
7.9 常见问题分析 182
7.9.1 OutOfMemory 异常 183
7.9.2 数据处理吞吐量低 183
7.9.3 Shark 查询比Hive 慢 184
7.10 小结 184
第8 章 Shark 程序开发与扩展 186
8.1 SQL API 186
8.1.1 JDBC 接口访问Shark 187
8.1.2 ODBC 接口访问Shark 188
8.1.3 sql2rdd API 188
8.2 扩展Shark 191
8.2.1 ObjectInspector 介绍 191
8.2.2 自定义函数 195
8.3 SerDe 自定义数据存取格式 218
8.4 StorageHandler 自定义数据存取 219
8.5 小结 221
第9 章 Spark SQL 222
9.1 逻辑架构 222
9.1.1 Catalyst 功能边界 223
9.1.2 SQL 解析阶段 224
9.1.3 逻辑计划元数据绑定和语义分析阶段 224
9.1.4 逻辑计划优化优化阶段 224
9.1.5 物理计划生成阶段 225
9.1.6 Shark 和Spark SQL 对比 225
9.2 Catalyst 上下文(Context) 226
9.2.1 SQLContext 227
9.2.2 HiveContext 228
9.3 SQL API 228
9.3.1 构建/使用SQLContext 和HiveContext 229
9.3.2 SchemaRDD 229
9.3.3 Row 对象 232
9.3.4 数据类型 233
9.3.5 DSL API 举例 233
9.3.6 表达式计算 235
9.3.7 Parquet 列式存储文件 237
9.3.8 代码演示 238
Spark 与大数据开源技术
11
9.4 Java API 241
9.5 小结 241
第10 章 Spark Streaming 242
流数据处理框架 242
10.1 快速入门 243
10.2 SparkStreaming 基本概念 245
10.2.1 链接和初始化 245
10.2.2 时间和窗口概念 246
10.2.3 DStream 原理 248
10.2.4 DStream 输入源 249
10.2.5 DStream 操作 250
10.2.6 DStream 持久化 253
10.3 性能调优 253
10.3.1 运行时间优化 253
10.3.2 内存使用优化 254
10.4 容错处理 255
10.4.1 工作节点失效 255
10.4.2 驱动节点失效 256
10.5 DStream 作业的产生和调度 258
10.5.1 作业产生 258
10.5.2 作业调度 259
10.5.3 Streaming 作业与Spark 作业之间的关系 260
10.6 DStream 与RDD 之间关系 262
10.7 数据接收原理 264
10.8 自定义数据输入源 268
10.9 自定义监控接口(StreamingListener) 270
10.10 Spark Streaming 案例分析 271
10.11 小结 273
第11 章 275
GraphX 计算框架 275
11.1 图并行计算 275
11.1.1 数据并行与图并行计算 275
11.1.2 图并行计算框架简介 276
11.1.3 GraphX 简介 280
11.2 Graphx 模型设计280
11.2.1 数据模型 280
11.1.2 图计算接口 281
11.3 GraphX 模型实现 285
11.3.1 图的分布式存储 285
11.3.2 图操
序
2009年的时候,Netflix公司举办了一个叫作Netflix Prize的推荐算法比赛。这个比赛匿名公布了Netflix五十万用户对近两万部电影的一亿个评分数据,希望参赛者能够开发出更好的推荐算法,以提高推荐系统的质量。这个比赛的奖金有一百万美元。一百万美元看似很多,但是和一个更好的推荐算法给Netflix带来的效益相比,实则九牛一毛。
高昂的奖金和Netflix提供的真实数据吸引了不少的参赛者,其中也包括了来自加州大学伯克利分校(UC Berkeley)的博士生Lester Mackey。Lester师从机器学习领域泰斗Michael Jordan,在一个叫作AMPLab的大数据实验室里进行博士研究。AMPLab和大多数学术界实验室不同的地方在于实验室内有多个教授和他们带领的学生一起合作。这些研究人员来自不同的领域,包括机器学习、数据库、计算机网络、分布式系统等。当时,要想提高算法研究迭代的效率,需要利用多台机器的分布式建模。在尝试了当时业界最流行的Hadoop MapReduce后,Lester发现自己的时间并不是花在提高算法效率上,而是耗费在MapReduce的编程模型和低效的执行模式上。这个时候,他向实验室内部的另外一名进行分布式系统研究的学生Matei Zaharia求助。
当时年纪轻轻的Matei在业界已经小有名望。他在雅虎和Facebook实习期间做了很多Hadoop早期的奠基工作,包括现今Hadoop系统内应用最广的fair scheduler调度算法。在和Lester的思维碰撞中,Matei总结了Hadoop MR的不足,开始设计了第一个版本的Spark。这个版本完全为了Lester定制,只有几百行的代码,使得Lester可以高效率地进行分布式机器学习建模。
Lester所在的The Ensemble团队最后和BellKor's Pragmatic Chaos设计了在效率上并列第一的算法,可惜因为晚了20分钟提交,与一百万美元奖金失之交臂。5年之后,Lester和Matei都变成了学术界和业界杰出的人物。Lester成为了斯坦福大学计算机系的教授,带领着自己的学生攻克一个又一个机器学习和统计的难题。Matei成为了麻省理工计算机系的教授,也是Databricks公司的CTO。
2009年之后的4年里面,AMPLab以Spark为基础展开了很多不同的学术研究项目,其中包括了我参与和主导的Shark和GraphX,还有Spark Streaming、MLlib等。4年里随着Hadoop的发展,Spark也逐渐从一个纯学术研究项目发展到了开始有业界敢于吃螃蟹的用户。
2013年,包括Matei和我在内的Spark核心人员共同创立了Databricks公司,立志于提高Spark的发展速度。过去两年,Spark的发展超越了我们所有人的想象。一年半以前Spark还是一个连监控界面都不存在的系统,很难放进生产线部署。而一年半后的今天,它已经变成了整个大数据生态圈和Apache Software Foundation内最活跃的项目,活跃程度远远超出了曾经Spark只能望其项背的Hadoop。
在从Hadoop转向Spark的道路上,我个人感觉国内的速度甚至超越了国外的社区。一年以前我第一次在中国的大数据会议上宣讲Spark,当时台下的大多数人对这个新的项目还有很大的质疑,认为其只会昙花一现。一年之后,Spark的每个新版本中都有不少华人贡献的代码,国内很多高科技和互联网公司也都有了Spark的生产作业,不少用户直接减少了在Hadoop MapReduce上的投资,把新的项目都转移到了Spark上。
今天正好是Databricks公司成立一年半,也是Spark 1.2版本第一个release candidate发布的日期。Spark的高速发展导致了中文信息的脱节。这本书深入浅出地介绍了Spark和Spark上多个重要计算框架,希望它的问世可以更好地在大中华地区普及Spark,增进华人Spark社区的发展。
辛湜 Reynold Xin
2014年11月30号
Berkeley, CA