Structured Stream--结构流理论知识

流的来源是Spark自带的所有内容(RDD,DataSet,DataFrame)
参照网址:http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html
流里面的数据是结构化的,列固定,可以把这10秒(这个时间可以指定)钟接收的所有数据当成一张表来使用;
结构化流提供快速、可伸缩、容错、端到端的一次流处理,而无需用户对流进行推理
Structured Stream--结构流理论知识

- [ ] 输出模式
完全模式(complete)-整个更新的结果表将写入外部存储。由存储连接器决定如何处理整个表的写入
附加模式(Append)-只有结果表中附加的新行,因为最后一个触发器将写入外部存储。这仅适用于预期结果表中的现有行不会更改的查询。
更新模式(Update)-只有上次触发器后在结果表中更新的行才会写入外部存储(自Spark2.1.1以来即可获得)。请注意,这与完全模式不同,因为此模式只输出自上次触发器以来更改的行。如果查询不包含聚合,则它将等同于追加模式
下图中最快的做法是:
当时间是t5,把t4统计的结果+t5(新记录)统计的结果相加;这就是t5的总结果;
Structured Stream--结构流理论知识
问题:数据生成的时间(netcat)和Spark接收的时间不一样;(原因:网络和原因);
解决方案:watermarking(水印)和Window操作

  • 水印–Windows
    水印清除聚集状态的条件
    输出模式必须附加或更新。完全模式要求保存所有聚合数据,因此不能使用水印删除中间状态。见输出模式一节详细解释每种输出模式的语义。
    聚合必须具有事件时列或window在事件时间列上。
    withWatermark必须在与聚合中使用的时间戳列相同的列上调用。例如,df.withWatermark(“time”, “1 min”).groupBy(“time2”).count()在附加输出模式中无效,因为水印是在与聚合列不同的列上定义的。
    withWatermark必须在聚合之前调用要使用的水印详细信息。例如,df.groupBy(“time”).count().withWatermark(“time”, “1 min”)在附加输出模式中无效。
    水印的数据如果超过2个小时还木有收到,将被放弃;
    流尽量复用,RDD也是尽量复用
  • Join
    静态的dataFrame(read)和dataSet连接流(readStream)
    Stream和Stream连接;
  • 流的缺点–不支持的一些操作
    流DataFrames/DataSet不支持一些DataFrame/DataSet操作。其中一些建议如下。
    流数据集还不支持多个流聚合(即流DF上的聚合链)。
    流数据集不支持限制(limit分页)和接受前N行(topN)。
    不支持流数据集上的去重操作。
    流数据集仅在聚合后和完全输出模式下才支持排序操作。
    流数据集中很少支持外部联接类型。见连接操作部分中的支持矩阵更多细节。

启动流查询才能完成;(query.start()????
count()-无法从流数据集中返回单个计数。相反,使用ds.groupBy().count()它返回包含运行计数的流数据集。
foreach()-使用下面的替换,使用ds.writeStream.foreach(…)(见下一节)。
show()-使用下面的替换,请使用控制台接收器(参见下一节)。

  • 检查点和RDD持久化的区别
    RDD持久化:存储的是RDD的代码逻辑和数据(此RDD被上一次action调用过);
    检查点:如果RDD的结果运算的时间相当长;(机器挂了);重新算;(RDD代码逻辑,RDD之间的依赖关系);
    RDD性能有所提供是检查点和RDD持久化配合使用;
List<Integer> arr = Arrays.asList(4,5,6,7,8);
# 先设置检查点的目录
		sc.setCheckpointDir("e:/test/spark");
	    /* 并行化生成RDD
	     * 参数2:为分区数;默认值是2个
	     *  */
	    JavaRDD<Integer> arrRDD = sc.parallelize(arr);
	    final int i = 10 ;
	    /* 增加一个检查点; */
	    arrRDD.checkpoint();
  • Spark Streaming
    Structured Stream--结构流理论知识
    SparkStream的数据源获取是通过外部的,数据可以从多种来源(如Kafka、Flume、Kinesis或tcp套接字)中摄取
    Structured Stream--结构流理论知识
    SparkSteam有两种:discretized stream和DStream(表示连续的数据流)
    Structured Stream--结构流理论知识
    Structured Stream--结构流理论知识
  • 火花流提供了两类内置流源。
    基本来源(Basic sources)在StreamingContext API中可以直接获得源。示例:文件系统和套接字连接。
    先进源:(Advanced sources)来源:卡夫卡,水槽,动感等。可以通过额外的实用程序类获得。这些需要链接到额外的依赖项,如链接部分。
    DStream有两个重要的组件:一个是源,一个是接收机

检查点有两种类型:
元数据检查点
数据检查点

检查点不能万能的;以下几种类型,无法从检查点中恢复
累加器
广播变量

  • Stream窗口操作
    .性能调优
    SparkSteam性能调优
    通过有效地使用集群资源,减少了每一批数据的处理时间。
    设置正确的批处理大小,以便能够以接收到的速度处理数据批次(也就是说,数据处理与数据摄入保持一致)。

数据序列化有两种:
输入的数据必须序列化
流数据生成的RDD当我们调用持久化的时候序列化;
序列化工具:kryo(spark),avro

其中批处理时间应该小于批处理间隔

数据处理有三步:在任何流处理系统中,广义地说,处理数据有三个步骤。
接收数据数据是从使用接收器或其他方式的来源接收的。
数据转换
接收到的数据使用DStream和RDD转换进行转换。
推送数据将最终转换的数据推送到外部系统,如文件系统、数据库、仪表板等。

虽然有两个相关的配置,但是典型的用户不需要调整它们,因为默认值适用于大多数工作负载:
spark.memory.fraction表示…的大小M作为(JVM堆空间-300 MB)的一小部分(默认为0.6)。其余的空间(40%)保留给用户数据结构、SPark中的内部元数据,以及在稀疏和异常大的记录情况下防止OOM错误。
spark.memory.storageFraction表示…的大小R作为.的一小部分M(默认为0.5)。R中的存储空间M缓存的块不受执行驱逐的影响。

  • GC调优
    堆分为:老年代和新一代
    新一代分为:伊甸园,幸存1,幸存2