最近公司有一个安全方面的业务,需要实时监控所有访客的情况。之前是定时去查询Elasticsearch
的接口进行统计分析,但是这个时间间隔不好把握,并且Elasticsearch
并不适合特别实时的查询操作。实时的分布式流计算引擎首推Spark
,它与Hadoop
等相比的优势在这里讲得比较清楚了。
- **RDD(Resilient Distributed Dataset弹性分布式数据集)**:这是spark的主要数据概念。有多种来源,容错机制,并且能缓存、并行计算。RDD在整个计算流程中会经过不同方式的变换,这种变换关系就是一个有向无环图。
- 需要注意的是,所有的方法在定义执行之前都是异步的,所以不能简单地在下面的方法外部添加
try...catch...
进行异常捕获,最好是在传入的函数里面进行异常的捕获(如果是lambda,请确认lambda不会报错,否则如果lambda报错整个程序都会报错并终止允许) - Spark应用程序可以使用大多数主流语言编写,这里使用的是python,只
pip install pyspark
即可 - Stage(调度阶段): 每个Job会根据RDD大小切分城多个Stage,每个Stage包含一个TaskSet
- TaskSet(任务集): 一组关联的Task集合,不过是没有依赖的
- Task(任务): RDD中的一个分区对应一个Task。
- Narrow Dependency(窄依赖): 比较简单的一对一依赖和多对一依赖(如union)
- Shuffle Dependency(宽依赖): 父RDD的分区被多个子RDD分区所使用,这时父RDD的数据会被再次分割发送给子RDD
- Spark 内存分配: 分为这三块:
- execution: 执行内存,基本的算子都是在这里面执行的,这块内存满了就写入磁盘。
- storage: 用于存储broadcast, cache, persist
- other: 程序预留给自己的内存,这个可以不用考虑
- Duration
- batchDuration: 批次时间
- windowDuration: 窗口时间,要统计多长时间内的数据,必须是
batchDuration
的整数倍 - slideDuration: 滑动时间,窗口多长时间滑动一次,必须是
batchDuration
的整数倍,一般是跟batchDuration
时间相同