Spark流计算

Spark Streaming

 Spark Streaming可以整合多种数据源,如Kafka,Hdfs和Flume,甚至是普通的TCP套j借字,经处理后的数据可存储至文件系统,数据库,或显示再仪表盘里。

 Spark Streaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据 

Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)分成一段一段,每一段数据转换为Spark中的RDD,这些分段就是Dstream,并且对DStream的操作都最终转变为对相应的RDD的操作 

Spark Streaming工作原理
在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上

每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等等)

Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据

Spark Streaming程序基本步骤
通过创建输入DStream来定义输入源
通过对DStream应用转换操作和输出操作来定义流计算
用streamingContext.start()来开始接收数据和处理流程
通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)
可以通过streamingContext.stop()来手动结束流计算进程

from pyspark import SparkContext, SparkConf
from pyspark.streaming import StreamingContext
conf = SparkConf()
conf.setAppName('TestDStream')
conf.setMaster('local[2]')
sc = SparkContext(conf = conf)
ssc = StreamingContext(sc, 1)

输入源

文件流

1.在spark-shell中创建文件流

cd /usr/local/spark/mycode
mkdir streaming
cd streaming
mkdir logfile
cd logfile

然后,在logfile中新建两个日志文件log1.txt和log2.txt,里面可以随便输入一些内容。

缺点为:

只会监听该目录下的新增文件(如果是windows的本地系统,好像只能读取新增的文件夹),并不会读取到log文件追加记录,如果需要读取追加的记录,还需用到kafka和flume

下面创建文件流
import findspark

findspark.init()

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

# 创建streaming环境
sc = SparkContext()
# 设置滑动窗口
ssc = StreamingContext(sc, 10)

# 读取文件流
fileDStream = ssc.textFileStream(r'D:/test/')  # 只会监听该目录下的新增文件,并不会读取到log文件追加记录

# 遍历输入内容,执行rdd转化,行动算子
fileDStream.foreachRDD(lambda rdd: print(rdd.collect()))
# 打印控制台
fileDStream.pprint()
# 对流进行转换
result = fileDStream.filter(lambda x: "login, start" in x).map(lambda x: ("login_start", 1)).reduceByKey(lambda a, b : a + b) # 这里的login_start只是我自己定义的,便于统计登录的人数
result.pprint()
# 启动streaming
ssc.start()
ssc.awaitTermination()

 

 

 

 
posted @ 2021-03-22 11:33  欣欣姐  Views(377)  Comments(0)    收藏  举报