目录 第 1章 Spark架构原理与集群搭建 ( 93min) 1 1.1 Spark简介·1 1.2 Spark技术栈·3 1.2.1 Spark Core4 1.2.2 Spark SQL4 1.2.3 Spark Streaming和 Structured Streaming·5 1.2.4 Spark MLlib ·5 1.2.5 Spark GraphX·6 1.2.6 SparkR ·6 1.3 Spark架构原理 ·7 1.3.1 Spark集群和资源管理系统 7 1.3.2 Spark应用程序 7 1.3.3 Spark Driver和 Executor ·9 1.4 Spark程序部署模式10 1.5 安装和配置 Spark集群·11 1.5.1 安装 Spark ·11 1.5.2 了解 Spark目录结构·12 1.5.3 配置 Spark集群·13 1.5.4 验证 Spark安装·14 1.6 配置 Spark历史服务器·15 1.6.1 历史服务器配置 16 1.6.2 启动 Spark历史服务器·17 1.7 使用 spark-shell进行交互式分析 ·18 1.7.1 运行模式 --master·18 1.7.2 启动和退出 spark-shell19 1.7.3 spark-shell常用命令21 1.7.4 SparkContext和 SparkSession ·22 1.7.5 Spark Web UI ·23 1.8 使用 spark-submit提交 Spark应用程序·25 1.8.1 spark-submit指令的各种参数说明·25 1.8.2 提交 SparkPi程序,计算圆周率 π值·29 1.8.3 将 SparkPi程序提交到 YARN集群上执行 30 第 2章 开发和部署 Spark应用程序 ( 86min) · 33 2.1 使用 IntelliJ IDEA开发 Spark SBT应用程序33 2.1.1 安装 IntelliJ IDEA ·34 2.1.2 配置 IntelliJ IDEA Scala环境37 2.1.3 创建 IntelliJ IDEA SBT项目·39 2.1.4 配置 SBT构建文件·42 2.1.5 准备数据文件 42 2.1.6 创建 Spark应用程序·43 2.1.7 部署分布式 Spark应用程序 ·47 2.1.8 远程调试 Spark程序·49 2.2 使用 IntelliJ IDEA开发 Spark Maven应用程序 ·51 2.2.1 创建 IntelliJ IDEA Maven项目 ·51 2.2.2 验证 SDK安装和配置 53 2.2.3 项目依赖和配置管理 55 2.2.4 测试 Spark程序·58 2.2.5 项目编译和打包 58 2.3 使用 Java开发 Spark应用程序 59 2.3.1 创建一个新的 IntelliJ项目59 2.3.2 验证 SDK安装和配置 61 2.3.3 安装和配置 Maven 63 2.3.4 创建 Spark应用程序·64 2.3.5 部署 Spark应用程序·66 2.3.6 远程调试 Spark应用程序 ·67 2.4 使用 Zeppelin进行交互式分析 ·69 2.4.1 下载 Zeppelin安装包70 2.4.2 安装和配置 Zeppelin ·70 2.4.3 配置 Spark解释器·71 2.4.4 创建和执行 Notebook程序·72 第 3章 Spark核心编程 ( 252min) 75 3.1 理解数据抽象 RDD·75 3.1.1 RDD结构75 3.1.2 RDD容错76 3.2 RDD编程模型 77 3.2.1 单词计数应用程序 77 3.2.2 理解 SparkSession79 3.2.3 理解 SparkContext ·80 3.3 创建 RDD 81 3.3.1 将现有的集合并行化以创建 RDD81 3.3.2 从存储系统读取数据集以创建 RDD82 3.3.3 从已有的 RDD转换得到新的 RDD ·83 3.3.4 创建 RDD时指定分区数量 83 3.4 操作 RDD 84 3.4.1 RDD上的 Transformation和 Action ·85 3.4.2 RDD Transformation操作87 3.4.3 RDD Action操作·92 3.4.4 RDD上的描述性统计操作·95 3.5 Pair RDD96 3.5.1 创建 Pair RDD ·97 3.5.2 操作 Pair RDD ·98 3.5.3 关于 reduceByKey()操作·101 3.5.4 关于 aggregateByKey()操作103 3.5.5 关于 combineByKey()操作106 3.6 持久化 RDD 109 3.6.1 缓存 RDD 109 3.6.2 RDD缓存策略 112 3.6.3 检查点 RDD 113 3.7 RDD数据分区 113 3.7.1 获取和指定 RDD分区数 114 3.7.2 调整 RDD分区数 114 3.7.3 内置数据分区器 116 3.7.4 自定义数据分区器 118 3.7.5 避免不必要的 shuffling ·120 3.7.6 基于数据分区的操作 122 3.8 深入理解 RDD执行过程125 3.8.1 Spark RDD调度过程·125 3.8.2 Spark执行模型 126 3.9 Spark资源管理 ·131 3.9.1 CPU资源分配策略 ·131 3.9.2 Spark内存管理 132 3.10 使用共享变量 134 3.10.1 广播变量 134 3.10.2 累加器139 3.11 Spark RDD编程案例·143 3.11.1 合并小文件 143 3.11.2 二次排序实现 145 3.11.3 Top N实现·146 3.11.4 酒店数据预处理 150 第 4章 Spark SQL ( 202min) 154 4.1 Spark SQL数据抽象·155 4.2 Spark SQL架构组成·156 4.3 Spark SQL编程模型·157 4.4 程序入口 SparkSession160 4.5 Spark SQL支持的数据类型162 4.5.1 Spark SQL基本数据类型162 4.5.2 Spark SQL复杂数据类型162 4.5.3 模式·163 4.5.4 列对象和行对象 163 4.6 创建 DataFrame ·164 4.6.1 简单创建单列和多列 DataFrame 165 4.6.2 从 RDD创建 DataFrame ·168 4.6.3 读取外部数据源创建 DataFrame 172 4.7 操作 DataFrame ·191 4.7.1 列的多种引用方式 192 4.7.2 对 DataFrame执行 Transformation转换操作·193 4.7.3 对 DataFrame执行 Action操作205 4.7.4 对 DataFrame执行描述性统计操作 ·206 4.7.5 取 DataFrame Row中特定字段·209 4.7.6 操作 DataFrame示例· 211 4.8 存储 DataFrame ·212 4.8.1 写出 DataFrame ·212 4.8.2 存储模式 215 4.8.3 控制 DataFrame的输出文件数量·216 4.8.4 控制 DataFrame实现分区存储·220 4.9 使用类型化的 DataSet·221 4.9.1 了解 DataSet 221 4.9.2 创建 DataSet 222 4.9.3 操作 DataSet 229 4.9.4 类型安全检查 244 4.9.5 编码器 ·246 4.10 临时视图与 SQL查询·249 4.10.1 在 Spark程序中执行 SQL语句 249 4.10.2 注册临时视图并执行 SQL查询250 4.10.3 使用全局临时视图 252 4.10.4 直接使用数据源注册临时视图 ·254 4.10.5 查看和管理表目录 255 4.11缓存 DataFrame/DataSet 256 4.11.1 缓存方法 256 4.11.2 缓存策略 257 4.11.3 缓存表258 4.12 Spark SQL编程案例·259 4.12.1 实现单词计数 259 4.12.2 用户数据集分析 261 4.12.3 电商用户评论数据集分析 ·264 4.12.4 航空公司航班数据集分析 ·266 4.12.5 数据增量抽取和全量抽取 ·274 第 5章 Spark SQL(高级)( 190min) ·276 5.1 Spark SQL函数·276 5.2 内置标量函数 276 5.2.1 日期时间函数 277 5.2.2 字符串函数 280 5.2.3 数学计算函数 284 5.2.4 集合元素处理函数 285 5.2.5 其他函数 288 5.2.6 函数应用示例 291 5.2.7 Spark 3数组函数·294 5.3 聚合与透视函数 301 5.3.1 聚合函数 301 5.3.2 分组聚合 307 5.3.3 数据透视 311 5.3.4 谓词子查询 312 5.4 高级分析函数 313 5.4.1 使用多维聚合函数 313 5.4.2 使用时间窗口聚合 316 5.4.3 使用窗口分析函数 321 5.5 用户自定义函数( UDF)·330 5.6 数据集的 join连接332 5.6.1 join表达式和 join类型·332 5.6.2 执行 join连接333 5.6.3 处理重复列名 340 5.6.4 join连接策略·342 5.7 读写 Hive表344 5.7.1 Spark SQL的 Hive配置345 5.7.2 Spark Maven项目的 Hive配置·346 5.7.3 Spark SQL读写 Hive表347 5.7.4 分桶、分区和排序 352 5.8 查询优化器 Catalyst 359 5.8.1 窄转换和宽转换 360 5.8.2 Spark执行模型 361 5.8.3 Catalyst实践363 5.8.4 可视化 Spark程序执行·366 5.9 项目 Tungsten372 5.10 Spark性能调优373 5.11 Spark SQL编程案例 ·375 5.11.1 电影数据集分析 375 5.11.2 电商数据集分析 379 5.12 Spark SQL分析案例·387 5.12.1 用户行为数据集说明 ·387 5.12.2 分析需求说明 388 5.12.3 数据探索和预处理 390 5.12.4 平台流量分析 394 5.12.5 用户行为分析 397 5.12.6 转化漏斗分析 405 5.12.7 用户 RFM价值分析408 5.12.8 推荐效果分析 412 5.12.9 项目分析总结 417 第 6章 Spark Streaming流处理 ( 73min)·418 6.1 Spark DStream ·418 6.2 Spark流处理示例419 6.2.1 Spark Streaming编程模型·420 6.2.2 实时股票交易分析 423 6.2.3 使用外部数据源 Kafka440 第 7章 Spark结构化流 ( 162min)·446 7.1 结构化流简介 446 7.2 结构化流编程模型 448 7.3 结构化流核心概念 451 7.3.1 数据源 ·451 7.3.2 输出模式 452 7.3.3 触发器类型 452 7.3.4 数据接收器 453 7.3.5 水印·454 7.4 使用各种流数据源 454 7.4.1 使用 Socket数据源·454 7.4.2 使用 Rate数据源·456 7.4.3 使用 File数据源458 7.4.4 使用 Kafka数据源 461 7.5 流 DataFrame操作467 7.5.1 选择、投影和聚合操作 468 7.5.2 执行 join连接操作471 7.6 使用数据接收器 474 7.6.1 使用 File Data Sink 474 7.6.2 使用 Kafka Data Sink·475 7.6.3 使用 Foreach Data Sink478 7.6.4 使用 Console Data Sink ·480 7.6.5 使用 Memory Data Sink·482 7.6.6 Data Sink与输出模式 ·483 7.7 深入研究输出模式 483 7.7.1 无状态流查询 483 7.7.2 有状态流查询 484 7.8 深入研究触发器 489 7.8.1 固定间隔触发器 490 7.8.2 一次性的触发器 492 7.8.3 连续性的触发器 492 第 8章 Spark结构化流(高级)( 72min)·496 8.1 事件时间和窗口聚合 496 8.1.1 固定窗口聚合 496 8.1.2 滑动窗口聚合 500 8.2 水印·504 8.2.1 限制维护的聚合状态数量 ·504 8.2.2 处理迟到的数据 507 8.3 任意状态处理 512 8.3.1 结构化流的任意状态处理 ·513 8.3.2 处理状态超时 514 8.3.3 任意状态处理实战 515 8.4 处理重复数据 524 8.5 容错·526 8.6 流查询度量指标和容错 528 8.6.1 流查询指标 528 8.6.2 流监控指标 530 8.7 结构化流案例:运输公司车辆超速实时监测 531 8.8 结构化流案例:实时订单分析 ·536 8.8.1 数据集说明和数据源 537 8.8.2 计算每 10s的销售和购买订单数量 538 8.8.3 根据购买或售出的总金额统计前 5个客户541 8.8.4 找出过去一小时内前 5个交易量昀多的股票543 第 9章 Spark图处理库 GraphFrame ( 80min)546 9.1 图基本概念 546 9.2 GraphFrame图处理库简介 ·548 9.3 GraphFrame的基本使用·549 9.3.1 添加 GraphFrame依赖549 9.3.2 构造图模型 550 9.3.3 简单图查询 551 9.3.4 示例:简单航班数据分析 ·556 9.4 应用 motif模式查询 ·559 9.4.1 简单 motif查询·560 9.4.2 状态查询 562 9.5 构建子图 ·563 9.6 内置图算法 565 9.6.1 广度优先搜索( BFS)算法 565 9.6.2 连通分量算法 567 9.6.3 强连通分量算法 568 9.6.4 标签传播算法 569 9.6.5 PageRank算法·570 9.6.6 昀短路径算法 573 9.6.7 三角计数算法 574 9.7 保存和加载 GraphFrame ·575 9.8 深入理解 GraphFrame ·576 9.9 案例:亚马逊产品联购分析 ·578 9.9.1 基本图查询和操作 579 9.9.2 联购商品分析 580 9.9.3 处理子图 584 9.9.4 应用图算法进行分析 584 第 10章 Delta Lake数据湖 ( 61min) 586 10.1 从数据仓库到数据湖 586 10.2 解耦存储层和分析层 588 10.3 Delta Lake介绍·591 10.4 Delta Lake架构·593 10.5 Delta Lake使用·595 10.5.1 安装 Delta Lake595 10.5.2 表批处理读写 596 10.5.3 表流处理读写 602 10.5.4 文件移除 605 10.5.5 压缩小文件 612 10.5.6 增量更新与时间旅行 ·615 10.5.7 合并更新( upsert)·621 第 11章 Iceberg数据湖 ( 90min) 630 11.1 Apache Iceberg简介630 11.2配置和使用 Catalog·631 11.2.1 配置 Catalog·632 11.2.2 使用 Catalog·633 11.2.3 替换 Session Catalog 633 11.2.4 运行时配置 634 11.3管理 Catalog中的数据库635 11.4管理 Iceberg表635 11.4.1 基本的 CRUD操作635 11.4.2 创建和删除表 640 11.4.3 使用分区表和分桶表 ·642 11.4.4 数据覆盖 652 11.4.5 修改表结构 654 11.5探索 Iceberg表663 11.5.1 History历史表·663 11.5.2 Snapshots快照表·664 11.5.3 Files数据文件表664 11.5.4 Manifests文件清单表665 11.6 Apache Iceberg架构666 11.6.1 Iceberg Catalog·666 11.6.2 元数据文件 667 11.6.3 清单列表( Manifest List)670 11.6.4 清单文件( Manifest File)673 11.7 CRUD操作的底层实现 676 11.8增量更新与合并更新 679 11.9时间旅行685 11.10 隐藏分区和分区演变 688 11.10.1 分区概念 ·688 11.10.2 分区演变示例 ·691 11.11 使用存储过程维护表·698 11.12 整合 Spark结构化流·701 11.12.1 流读取 ·701 11.12.2 流写入 ·701 11.12.3 维护流表 ·704 第 12章 Hudi数据湖 ( 19min) 707 12.1 Apache Hudi特性707 12.1.1 Hudi Timeline·707 12.1.2 Hudi文件布局 ·709 12.1.3 Hudi表类型 ·709 12.1.4 Hudi查询类型 ·712 12.2 在 Spark 3中使用 Hudi ·713 12.2.1 配置 Hudi·713 12.2.2 初始设置 714 12.2.3 插入数据 715 12.2.4 查询数据 716 12.2.5 更新数据 718 12.2.6 增量查询 718 12.2.7 时间点查询 720 12.2.8 删除数据 720 12.2.9 插入覆盖 722 第 13章 Spark大数据处理综合案例 ( 15min) ·724 13.1 项目需求说明 724 13.2 项目架构设计 725 13.3 项目实现:数据采集 726 13.4 项目实现:数据集成 729 13.4.1 Flume简介·729 13.4.2 安装和配置 Flume ·730 13.4.3 实现数据集成 731 13.5 项目实现:数据 ETL732 13.6 项目实现:数据清洗与整理 ·735 13.7 项目实现:数据分析 739 13.8 项目实现:分析结果导出 ·747 13.9 项目实现:数据可视化 748 13.9.1 Spring MVC框架简介·749 13.9.2 ECharts图表库介绍·750 13.9.3 Spring MVC Web程序开发 ·751 13.9.4 前端 ECharts组件开发763 13.10 项目部署和测试 768