使用 2.0 Python 客户端将数百万个点从 CSV 写入 InfluxDB
作者:Anais Dotis-Georgiou / 产品, 用例, 开发者
2019 年 12 月 30 日
导航至
之前我们向您展示了如何使用 Telegraf 将点从 CSV 写入 InfluxDB。今天,我们将学习如何使用本地计算机上的 InfluxDB Python 客户端在几秒钟内将数百万个点写入 InfluxDB 2.0。本博客和本次练习的灵感来自 Mark Litwintschik 的基准测试。在该基准测试中,Mark 比较了 十亿出租车行程数据集中数据针对多个数据库的查询时间。 InfluxDB 未包含在基准测试中,但我们认为不妨试一试并分享我们的结果。
2.0 InfluxDB Python 客户端基准测试
由于 InfluxDB 是开源 TSDB,并且由于 Mark 的基准测试使用付费实例,我们决定修改基准测试以突出显示 OSS 版本的性能。我们希望让您对您在家中可以执行的数据摄取类型感到兴奋。对于我们的基准测试,包含 460 万个数据点(十亿出租车行程数据集的一部分)的 CSV 写入 InfluxDB。
以下是基准测试的结果
InfluxDB 2.nightly 2019.10.24 | ||
方法 | 数据点 | CPU [秒] |
通过 HTTP POST 的 Line Protocol | 1,193,288 | 412 |
Python(RX) 单线程 | 4,600,000* | 21 |
基准测试条件:1 分钟测试
- 数据:2,000 个线程,自动批处理(如果客户端支持)
- 每个线程以 1 秒间隔写入 100 个数据点
- 硬件:Linux 5.2.9-1,AMD Ryzen 7 3700X 8 核,16GB
- ReactiveX 参数:刷新间隔 10 毫秒,批量大小 200,000
- Telegraf 参数:metric_batch_size,metric_buffer_limit 对结果没有影响
- Python 3.7,单线程 batch_size 50000,flush_interval 10000
新型 InfluxDB Python 客户端的多处理能力比 HTTP POST 大约高出 3 个数量级。
<figcaption> 我喜欢 InfluxDB Python 客户端 </figcaption>
使用 2.0 Python 客户端将 CSV 多进程写入 InfluxDB 的速记
此基准测试的脚本可以在此处找到。要了解如何使用 2.0 InfluxDB Python 客户端,请阅读此博客或查看客户端仓库。关于该脚本需要注意的要点包括
- 第 44 行:创建 InfluxDBWriter 类,并包含您要从中读取数据的 CSV 文件的 URL。
- 第 46 行:将 batch_size 和 flush_interval 分别配置为 50,000 和 10,000,以适应更大的写入批次。
- 第 93-100 行:在此处指定您的标签、字段和时间戳。
- 第 158 行:将 InfluxDBWriter 实例化为多处理进程。
- 第 164 行:创建进程池以进行并行编码。
- 第 179 行:将传入的 HTTP 流转换为 Line Protocol 序列后,将数据写入 InfluxDB。
要求:请注意,您需要 Python 3.7 才能执行多处理。我建议设置额外的工具,例如 virtualenv、pyenv 或 conda-env。
结论
新型 Python 客户端的写入速度非常快。我想不到在很多情况下我需要将数百万个点写入我的机器,但有时尝试一下也很有趣。我使用了 此脚本写入了 出租车数据集的前 100 万个点。我将该数据集的一部分保存到本地保存的 CSV 文件中。我在带有 Python 3.7 的 Conda 环境中运行了客户端,并写入了本地 InfluxDB v2.0.0 Alpha 实例。观察系统和数据库性能指标对于执行此类基准测试非常有用,因为它们可以帮助突出显示性能问题并促进调整。我使用 InfluxDB Cloud 监控我的本地 InfluxDB 实例和我的系统,以了解我的机器的性能如何。
我使用了预构建的 仪表板模板,以便一目了然地查看我的系统统计信息和 InfluxDB 指标。我能够在 2 分 32 秒内写入 100 万个点,但正如您所见,确实存在一些瓶颈。查看 InfluxDB 监控仪表板,我们可以看到本地对象存储 IO 峰值,内存使用率也是如此。
<figcaption> 在 InfluxDB Cloud 上监控我的本地 InfluxDB v2.0.0 Alpha 实例 </figcaption>
系统统计信息仪表板显示我的系统负载和磁盘 IO 非常高。我还注意到我的 CPU 使用率和内存使用率是合理的。这表明我或许可以更改我的批量大小,通过利用更多 CPU 和内存来提高我的性能。
<figcaption> 系统统计信息仪表板,包含磁盘使用率、CPU 使用率、系统负载、内存使用率和磁盘 IO。Usage_Idle(浅蓝色) </figcaption>
最后,我认为重要的是要记住,我在我的机器上的 Alpha 版本(在运行其他进程时...哎呀)上实现了这种类型的性能。想象一下 Beta 版(优先考虑稳定性和性能)会是什么样子!我希望这个基准测试能让您思考时序的可能性。与往常一样,如果您遇到障碍,请在我们的社区站点或Slack频道上分享它们。我们很乐意获得您的反馈并帮助您解决遇到的任何问题。