1 个不稳定版本
0.1.0 | 2019年8月14日 |
---|
#994 在 数据结构
10KB
125 行
SnailTrail 2 (ST2)
SnailTrail 2 (简称 ST2) 是 SnailTrail 的分支,一个用于在多种流处理器上运行在线关键路径分析的工具(参见SnailTrail NSDI'18 论文)。
有关其实施的详细信息,请参阅我的 论文。
如果您正在寻找一个仅用于分析 Timely & Differential Dataflows 的轻量级替代方案,请查看 st2 lite。
该分支在原始仓库的基础上实现了分析流处理器的更多算法。它目前专注于 Timely Dataflow 和 Differential Dataflow 的 0.10 版本,并且不会避免打破现有的上游抽象(尽管在以后某个时间点它们应该相对容易添加回来)。
命名约定
类似于 Timely Diagnostics,我们将正在分析的数据流称为 源计算。正在分析的数据流的工人是 源对等体,而我们将 ST2 的工人称为 ST2 对等体。
入门指南
1. 使用 st2-timely
将 ST2 连接到源计算
将 ST2 连接到任何源计算的 (A)
和 (B)
(示例可在 st2-timely/examples/minimal.rs
中找到)
use timely_adapter::connect::Adapter;
fn main() {
timely::execute_from_args(std::env::args(), |worker| {
// (A) Create SnailTrail adapter at the beginning of the worker closure
let adapter = Adapter::attach(worker);
// Some computation
let mut input = InputHandle::new();
let probe = worker.dataflow(|scope|
scope.input_from(&mut input)
.exchange(|x| *x)
.inspect(move |x| println!("hello {}", x))
.probe()
);
for round in 0..100 {
if worker.index() == 0 { input.send(round); }
input.advance_to(round + 1);
while probe.less_than(input.time()) { worker.step(); }
// (B) Communicate epoch completion
adapter.tick_epoch();
}
}).unwrap();
}
请确保将适配器放置在 timely 闭包的顶部。 否则,一些日志事件可能不会被 ST2 正确捕获。
2. 安装 ST2 CLI (st2
)
- 从项目根目录运行
cargo install --path st2 st2
- 探索 CLI:
st2 --help
3. 检查您的计算
例如,我们可能想查看使用2个ST2对等节点进行的在线2工作者源计算的网络仪表板。
- 运行以下命令以启动仪表板:
st2 -127.0.0.1 --p 1234 --s 2 --w 2 dashboard
。 - 通过运行以下命令将源计算附加到环境中:
SNAILTRAIL_ADDR="127.0.0.1:1234"
。 - 从源根目录打开
dashboard/index.html
。
命令
dashboard
创建一个交互式ST2仪表板。可选地,它可以与--epoch-max <MS> --message-max <MS> --operator-max <MS>
一起运行,以指定集成不变性检查器的最大时间、消息和操作持续时间。algo
运行ST2的图算法(目前,这是检测瓶颈原因的k-hop图模式)。结果记录到stdout
。invariants
运行ST2的不变性检查器。根据传递的标志(请参阅--help
),它检查最大时间、消息和操作持续时间,以及数据流中两次进度更新之间的最大时间间隔。违规行为记录到stdout
。metrics
导出源计算的聚合指标(有关示例,请参阅docs/metrics
)。尝试以下操作:st2 --f <path/to/dumps> --s <source peers> metrics
-> 查看metrics.csv
在线与离线
区别
- 在离线模式下,源计算按常规执行 — 在在线模式下,您将
SNAILTRAIL_ADDR=<IP>:<port>
作为环境变量传递。 - 在离线模式下,您首先启动源计算,然后是ST2 — 在在线模式下相反。
- 在离线模式下,您将
--f <path/to/dumps>
作为CLA传递 — 在在线模式下,您将--i <IP>
和--p <port>
传递。
使用示例
离线
- 运行源计算。这将在您的当前工作目录(
pwd
)中生成*.dump
文件。 - 使用ST2分析生成的离线跟踪:
st2 --f <path/to/dumps> --s <source peers> <subcommand>
在线
- 运行ST2:
st2 -<IP> -<port> -<source peers> <subcommand>
- 通过设置环境变量
SNAILTRAIL_ADDR=<IP>:<port>
来附加源计算。
示例
源计算
访问 timely-adapter/examples
获取源计算示例。
显示代码!
查看此 README
的 Structure
部分以获取高级概述。
“魔法”主要发生在
timely-adapter/src/connect.rs
用于记录计算timely-adapter/src/lib.rs
用于创建LogRecord
,st2/src/pag.rs
用于创建PAG
,以及inspect.rs
命令、triangles.rs
源计算和minimal.rs
源计算将它们全部结合起来。- 结构
st2/src/commands
中的各种命令利用PAG构建来在其上运行算法。
结构
概述
在此存储库中
类型 | 包 | 描述 |
---|---|---|
适配器 | st2-timely |
timely / 差分 0.9 适配器 |
基础设施 | st2-logformat |
核心数据类型的共享定义和跟踪的序列化。 |
基础设施,算法 | st2 |
为具有时序语义的timely生成PAG及算法。 |
上游
类型 | 包 | 描述 |
---|---|---|
适配器 | spark-parser |
Spark 适配器 |
适配器 | tensorflow |
TensorFlow 适配器 |
适配器 | Flink | 未公开 |
适配器 | Timely < 0.9 | 未公开 |
适配器 | Heron | 未公开 |
基础设施 | logformat |
核心数据类型的共享定义和跟踪的序列化(在Rust和Java中)。 |
基础设施 | pag-construction |
从表示计算和通信开始/结束的事件的平面流中构建程序活动图(PAG)。还包括生成各种图表的脚本。 |
算法 | snailtrail |
通过计算边出现在所有对最短路径集中的次数来计算PAG边的排名(“关键参与”,参见论文)。 |
适配器
适配器从流处理器(或序列化表示)读取日志跟踪,并将记录的消息转换为 logformat
的 LogRecord
表示形式。然后可以使用该表示形式进行PAG构建。
根据流处理器,窗口语义也在这里发挥作用。例如,当前的 timely-adapter
使用基于时序的窗口,这应该会使许多PAG上的算法比在固定窗口PAG上更容易。
基础设施
连接适配器和算法的粘合代码、类型定义、(反)序列化和中间表示。
算法
实现各种算法,这些算法在PAG上运行以提供对分析分布式数据流健康和性能的见解。运行 dashboard
子命令以查看我们计算的图模式、不变性和聚合度量的一些很好的总结。
文档
请参阅 docs
子文件夹以获取一些附加文档。当然,也可以查看 examples
和使用 cargo doc
构建的代码文档。
资源
- Malte Sandstede: 在线分析分布式数据流 (TUM '19)
- Hoffmann 等人: SnailTrail 论文 (NSDI '18)
- Malte Sandstede: SnailTrail 简介短文 (ETH '19)
- Vasia Kalavri: 朝着自我管理、可重新配置的流数据流系统迈进 (UGENT '19)
- Moritz Hoffmann: SnailTrail:通用关键路径以在线分析分布式数据流 (NSDI '18)
- Vasia Kalavri: 分布式数据流系统的在线性能分析 (O'Reilly Velocity London '18)
许可证
ST2 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,部分内容受各种类似 BSD 许可证的覆盖。
请参阅 LICENSE-APACHE 和 LICENSE-MIT 获取详细信息。
lib.rs
:
LogRecord
、Pair
二维时间类型的数据结构。一个 LogRecord
构成了来自各种流处理器的日志消息的统一 struct
表示。它是 PAG 构造开始的底层结构。
依赖项
~7MB
~71K SLoC