SparkSQL
通过提供存放Row对象(一条记录)的SchemaRDD ,使用Spark+SQL来操作结构化和半结构化的数据,并支持透过JDBC、ODBC链接;支持与Py等代码融合。推荐使用HiveQL作为默认语言
在应用中使用SparkSQL
- 初始化SparkSQL:导入HiveContext;如果无法导入Hive依赖,则创建一个SQLContext对象
- 用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