参考课程 《厦门大学大数据实验室》 Spark编程基础(Python版)

第一章 前导课程

第三次信息时代

  • 三多浪花:物联网 云计算 大数据

大数据技术

  1. 大量化
  2. 多样化
  3. 快速化 1m定律
  4. 价值密度低 (但是,单点价值高)

科学研究范式

  1. 实验

    • 伽利略
  2. 理论

    • 牛顿
  3. 计算

    • 问题已知
  4. 数据

    • 问题未知
    • 大数据时代特征:

      • 全样而非抽样
      • 效率而非精确
      • 相关而非因果

关键技术

  • 流程:

    1. 数据采集
    2. 数据存储管理
    3. 处理分析
    4. 隐私安全
  • 核心:

    • 分布式存储 GFS HDFS
    • 分布式处理 MapReduce Spark

计算模式

  1. 批处理

    • MapReduce Spark
  2. 流计算

    • storm
  3. 图计算

    • 地理信息系统、社交网络系统
    • Pregel
  4. 查询分析计算

    • Google Dremel
    • Hive

代表性大数据产品

  1. Hadoop生态系统

    • Spark基础笔记 - 图1
    • Hdfs 分布式文件系统
    • Yarn 资源调度管理框架
    • MapReduce 分布式计算框架

      • Hive 数据仓库 (查询)
      • Pig ETL
      • Marhout 挖掘算法库
      • Sqoop 和传统数据之间的导入导出
      • Zookeeper 协同处理
      • 日志采集模块
      • Hbase 分布式数据库
  2. Spark生态系统

    • Spark Core 批处理 底层
    • Spark SQL 查询分析
    • Spark Streaming 流计算
    • MLlib 机器学习
    • GraphX 图计算
    • Hadoop Spark 比较

      • hadoop Mapreduce的缺点:

        • MapReduce 表达能力有限
        • 磁盘IO开销大 不适宜迭代任务
        • 任务之间的衔接开销大 map和reduce属于阶段性任务,所有map 结算才能进入reduce阶段
      • Spark 优势

        • 内存计算 迭代计算时不涉及磁盘读写,逻辑回归之类的性能相差百倍
        • 流水线操作
      • Spark是单纯的计算框架 需要和HDFS组合使用。Spark 有取代计算框架MapReduce的可能,
  3. Flink生态系统

    • Spark的替代框架 流计算性能略优于Spark
  4. Beam

    • Google对各个框架的统一编程接口

第二章 spark设计原理

Spark概述

计算框架, 不含分布式存储框架

  1. 内存计算、循环数据流
  2. 有向无环图、流水线优化
  3. 开发语言 scala R Python
  4. 通用栈
  5. 运行模式多样 单机、集群部署

基本概念

  1. 基本概念

    • RDD 弹性分布式数据集 分布式内存的抽象概念
    • DAG 有向无环图 反应RDD的依赖关系
    • Executor 进程 每个工作节点上的进程
    • Application
    • Task
    • Job
    • stage
  2. 运行框架:一主多从

运行机制流程

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 运行原理

  1. 阶段划分依据

    • 宽依赖划分 生成新的阶段
    • 窄依赖不划分 不断加入阶段
  2. fork/join 优化原理

    • 尽量减少join操作的次数
    • 从(fork+join)N 转化为 forkN + joan

部署方式

  • 集群方式

    • 单机
    • 集群方式

      • standalone
      • mesos
      • YARN

第三章 Spark环境搭建

第四章 RDD编程基础

创建

  1. 从磁盘读取
  2. 序列化

转换操作

行动操作

持久化

  • .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

发展

  1. Hive Hadoop的数据仓库产品,可以使用接近SQL语法转化为MapReduce作业,进行大数据查询。
  2. Shark 阶段性产品 Hive的几乎完全copy
  3. 成熟分支

    • 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式查询之前,总是需要注册临时表
  1. 反射机制推断RDD模式

    • spark.creatDataFrame(RDD)
  2. 编程方式定义RDD模式

    • 数据结构未知
    • StructField(field_name, StructType, True)
    • StructType() 生成模式对象的表头 描述数据库表头
    • spark.creatDataFrame(记录, 表头模式)

使用Spark SQL 读写MySQL数据库

  1. 安装MySQL的JDBC驱动
  2. 读取

    • Spark.read.foramt().option().load()
  3. 写入

    • 确定模式信息 / 表头

      • StructType([StructField(), StructField()])
    • 确定记录信息 / 记录

      • 一个或者多个Row对象

第六章 流计算

  1. 典型数据类型

    • 静态数据

      • 数据仓库 基于历史数据的查询分析
      • 批处理
    • 流数据

      • 数据 快速 大量 不断到达
      • 实时计算
  2. 流计算特征步骤

    • 数据采集
    • 实时计算 数据价值降低很快
    • 结果反馈
  3. 流计算框架

    • 高性能
    • 海量式
    • 实时性
    • 分布式 平滑扩展
    • 易用性
    • 可靠性
  4. 三类框架

    • 商业级别流计算平台

      • IBM
    • 开源流计算框架

      • Twitter Storm
      • Yahoo! S4
    • 内部开发

      • Facebook Puma
      • Taobao 银河流计算
  5. 具体

    • 数据实时采集

      • 分布式日志采集组件
    • 实时计算
    • 实时查询服务

      • 系统主动反馈查询结果、实时更新

Spark Streming

  • 多源输入输出
  • 以微小批处理的方式模拟流数据 最小秒级切分
  • 数据抽象

    • DStream
    • 由多个连续时间片的RDD集合组成
  • Dstream 工作机制

    • 组件receiver长期运行在task上的Executer
    • 输入数据源

      • 套接字流
      • 文件流
      • Kafka流
  • Dstream编程

    • 创建StreamingContext上下文对象

文件流输入

1.ssc.textFileStream(url)

套接字数据流

RDD队列流

高级数据源