5个版本
新版本 0.2.1 | 2024年8月22日 |
---|---|
0.2.0 | 2024年7月13日 |
0.1.2 | 2024年5月27日 |
0.1.1 | 2024年4月29日 |
0.1.0 | 2024年4月24日 |
#75 in 嵌入式开发
每月64次下载
370KB
7.5K SLoC
µWheel
µWheel 是一个适用于流和查询的嵌入式聚合管理系统。
功能
- 流窗口聚合
- 内置仓储功能
- 基于Wheel的查询优化器 + 向量化执行。
- 使用
low watermarking
支持乱序。 - 高吞吐量流摄取。
- 用户定义的聚合。
- 低空间占用。
- 增量检查点支持。
- 与
#[no_std]
兼容(需要alloc
)。
我应该什么时候使用 µWheel?
µWheel 统一了在线流和离线分析查询的聚合管理。µWheel 不是一个通用解决方案,而是一个针对预定义聚合函数定制的专用系统。
µWheel 是一个很好的选择,当
- 您事先知道聚合函数。
- 您需要高吞吐量乱序流摄取。
- 您需要支持流窗口查询(例如,滑动/滚动)。
- 您需要支持历史数据的探索性分析。
- 您需要一个轻量级且高度可嵌入的解决方案。
示例用例
预定义聚合器
函数 | 描述 | 类型 | SIMD |
---|---|---|---|
求和 | 所有输入的和 | u16, u32, u64, i16, i32, i64, f32, f64 | ✓ |
MIN | 所有输入的最小值 | u16, u32, u64, i32, i16, i64, f32, f64 | ✓ |
MAX | 所有输入的最大值 | u16, u32, u64, i16, i32, i64, f32, f64 | ✓ |
MINMAX | 所有输入的最小和最大值 | u16, u32, u64, i16, i32, i64, f32, f64 | ✗ |
AVG | 所有输入的算术平均值 | u16, u32, u64, i16, i32, i64, f32, f64 | ✗ |
ALL | 预计算的 SUM, AVG, MIN, MAX, COUNT | f64 | ✗ |
TOP N | 所有输入中的前N个 | Aggregator ,实现Ord 的聚合数据 |
✗ |
查看用户定义的聚合器示例这里。
特性标志
std
(默认启用)- 启用依赖标准库的特性
sum
(默认启用)- 启用求和聚合
avg
(默认启用)- 启用平均值聚合
min
(默认启用)- 启用最小值聚合
max
(默认启用)- 启用最大值聚合
min_max
(默认启用)- 启用最小-最大聚合
all
(默认启用)- 启用所有聚合
top_n
- 启用 Top-N 聚合
simd
(需要nightly
)- 启用支持使用 SIMD 操作加速聚合函数
sync
(隐式启用std
)- 启用可跨线程共享和查询的
ReaderWheel
的同步版本
- 启用可跨线程共享和查询的
profiler
(隐式启用std
)- 启用记录各种操作的延迟
serde
- 启用 serde 支持
timer
- 启用调度用户定义的函数
使用方法
用于 std
支持和内置聚合器的编译
uwheel = "0.2.1"
用于 no_std
支持和最短编译时间
uwheel = { version = "0.2.1", default-features = false }
示例
以下代码来自 hello world 示例。
use uwheel::{aggregator::sum::U32SumAggregator, WheelRange, NumericalDuration, Entry, RwWheel};
// Initial start watermark 2023-11-09 00:00:00 (represented as milliseconds)
let mut watermark = 1699488000000;
// Create a Reader-Writer Wheel with U32 Sum Aggregation using the default configuration
let mut wheel: RwWheel<U32SumAggregator> = RwWheel::new(watermark);
// Install a Sliding Window Aggregation Query (results are produced when we advance the wheel).
wheel.window(Window::sliding(30.minutes(), 10.minutes()));
// Simulate ingestion and fill the wheel with 1 hour of aggregates (3600 seconds).
for _ in 0..3600 {
// Insert entry with data 1 to the wheel
wheel.insert(Entry::new(1u32, watermark));
// bump the watermark by 1 second and also advanced the wheel
watermark += 1000;
// Print the result if any window is triggered
for window in wheel.advance_to(watermark) {
println!("Window fired {:#?}", window);
}
}
// Explore historical data - The low watermark is now 2023-11-09 01:00:00
// query the wheel using different intervals
assert_eq!(wheel.read().interval(15.seconds()), Some(15));
assert_eq!(wheel.read().interval(1.minutes()), Some(60));
// combine range of 2023-11-09 00:00:00 and 2023-11-09 01:00:00
let range = WheelRange::new_unchecked(1699488000000, 1699491600000);
assert_eq!(wheel.read().combine_range(range), Some(3600));
// The following runs the the same combine range query as above.
assert_eq!(wheel.read().interval(1.hours()), Some(3600));
查看更多示例 这里。
致谢
- µWheel 从 egui crate 借用了脚本。
- µWheel 使用了来自 time crate 修改过的 Duration。
- µWheel 对 @Bathtor 制作的 分层定时轮 进行了软分叉。
贡献
查看 贡献。
社区
如果你觉得 µWheel 很有趣并且想了解更多,那么加入 Discord 社区吧!
出版物
- Max Meldrum,Paris Carbone(2024)。µWheel:流和查询的聚合管理(《最佳论文奖》)。在 DEBS '24。[PDF]。
博客文章
- 介绍 datafusion-uwheel:基于时间的分析的本机 DataFusion 优化器 - 2024年8月
- 最佳论文奖 + 0.2.0 版本发布 - 2024年7月
- 使用 µWheel 提高 DataFusion 的时间聚合速度 60-60000 倍 - 2024年5月
引用 µWheel
@inproceedings{meldrum2024uwheel,
author = {Meldrum, Max and Carbone, Paris},
title = {μWheel: Aggregate Management for Streams and Queries},
booktitle = {Proceedings of the 18th ACM International Conference on Distributed and Event-Based Systems},
year = {2024},
pages = {54--65},
doi = {10.1145/3629104.3666031}
}
许可证
在以下许可证下授权:
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖
~0.7–9MB
~66K SLoC