目录
Apache Spark核心编程模块
集批处理(离线处理)、交互式处理和流式处理 为一体的一栈式大数据解决方案
- Core
最核心,Spark 其他所有模块都是以此为基础进行展开
数据结构:分布式集合RDD
SparkContext:sc
批处理(batch processing),处理数据N+1
注意:
每次处理的数据都是一个固定的数据集,不是变化的
- SQL
DataFrame/Dataset = RDD + schema(字段名称和字段类型)
SparkSession:spark
SQLContext/HiveContext
交互式处理(iteractive processing)
注意:
每次处理的数据都是一个固定的数据集,不是变化的
- Streaming
流式数据处理框架(Streaming Processing)
要处理的数据就像流水一样,源源不断的产生数据,需要实时进行数据处理
数据结构:
DStream = List<RDD> 集合:集合中数据元素为RDD
离散的流、分离的流
对SparkCore的高级API的封装,将流式的数据切分为小的批次batch(按照时间间隔划分)
的数据,然后使用SparkCore对每批次的数据进行处理
如何读取流式数据的?
StreamingContext:上下对象从实时流式数据源接收数据
SparkContext
在大数据技术框架中,对于流式数据实时分析处理方案;
-1. 一条一条的处理
来一条数据就处理一条数据
典型框架:Storm
特点:
实时很高 ,亚秒级别,延迟性很低
阿里巴巴
Storm -> JStorm
2017年双十一,实时销售额统计:
Flink -> Blink
-2. 一批次一批次数据的处理
按照时间间隔将数据划分,时间间隔比较短,比如1s
框架: SparkStreaming
近实时流式数据处理框架,延迟性很低,2.2.0以后开始,1ms以内
安装nc工具
官方文档:
http://spark.apache.org/docs/2.2.0/streaming-programming-guide.html
A Quick Example:
http://spark.apache.org/docs/2.2.0/streaming-programming-guide.html#a-
quick-example
数据源:
TCP Sockect监控某台机器某个端口,读取数据
使用Linux系统自带nc工具
安装nc工具:
使用Linux系统自带nc工具
$ chmod u+x nc-1.84-22.el6.x86_64.rpm
$ sudo rpm -ivh nc-1.84-22.el6.x86_64.rpm
测试是否安装成功
数据展示:
将数据处理以后的结果打印到控制台
println
演示:
开启第一个终端:
$ nc -lk 9999
hadoop spark spark spark hadoop hive
开启第二个终端:
bin/run-example --master local[3] streaming.NetworkWordCount
bigdata-training01.erongda.com 9999
继续不断向第一个终端添加数据:
SparkStreaming 处理数据的流程
-1. 数据源
从哪里接收读取数据,进行数据的处理
Kafka(最多)/Flume(少数)/TCP Sockect(开发测试)
DStream:分离的流
-2. 数据处理
DStream#transformation
调用转换函数,将DStream转换为另外一个DStream
针对不同的业务需求使用不同的函数
企业中最多两种统计类型业务:
- 实时累加统计
比如双十一 销售额统计,订单数统计
DStream#updateStateByKey
- 实时统计最近某段时间数据
比如:趋势统计分析
20:00 - 20:20 二十分钟内,外面订单未送达的量
20:10 - 20:30 ...........................
20:15 - 20:35 ...........................
DStream#xxWinos()
-3. 存储数据(DStream#output)
其实就是调用RDD中API将数据存储,每批次数据处理完成以后,就进行一次保存输出
而已,微批处理(Core)。
- Console
开发测试的时候,将实时分析每批次结果RDD数据打印在控制台
- Redis
基于内存的分布式Key/Value数据库
- HBase
存储到HBase表中,此时实时应用通常是ETL工具
- RDBMS
关系型数据库中,通过JDBC/MyBatis
企业中对于流式典型的数据实时处理的技术框架:
Flume/SDK -> Kafka -> sparkStreaming/Storm/Flink -> Redis/HBase
SparkStreamin中DStream Output输出函数:
-1. def foreachRDD(foreachFunc: RDD[T] => Unit): Unit
一个参数,仅仅针对每批次处理结果RDD
-2. def foreachRDD(foreachFunc: (RDD[T], Time) => Unit): Unit
两个参数,每批次处理结果RDD和每批次处理时间
SparkStreaming中DStream中transform函数很重要:
>>其实就是将RDD转换为另一种RDD其他都是不变的
DStream(List<RDD>).transform = DStream(List<RDD>)
DStream#transform
将一个DStream应用的一个转换函数上转换为另外一个DStream
针对DStream中每批次RDD进行操作的,转换为另外一个RDD
- 一个参数RDD:
def transform[U: ClassTag](transformFunc:
RDD[T] => RDD[U]): DStream[U]
- 两个参数,每批次处理结果RDD和每批次处理时间
def transform[U: ClassTag](transformFunc:
(RDD[T], Time) => RDD[U]): DStream[U]
技术框架
企业中做大户数据分析平台,技术架构:
符合 Lambda Architecture架构
- Batch Layer
批数据处理层 -> 离线数据分析
- Speed Layer
快速数据处理层 -> 实时数据分析
- ServerLayer
提供数据展示层 -> WEB 展示离线或实时分析结果数据
SparkStreaming原理
SparkStreaming:
- batchInterval
批处理时间间隔
通过创阿金StreamingContext实例对象进行设置
表明每次处理的数据时间间隔,RDD
- blockInteval
每次block划分的时间间隔
启动一个Streaming应用的时候,将会启动Receiver用于接收数据,按照blockInterval将
Streaming数据划分为block,默认情况下blockInterval为200ms
计算:
batchInterval = 1s = 5 * batchInterval
1 RDD = 1 block