[Spark]-结构化流之输出篇

Posted nightpxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spark]-结构化流之输出篇相关的知识,希望对你有一定的参考价值。

5.结构化流的输出

  一旦定义好了streaming DataFrame/Dataset的最终结果,剩下的就是一些计算输出了.为此,必须使用 DataStreamWriter通过 Dataset.writeStream() 返回.此时必须以下一个或多个

   输出落地 的详细信息:  Data format, location 等等

   输出模式(Output mode)

   查询名称(Query name)  可选,指定用于标识的查询的唯一名称

   触发器间隔(Trigger interval):可选地,指定触发间隔。如果没有指定,系统将检查尽快获得新数据前处理完成。如果一个触发时间错过了,因为前面的处理还没有完成,则系统将触发立即处理

   检查点位置(Checkpoint location) 对于可以保证 end-to-end fault-tolerance (端对端容错)能力的某些 output sinks ,请指定系统将写入所有 checkpoint (检查点)信息的位置。

                   这应该是与 HDFS 兼容的容错文件系统中的目录.

  5.1 输出模式

    追加(append)(默认) 这是默认的模式.在上次触发后,只有新行添加到结果表(result-table)才会触发。

             这是只支持那些查询,行添加到结果表永远不会改变,因为这种模式保证每一行将只输出一次。例如,只有选择查询,地图,flatMap,过滤,加入等将支持附加模式

    完全(complete) 每次触发时都会将整个结果表(result-table)输出.例如聚合结果等

    更新(update) 只有结果表在上次被触发后被更新才会触发

    不同的查询支持不同的输出模式,具体见下:

查询类型   支持模式 描述
带聚合的查询 聚合带事件时间的水印 Append, Update, Complete

Append 使用水印来删除旧的聚集状态 窗口将在水印最终阈值的时候聚合.所以结果将在水印过期,最终结果确定的情况下添加进结果表

Update 使用水印来删除旧的聚集状态

Complete 不会使用水印来删除旧的聚集状态

不带水印的聚合 Complete, Update 由于没有使用水印,旧的聚集状态不会被删除.不支持append,因为对整数据的聚合结果会不断更新,不符合append的语义
mapGroupsWithState Update  
flatMapGroupsWithState 追加操作模式 Append flatMapGroupsWithState 之后允许 Aggregations (聚合)
  更新操作模式 Update flatMapGroupsWithState 之后不允许 Aggregations (聚合)。
带join的查询 Append join不支持Update,Complete模式
其它查询 Append, Update 不支持Complete.因为非聚合数据的结果表,全部保存进结果表时不允许的

  5.2 输出落地

      5.2.1 落地文件

    5.2.2 落地Kafka

    5.2.3 落地控制台(debug使用)

    5.2.4 落地Memory接收器(debug使用)

    5.2.5 foreach

       foreach落地,是用户自定义输出的一种方式.foreach需要用户实现 ForeachWriter 类.实际处理取决于用户如何实现.(foreach只能使用在Scala/Java中)

      它将在触发器(trigger)之后生成结果行时调用一个用户实现.

      注意: foreach的实现载体是多个executor中的某一个

      5.2.5.1 实现

        open: writer 初始化时执行(例如打开连接,开启事务等).它具有两个入参: version=>每个触发器单调递增的ID  partitionId =>分区ID.

           open将返回一个布尔值.当为false时,后续将不会产生任何调用.用户可以根据自己的逻辑,用这个返回值指出本次输出后续是否还有必要执行

        proccess:根据open的返回值决定是否需要执行.

        close:无论open返回什么值,close必然会执行.这里适合用户做一些资源回收操作

    5.2.6 输出落地可以承载的输出模式

 

接收器 支持的输出模式 可选项 容错机制 备注
文件 Append path 支持容错(有且仅有一次) 支持分区
kafka Append, Update, Complete 详见kafka专章 支持容错(最少一次)  
foreach Append, Update, Complete   取决于foreach的实现  
控制台 Append, Update, Complete numRows:每次打印的行数(默认20),truncate:输出太长时截断(默认true) 不支持容错  
内存 Append, Complete   不支持容错,但重启时重建整张结果表  

以上是关于[Spark]-结构化流之输出篇的主要内容,如果未能解决你的问题,请参考以下文章

[Spark]-结构化流之初始篇

[Spark]-结构化流之监控&故障恢复篇

JAVA SE基础篇52.装饰流之数据流对象流和打印流

Java中的IO流之输入流|乐字节

IO流之字符输入流,字符输出流

Spark核心原理(核心篇 二)