Spark Streaming是一个可扩展、高吞吐、具有容错性的流式计算框架。
之前我们接触的spark-core和spark-sql都是离线批处理任务,每天定时处理数据,对于数据的实时性要求不高,一般都是T+1的。但在企业任务中存在很多的实时性的任务需求,列如双十一的京东阿里都会要求做一个实时的数据大屏,显示实时订单。

实时计算框架对比
| 框架类别 | 框架类型 | 数据单位 | 其他 | 吞吐量 | 延迟 |
|---|---|---|---|---|---|
| Storm | 流式计算框架 | record的处理数据单位 | 支持micro-batch方式 | 一般 | 更低 |
| Spark | 批处理计算框架 | RDD处理数据单位 | 支持micro-batch流式处理数据 | 更强 | 一般 |
| 数据源 | 类型 |
|---|---|
| 基本源 | TCP/IP or FileSystem |
| 高级源 | Kafka or Flume |
import os
# 配置spark driver和pyspark运⾏时,所使⽤的python解释器路径
PYSPARK_PYTHON = "/miniconda2/envs/py365/bin/python"
JAVA_HOME='/root/bigdata/jdk'
SPARK_HOME = "/root/bigdata/spark"
# 当存在多个版本时,不指定很可能会导致出错
os.environ["PYSPARK_PYTHON"] = PYSPARK_PYTHON
os.environ["PYSPARK_DRIVER_PYTHON"] = PYSPARK_PYTHON
os.environ['JAVA_HOME']=JAVA_HOME
os.environ["SPARK_HOME"] = SPARK_HOME
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
if __name__ == "__main__":
sc = SparkContext("local[2]",appName="NetworkWordCount")
#参数2:指定执⾏计算的时间间隔
ssc = StreamingContext(sc, 1)
#监听ip,端⼝上的上的数据
lines = ssc.socketTextStream('localhost',9999)
#将数据按空格进⾏拆分为多个单词
words = lines.flatMap(lambda line: line.split(" "))
#将单词转换为(单词,1)的形式
pairs = words.map(lambda word:(word,1))
#统计单词个数
wordCounts = pairs.reduceByKey(lambda x,y:x+y)
#打印结果信息,会使得前⾯的transformation操作执⾏
wordCounts.pprint()
#启动StreamingContext
ssc.start()
#等待计算结束
ssc.awaitTermination()
Spark Streaming存在两种状态操作:UpdateStateByKey和Window操作。
