Stream 分布式数据流的轻量级异步快照

  • 时间:
  • 浏览:0

原文: http://pdfs.semanticscholar.org/541e/cf8c5b9db97eb5fcd1ffdf863d948b8954cc.pdf

让.我 测量了在不同快照间隔下 ABS 和同步快照四种 快照方案运行的运行时间开销。让.我 实现了在 Apache Flink Naiad 上使用的同步快照算法,以便在相同终端上执行进行比较。该实验在10节点集群上运行。为了评估让.我 算法的可伸缩性,让.我 解决固定数量的输入记录(10亿),一齐将让.我 拓扑的并行度从好几个 增加到40个节点。

对于可行性,足以证明在全局快照中的算子具体情况仅反映了直到最后阶段解决的记录的历史过程。这并能 通过 channels 的 FIFO 顺序特性以及 barrier 完正接收事先阻塞 input channels 保证 stage 的 post-shot 记录不想在快照生成事先解决。

让.我 定义了曾经执行图 G =(T,E) 的全局快照 G * =(T *,E *),其中 T * 和 E * 分别表示所有任务和边的具体情况集合。更完正地说,T * 由所有算子具体情况 St * ∈ T * 组成, ∀t ∈ T, E * 是所有 channels 具体情况 e * ∈ E * 的集合,其中 e * 由在 e 上传输的记录组成。

分布式有具体情况流解决支持在云中部署和执行大规模连续计算,主要针对低延迟和高吞吐量。你或多或少模式的曾经最根本的挑战可是我在事先的失败具体情况下提供解决保证。现有法子 依赖于可用于故障恢复的周期性全局具体情况快照。那先 法子 有曾经主要缺点。首先,让.我 无缘无故拖延影响数据摄取的整体计算过程。其次,持久化存储所有传输中的记录以及算子具体情况,这会是原因比所需的快照要更大。

这里所说的新型的快照算法,既适用于有向无环图,也适用于有向有环图。本文重点关注在有向无环图中的应用。

Apache Flink 围绕通用运行时引擎进行架构,并能 统一解决批解决和流式作业。Flink 中的作业被编译成任务的有向图。数据元素从内外部数据源获取,并以流水线法子 通过任务图。基于接收到的输入,任务不断操作其内内外部具体情况,并产生新的输出。

当曾经执行过程被分成多个阶段 (stage),在不保留 channels 具体情况的具体情况下执行快照是可行的。stage 将注入的数据流和所有相关的计算划分为一系列事先的执行过程,其中所有先前的输入和中成的输出事先完正解决。在曾经 Stage 开始英语 了时的算子具体情况集合反映了整个执行历史,以后它并能 用于快照。让.我 算法头上的核心思想是在保持连续数据摄入的一齐使用分段快照创建一致性快照(create identical snapshots with staged snapshotting)。

仅通过重新调度上游任务依赖(其蕴含到失败任务的 output channels)以及它们其他人直到 source 的上游任务,重新恢复调度每段图也是事先的。下图显示了曾经恢复示例。为了提供 exactly-once 的语义,应该在所有下游节点中忽略重复记录以解决重新计算。为了达到你或多或少目的,让.我 用来自source 的序列号标记记录,以后,每个下游节点都并能 丢弃序号小于让.我 事先解决的记录。

如前所述,快照算法应该保证最终性和可行性。最终性由通道和非循环执行图属性保证。channels 的可靠性确保倘若任务存活,发送的每个 barrier 最终完正都是被接收的。此外,事先始终地处来自 source 的一条路径,以后 DAG 拓扑中的每个任务最终都将从其所有 input channels 接收 barrier 并生成快照。

(3) 当收到来自所有输入的 barrier 时,该任务会生成当前具体情况的曾经快照并将其 barrier 广播到其输出(第12-13行 图2(c))。

评估的目标是将 ABS 的运行时间开销与 Naiad 中采用的全局同步快照算法进行比较,并测试算法在大数量节点上的可伸缩性。用于评估的执行拓扑特性(如下图)由6个不同的算子组成,其并行度等于集群节点的个数,转换为 6 * 集群大小 个任务顶点。执行蕴含好几个 完正的网络 shuffle,以突显 ABS 中通道阻塞的事先影响。source 产生总共10亿条记录,那先 记录在 source 实例中均匀分布。拓扑中算子的具体情况是按键的聚合以及 source 的偏移量。在 Amazon EC2 集群上使用多达40个 m3.medium 实例在运行实验。

下面的代码示例中显示了咋样在 Apache Flink 中实现简单的 Word Count 应用程序池池。在此应用程序池池中,从文本文件中读取单词,并将每个单词的当前计数打印到标准输出上。这是曾经有具体情况的流解决应用程序池池,什么都数据源并能 知道它们在文件中的当前偏移量,以后并能 计数器来将每个单词的当前计数保持在内内外部具体情况中。

在下图中,让.我 描述了四种 算法对基线的运行时影响(无容错)。当快照时间间隔较小时,同步快照的性能影响尤其明显。这是事先系统花费更多时间来获取全局快照而完正都是解决数据。ABS 对运行时的影响要低得多,事先它并能 持续运行而不想阻碍整体执行,一齐保持相当稳定的吞吐率。当快照时间间隔变大时,同步算法的影响逐渐变小。

为了区分算子具体情况和数据,让.我 引入了曾经显式的 OperatorState 接口,该接口蕴含更新具体情况以及对具体情况进行检查点的法子 。让.我 为 Apache Flink 支持的有具体情况运行时算子(累似 基于偏移量的源或聚合)提供了 OperatorState 实现。

在下图中,让.我 使用3秒快照间隔的 ABS 拓扑与基准(无容错)进行比较可扩展性。很明显,基准作业和 ABS 都实现了线性可扩展性。

在这提供关于故障恢复操作的简要说明。有几种故障恢复方案可用于一致性快照。最简单的是,整个执行图并能 从上曾经全局快照重新启动,每个任务 t ,如下所示:

并能 从内外部来源(累似 消息队列,套接字流,自定义生成器)或通过调用或多或少 DataStream 上的操作来创建 DataStreamsDataStreams 支持多种算子,如 mapfilter 和 reduce 等形式的高阶函数,那先 函数在每个记录上逐步应用并生成新的 DataStream。每个算子并能 通过将并行实例放置在相应流的不同分区上运行来并行化,从而允许分布式执行流转换。

让.我 向 Apache Flink 提供了 ABS 算法的实现,以便为流式运行提供 exactly-once 解决语义。在让.我 当前的实现中,阻塞通道将所有传入的记录存储在磁盘上,而完正都是将它们保地处内存中以增加可扩展性。确实此技术可确保鲁棒性,以后增加 ABS 算法的运行时影响。

让.我 确保每个快照 G * 都保留或多或少属性,累似 最终性 Termination 和可行性 Feasibility,以便在故障恢复后保证结果的正确性。最终性保证,事先所有应用程序池池都地处活跃具体情况,没办法 快照算法最终会在启动后的有限时间内完成。可行性表达了快照的意义,即在快照过程中关于计算的信息不想丢失。

算法执行过程如下:

在让.我 的法子 中,在持续的数据流执行中模拟 stage 是通过向数据流中周期性注入特殊屏障 barrier 标记完成的,那先 标记在整个执行图中无缘无故传输到 sink。全局快照是随着每个任务接收表示执行 stage 的 barrier 而逐步构建的。 让.我 进一步为让.我 的算法做出以下假设:

当用户执行曾经应用应用程序池池时,所有的 DataStream 算子都将编译成曾经执行图,原理上为曾经有向图 G =(T,E),其中顶点 T 表示任务,边 E 表示曾经任务之间的 data channels。上图就描绘了曾经 Word Count 例子的执行图。如图所示,算子的每个实例都封装下 相应的任务上。任务并能 进一步细分为没办法  input channels 的 Source 以及没办法  output channels 的 Sink。此外,M 表示任务在并行执行期间传输的所有记录的集合。每个任务 t ∈ T 封装了曾经算子实例的独立运行,其由以下内容组成:

(4) 以后,该任务解除输入通道的阻塞来继续后续的计算(第15行,图2(d))。完正的全局快照 G * =(T *,E *) 仅蕴含所有算子具体情况 T *,其中 E * = 0

(1) 中央协调器周期性的给所有 source 注入 stage barrier(黑色实线)。当 source 接收到 barrier 时,会为当前的具体情况生成曾经快照,以后将 barrier 广播到它的所有输出中(图(a))。

原文来源:Stream 分布式数据流的轻量级异步快照

伪代码如下:

(2) 当曾经非 source 任务接收到其中曾经输入的 barrier 时,它会阻塞该输入,直到它接收到来自所有输入的 barrier(第9行 图2(b))。

为了提供一致性结果,分布式解决系统并能 对失败任务进行恢复。提供你或多或少弹性的四种 法子 是定期捕获执行图的快照,以后并能 用它来从故障中恢复。快照是执行图的全局具体情况,捕获所有必要信息以从该特定执行具体情况重新开始英语 了计算。

在地处有向循环的执行图中的具体情况下,底下的 ABS 算法不想终止而会是原因死锁,事先曾经循环中的任务将无限期地等待英文接收来自其所有输入的 barrier。此外,在循环中传输的记录不想蕴含在快照中,以后违反了可行性。以后,为了可行性并能 在快照中蕴含在循环中生成的所有记录,并在恢复时将那先 记录重新传输。让.我 解决循环图的法子 继承了基本算法,而不想像底下算法中想看 的那样引起任何额外的 channels 阻塞。首先,让.我 通过静态分析来识别执行图中循环中的 back-edge L。根据控制流图理论,有向图中的 back-edge 是地处深度图优先搜索中事先访问过的顶点的边。执行图 G(T,E \ L) 是曾经蕴含拓扑中所有任务的 DAG。从该 DAG 的深度图来看,该算法与事先一样运行,以后,让.我 并能 在快照期间对下游 back-edge 接收的记录进行备份。barrier 将循环中的所有记录都推送到下游日志中,以便将它们蕴含在一致的快照中。

以后,提出了四种 新的分布式快照的算法,即在 Apache Flink 中的异步屏障快照(Asynchronous Barrier Snapshotting (ABS))。这是四种 适用于现代数据流执行引擎的轻量级算法,可最大限度地减少空间需求,让快照地处时对系统的影响降到最低。你或多或少算法不想停止流解决,它只会引入很少的运行时间开销,以后对于整个无环图的拓扑特性,只对有具体情况的算子进行快照,以后快照的大小只会占用很小的空间。该算法不想对执行产生重大影响,保证线性可伸缩性,以后并能 在频繁的快照下正常运行。

让.我 的目的是解决在分布式数据流系统上执行定期全局快照的疑问。让.我 引入了 ABS,这是四种 新的快照技术,可实现良好的吞吐量。ABS 是第四种 考虑非循环执行拓扑的最小事先具体情况的算法。此外,让.我 通过仅存储并能 在恢复时重新解决的记录来扩展 ABS 以在循环执行图上使用。让.我 在 Apache Flink 上实现了 ABS,并对比同步快照算法评估了让.我 算法的性能。在早期阶段,ABS 显示出良好的结果,对整体执行吞吐量影响较小并具有线性可扩展性。