SparkSQL

通过提供存放Row对象(一条记录)的SchemaRDD ,使用Spark+SQL来操作结构化和半结构化的数据,并支持透过JDBC、ODBC链接;支持与Py等代码融合。推荐使用HiveQL作为默认语言

在应用中使用SparkSQL

  1. 初始化SparkSQL:导入HiveContext;如果无法导入Hive依赖,则创建一个SQLContext对象
  2. 用SQL执行查询

SchemaRDD

支持对齐应用已有的RDD转化操作,且允许吧SchemaRDD注册为临时表,使之可以通过HiveContext或SQLContext的sql对其进行查询。
– Row对象

Row对象本质是定长的字段数组,允许传入下标获取每个字段的值

缓存

与Spark中缓存对象不同,SparkSQL中应使用 hiveCtx.cacheTable("tableName") 的方法缓存数据表而不是整个对象。

读取和存储

支持将Hive表,Json等数据源读取为Row对象,或者对普通RDD指定结构信息而将其转化为SchemaRDD。

UDF

支持自己编写和直接引入HiveUDF

SparkStreaming

Spark Streaming使用DStream(离散化流)来抽象表示随时间推移而收到的数据,内部为每个收到数据的RDD,而DStream表示一个RDD序列;可从多个输入源创建,支持转化(转化成另一个DStream)和输出(输出到外部系统)。

架构&抽象

  • 微批次

将流式计算当做一系列小规模批处理来处理,批次间隔可自定义,结果也以批处理的方式传给外部系统。SparkStreaming为每个输入源启动对应的接收器,从输入源接受数据并存为RDD。收到数据后会将其复制到另一个执行器进程来保障容错性;StreamingContext会周期运行任务来处理数据,使之整合到之前时间区间的RDD中。

  • 容错
    支持从输入源头恢复,全量重算的场景 ; 或将阶段数据存储到文件系统中

    • 检查点(控制失败时需要重算的状态数;提供驱动程序容错)
    • 驱动程序容错(使用getOrCreate()和编写重启驱动器代码使得当驱动器错误时可以自动恢复
    • 工作节点容错
      • 与Spark一致
      • 提供 精确一次 语义的一致性

转化

  • 无状态转化中每个批次数据不依赖之前批次的数据;有状态转化则使用前批次数据或中间结果,如滑动窗口
  • 窗口函数支持归约函数在整个窗口上执行运算,还提供逆归约函数来做增量的窗口计算。

输入源

  • 文件流
  • Akka actor
  • Kafka
  • Flume(推或拉)

性能

  • 批次窗口大小
  • 并行度(增加接收器数目,将收到的数据重新分区,提高聚合计算的并行度)
  • 使用较少触发暂停的GC