第一章 前导课程
第三次信息时代
- 三多浪花:物联网 云计算 大数据
大数据技术
- 大量化
- 多样化
- 快速化 1m定律
- 价值密度低 (但是,单点价值高)
科学研究范式
实验
- 伽利略
理论
- 牛顿
计算
- 问题已知
数据
- 问题未知
大数据时代特征:
- 全样而非抽样
- 效率而非精确
- 相关而非因果
关键技术
流程:
- 数据采集
- 数据存储管理
- 处理分析
- 隐私安全
核心:
- 分布式存储 GFS HDFS
- 分布式处理 MapReduce Spark
计算模式
批处理
- MapReduce Spark
流计算
- storm
图计算
- 地理信息系统、社交网络系统
- Pregel
查询分析计算
- Google Dremel
- Hive
代表性大数据产品
Hadoop生态系统

- Hdfs 分布式文件系统
- Yarn 资源调度管理框架
MapReduce 分布式计算框架
- Hive 数据仓库 (查询)
- Pig ETL
- Marhout 挖掘算法库
- Sqoop 和传统数据之间的导入导出
- Zookeeper 协同处理
- 日志采集模块
- Hbase 分布式数据库
Spark生态系统
- Spark Core 批处理 底层
- Spark SQL 查询分析
- Spark Streaming 流计算
- MLlib 机器学习
- GraphX 图计算
Hadoop Spark 比较
hadoop Mapreduce的缺点:
- MapReduce 表达能力有限
- 磁盘IO开销大 不适宜迭代任务
- 任务之间的衔接开销大 map和reduce属于阶段性任务,所有map 结算才能进入reduce阶段
Spark 优势
- 内存计算 迭代计算时不涉及磁盘读写,逻辑回归之类的性能相差百倍
- 流水线操作
- Spark是单纯的计算框架 需要和HDFS组合使用。Spark 有取代计算框架MapReduce的可能,
Flink生态系统
- Spark的替代框架 流计算性能略优于Spark
Beam
- Google对各个框架的统一编程接口
第二章 spark设计原理
Spark概述
计算框架, 不含分布式存储框架
- 内存计算、循环数据流
- 有向无环图、流水线优化
- 开发语言 scala R Python
- 通用栈
- 运行模式多样 单机、集群部署
基本概念
基本概念
- RDD 弹性分布式数据集 分布式内存的抽象概念
- DAG 有向无环图 反应RDD的依赖关系
- Executor 进程 每个工作节点上的进程
- Application
- Task
- Job
- stage
- 运行框架:一主多从
运行机制流程
RDD运行原理
解决问题
- 频繁磁盘读写
频繁的数据序列化和反序列化
- 序列化指 从对象到可保存传输的数据格式。例如 json —> 字典
抽象的数据架构
- 数据问题转化为 RDD的转化
- 避免磁盘操作 RDD之间可以连续操作
- RDD只读 高度受限的共享内存模型(理解为只能另存 不能修改),通过生成新的RDD进行数据修改
RDD操作类型:
- 仅支持粗粒度的操作,不支持具体某记录的更改
Action 动作类型
- 数据输出
transformation 转换类型
- 数据转换
优势
- 惰性调用。转换操作只记录操作逻辑,不实际执行。当遇到动作类型时,执行一串转换。
- 管道化 RDD的转换结果直接作为另一个RDD的输入,在内存中进行。
特性
高效容错机制
- 现有机制:冗余数据+日志记录
- RDD内部容错、内部恢复。利用RDD之间的血缘关系进行数据恢复。
- 中间结果持久化内存,避免磁盘开销
- 不涉及频繁的序列化、反序列化
RDD的依赖关系
shuffle概念
- 洗牌操作。
- 该操作发生数据交换,需要写磁盘。
宽依赖:
- 包含shuffle操作
- 一个父RDD对应多个子RDD
- 无法进行流水化处理
- 例如:groupByKey join
窄依赖:
- 不含shuffle操作
- 一个父RDD对应一个子RDD,或者多个父RDD对应一个子RDD
- 可以进行流水化处理
- 例如:map filter union
RDD 运行原理
阶段划分依据
- 宽依赖划分 生成新的阶段
- 窄依赖不划分 不断加入阶段
fork/join 优化原理
- 尽量减少join操作的次数
- 从(fork+join)N 转化为 forkN + joan
部署方式
集群方式
- 单机
集群方式
- standalone
- mesos
- YARN
第三章 Spark环境搭建
略
第四章 RDD编程基础
创建
- 从磁盘读取
- 序列化
转换操作
行动操作
持久化
.persist()
- 惰性, 标记为持久化,当出现第一个行动类型操作才执行持久化
MEMORY_ONLY 等价 .cache()
- 内存不够则替换掉 最近最少使用原则
MEMORY_AND_DISK
- 内存不够 保存磁盘 一般不用
.unpersist()
- 手动释放持久化内存
分区
优势:
- 增加并行度
- 减少通信开销
分区原则
- 基本原则:分区个数 = 集群CPU个数
- 不同集群模式下不同
- 默认配置:spark.default.parallelism
- 创建RDD时设置分区数量 参数
- 函数 reparatition 重设分区个数
分区逻辑
- 哈希分区
- 自定义分区
键值对RDD的操作
- 创建
常用转换操作
- reduceByKey(func(a,b)) 使用func对value进行聚合计算(累加式)
- groupByKey() 分组,返回value的可迭代对象。
- keys() values() key/value集合的新RDD
- sortByKey() 根据key进行排序
- sortBy() 按照制定规则进行排序
- mapValues(func) 使用func对value进行映射 ,逐一操作value,保持key不变
- join 连接操作,对相同的key进行连接,返回一个新的value可迭代对象。
数据读写
本地系统
- textFile(“file:///url”)
- saveAsTextFile(“目录路径而非文件名”)
分布式HDFS
- textFile(hdfs://url路径) 可以是相对路径
Hbase简介
- 分布式数据库
四维定位法
- 行键 列族 列限定符 时间戳 定位到单元格
读写Hbase数据
- 创建Hbase数据库
- 写入数据以单元格为单位, 即每次操作先定位单元格(g关系型数据库为定位到行),写入数值。
配置Spark
- Hbase的部分依赖jar包需要复制到Spark安装目录
- 把Hbase数据转换成 python可读取的jab包补丁
- spark-env 的配置
- 程序读取hbase数据
第五章 Spark SQL
发展
- Hive Hadoop的数据仓库产品,可以使用接近SQL语法转化为MapReduce作业,进行大数据查询。
- Shark 阶段性产品 Hive的几乎完全copy
成熟分支
- Spark SQL 崭新的SQL查询语言
- Hive on Spark
DataFrame
- DataFrame 提供详细的结构信息
- 新的上下文对象 SparkSession
创建DF
- read.json.(url)
- read.foramt(‘json’).load(url)
保存DF
- wirte.json()
- write.format(url).save()
常用操作
- printScaheme() 打印模式信息
- .select()
- .filter
- .groupBy()
- .sort()
- .show()
从RDD转换为DataFrame
- 再进行SQL式查询之前,总是需要注册临时表
反射机制推断RDD模式
- spark.creatDataFrame(RDD)
编程方式定义RDD模式
- 数据结构未知
- StructField(field_name, StructType, True)
- StructType() 生成模式对象的表头 描述数据库表头
- spark.creatDataFrame(记录, 表头模式)
使用Spark SQL 读写MySQL数据库
- 安装MySQL的JDBC驱动
读取
- Spark.read.foramt().option().load()
写入
确定模式信息 / 表头
- StructType([StructField(), StructField()])
确定记录信息 / 记录
- 一个或者多个Row对象
第六章 流计算
典型数据类型
静态数据
- 数据仓库 基于历史数据的查询分析
- 批处理
流数据
- 数据 快速 大量 不断到达
- 实时计算
流计算特征步骤
- 数据采集
- 实时计算 数据价值降低很快
- 结果反馈
流计算框架
- 高性能
- 海量式
- 实时性
- 分布式 平滑扩展
- 易用性
- 可靠性
三类框架
商业级别流计算平台
- IBM
开源流计算框架
- Twitter Storm
- Yahoo! S4
内部开发
- Facebook Puma
- Taobao 银河流计算
具体
数据实时采集
- 分布式日志采集组件
- 实时计算
实时查询服务
- 系统主动反馈查询结果、实时更新
Spark Streming
- 多源输入输出
- 以微小批处理的方式模拟流数据 最小秒级切分
数据抽象
- DStream
- 由多个连续时间片的RDD集合组成
Dstream 工作机制
- 组件receiver长期运行在task上的Executer
输入数据源
- 套接字流
- 文件流
- Kafka流
Dstream编程
- 创建StreamingContext上下文对象
文件流输入
1.ssc.textFileStream(url)
