Spark Stream学习总结:
1. Spark Stream 基于DStream,离散化数据流来处理流数据。相当于RDD对于Spark而言。
DStream本质上是有一串时间上离散的RDD组成。
2. 要处理流数据,首先要创建一个StreamContext, 而StreamContext在底层会创建出SparkContext,以下例子是创建一个streamContext,其中第二个参数指定了多少时间处理一次新数据的时间间隔,并用socketTextStream方法监听本地7777端口的数据流,将接收到的数据流转化为Dstream
val ssc = newe StreamContext(conf, Seconds(1)) val = lines = ssc.socketTextStream("localhost", 7777) val errorLines = lines.filter(_.contains("error")) errrorLines.print() scc.start() //启动流计算环境 scc.awaitTermination()// 执行会在另一个进程里完成,所以要等待完成 3. Spark Stream 架构:Spark Streaming 使用微批次架构,将流计算当做一系列连续的小规模批处理来对待。通过将一段时间上的流数据,进行相等时间间隔的分割,形成一串离散的数据批次。 4. Dstream转化操作: 转化操作分为无状态的转化操作和有状态的转化操作。 无状态的转化操作有map,flatMap,filter,repartition, reduceByKey, groupByKey等.因为Dstream是由一串离散的RDD组成,转化操作其实会应用到每一个RDD上。 例如reduceByKey,会规约每个RDD上的键值对,不过不会跨RDD规约,如果要跨RDD则需要用到有状态的转化操作。
有状态的转化操作:在进行有状态的转化操作时,需要设置检查点,例如streamContext.checkpoint(Dir)
window(windowDuration:int, batchInterval:int), 接受两个参数,一个是窗口时长,另一个是滑动步长。
window转化方法会将一个窗口时长内的RDD进行整合,比如window(Seconds(30), Seconds(10)).count会对30s的一个窗口进行计数,步长则是10s
基于窗口的规约方法
reduceByKeyAndWindow(
{(x, y) => x+y},
{(x,y) => x -y},
Seconds(30),
Seconds(10))
5.不间断运行中的HA:
设置检查点,streamContext.checkpoint(Dir)。
检查点机制使得SparkStream将定期的把数据存储到HDFS等可靠存储中,一旦节点down了,可以通过存储在文件系统中的RDD谱系追溯到上个检查点,然后开始重新计算。
1)如果驱动器driver失败了,如果需要HA,需要特殊的创建streamContext的方法:
def createStreamingContext() = { ... val sc = new SparkContext(conf) val ssc = new StreamingContext(sc, Seconds(1)) ssc.checkpoint(checkpointDir) } val ssc = StreamingContext.getOrCreate(checkpointDir, createStreamingContext _) 6影响steaming的性能的几个因素:1. 批次和窗口大小
2. 并行度: 增加接收器数目,提高聚合计算并行度等等方法
