一、结构化流介绍
1、有界和无界数据
-
有界数据:
有界数据: 指的数据有固定的开始和固定的结束,数据大小是固定。我们称之为有界数据。对于有界数据,一般采用批处理方案(离线计算) 特点: 1-数据大小是固定 2-程序处理有界数据,程序最终一定会停止
-
无界数据:
无界数据: 指的数据有固定的开始,但是没有固定的结束。我们称之为无界数据 注意: 对于无界数据,我们一般采用流式处理方案(实时计算) 特点: 1-数据没有明确的结束,也就是数据大小不固定 2-数据是源源不断的过来 3-程序处理无界数据,程序会一直运行不会结束
2、基本介绍
结构化流是构建在Spark SQL处理引擎之上的一个流式的处理引擎,主要是针对无界数据的处理操作。对于结构化流同样也支持多种语言操作的API:比如 Python Java Scala SQL ....
Spark的核心是RDD。RDD出现主要的目的就是提供更加高效的离线的迭代计算操作,RDD是针对的有界的数据集,但是为了能够兼容实时计算的处理场景,提供微批处理模型,本质上还是批处理,只不过批与批之间的处理间隔时间变短了,让我们感觉是在进行流式的计算操作,目前默认的微批可以达到100毫秒一次
真正的流处理引擎: Storm(早期流式处理引擎)、Flink、Flume(流式数据采集)
3、使用三大步骤
StructuredStreaming在进行数据流开发时的三个步骤
-
1、读取数据流数据 : 指定数据源模式
-
saprksession对象.readStream.format(指定读取的数据源).option(指定读取的参数).load()
-
-
2、数据处理: 使用dsl或者sql方式计算数据和SparkSQL操作一样
-
3、将计算的结果保存 : 指定输出模式,指定位置
-
writeStream.
outputMode
(输出模式).option(输出的参数配置).format
(指定输出位置).start
().awaitTermination()
-
4.回顾sparkSQL的词频统计案例
# 导包 import os from pyspark.sql import SparkSession,functions as F # 绑定指定的python解释器 os.environ['SPARK_HOME'] = '/export/server/spark' os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3' os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3' # 创建main函数 if __name__ == '__main__': # 1.创建SparkContext对象 spark = SparkSession.builder.appName('pyspark_demo').master('local[*]').getOrCreate() # 2.数据输入 df = spark.read\ .format('text')\ .load('file:///export/data/spark_project/structured_Streaming/data/w1.txt') # 查看数据类型 print(type(df)) # 3.数据处理(切分,转换,分组聚合) # SQL方式 df.createTempView('tb') sql_df = spark.sql(""" select words,count(1) as cnt from ( select explode(split(value,' ')) as words from tb ) t group by words """) # DSL方式 dsl_df = df.select( F.explode(F.split('value',' ')).alias('words') ).groupBy('words').agg( F.count('words').alias('cnt') ) # 4.数据输出 sql_df.show() dsl_df.show() # 5.关闭资源 spark.stop()