从多个来源收集和查询数据的最佳实践
作者:Zoe Steinkamp / 开发者
2023年8月14日
导航到
本文最初发表在The New Stack上,并经授权在此重发。
在当今以数据驱动为主的世界里,从多个来源收集和查询数据的能力已成为一个非常重要的考虑因素。随着物联网、云计算和分布式系统的兴起,组织面临着有效处理各种数据流的挑战。通常会有多个数据库/数据存储选项来存储这些数据。对于许多大型公司来说,将所有数据存储在单一数据库中的时代已经过去。
实施最佳实践以高效收集和查询数据对于最大限度地发挥数据存储库的潜力至关重要。这包括优化数据摄取管道、设计适当的模式结构和利用高级查询技术。在此基础上,您还需要能够灵活查询数据回出且与其他数据存储兼容的数据存储。
通过遵循这些最佳实践,组织可以挖掘数据的真正价值,并获取可操作的见解以推动业务增长和创新。这正是强大时序数据库InfluxDB的用武之地。InfluxDB提供了强大的解决方案,用于管理和分析时间戳数据,使组织能够根据实时见解做出明智的决策。
理解不同的数据来源
在数据收集方面,探索不同的数据来源并理解它们的独特特征至关重要。这包括确定可用的数据类型、它们的格式以及与每个来源相关的潜在挑战。在确定数据来源后,选择适当的数据摄取方法变得至关重要。这涉及利用API、使用Telegraf插件或实现批量写入,具体取决于数据来源的特定要求和约束。
保持数据空间和速度非常重要。例如,我们发现物联网数据中这些都是主要关注点。确保在整个收集过程中数据的完整性和一致性至关重要。同样重要的是要有数据丢失、流损坏和边缘存储的备份计划。这涉及实施强大的机制来处理错误、处理重复或缺失数据以及验证收集数据的准确性。此外,实施适当的数据标记和组织策略有助于提高数据管理和检索效率。通过使用相关元数据标记数据并以结构化方式组织,可以更有效地进行搜索、过滤和分析。
在此处需要注意的是,大多数数据存储解决方案都附带有关如何开始收集数据到系统中的推荐。对于InfluxDB,我们始终建议使用我们的开源数据采集代理Telegraf。或者,对于特定语言的需求,我们建议使用我们用Go、Java、Python、C#和JavaScript编写的客户端库。这里的重要启示是选择推荐且文档齐全的工具。虽然使用你熟悉的工具可能很诱人,但如果它没有被推荐,你可能会错过处理问题的那些机制。
有效的数据建模
有效的数据建模是构建健壮和可扩展数据系统的关键方面。这涉及到理解数据实体的结构和关系,并设计便于高效数据存储、检索和分析的模式。良好的数据模型为数据提供清晰性、一致性和完整性,确保其准确性和可靠性。在处理多个数据源时,最重要的部分是确定你的“连接器”,即连接你的数据的那个数据片段。
例如,让我们看看一个有两个单独数据集的生成器:一个在存储单元统计信息的SQL数据库中,另一个在包含电池容量实时数据的InfluxDB数据库中。你可能需要根据这两个数据集识别出有故障的生成器和其所有者。在这些两个数据集之间似乎有一个共享ID似乎是常识。但在最初建模数据时,考虑的不仅仅是能够合并数据集,更多的是主要数据用途和删除不必要的数据。另一个问题是:你的连接器有多独特,存储起来有多容易?在这个例子中,实时电池存储可能无法轻松访问序列号。这可能需要添加到从生成器收集的所有数据中的硬编码值。
此外,随着数据随时间演变和出现变化,采用有效处理这些变化的策略变得至关重要。这可能涉及版本控制、迁移脚本或实施动态模式设计以适应新的数据属性或修改现有的数据属性等技术。
例如,如果我们的生成器添加了新的数据集,我们很重要的一点是将其原始连接器添加到新的数据中。但是,如果你正在处理现有数据集怎么办?那么事情就变得复杂了。你可能需要回过头来追溯性地实施你的连接器。在这个例子中,可能是一个应用程序,人们注册他们的生成器并查看他们的电池信息,你需要他们手动输入他们的序列号。这允许你将他们标记为所有者,然后你可以从远处运行分析以确定设备是否在正常范围内。
显然,这是一个非常简单的例子,但许多公司和行业都在使用这个概念。数据孤立存在的想法正在逐渐消失,因为许多利益相关者期望访问多个数据源,并有一种简单的方法来合并数据集。因此,让我们开始探讨如何组合数据集。让我们从之前的例子继续,即InfluxDB和SQL数据库的常见用例,这是合并数据的用例。
在查询您的数据时,尤其是在组合数据集时,有一些推荐的工具可以帮助您完成这项任务。首先是SQL,它被广泛用于查询多个数据源,包括InfluxDB。而在数据操作和分析方面,第二个工具Pandas则适用于灵活高效的数据处理。Pandas是一个Python库,对它接受的数据没有限制,只要它是Pandas数据框内的数据。许多数据源都记录了如何将数据流转换为Pandas数据框,因为这是一个非常流行的工具。[Pandas](https://pandas.ac.cn/getting_started.html)。
以下是一个InfluxDB中SQL查询的示例,它返回过去一周该特定设备(通过序列号)的平均电池水平。
此查询将在应用端进行。当用户登录并注册其发电机的序列号时,这使您能够使用序列号标签存储数据以进行过滤。为了便于阅读此查询,想象所有发电机数据都进入一个大型数据库会更简单。实际上,更有可能的情况是每个序列号都是一个独特的数据存储,尤其是如果您想为客户提供“付费存储数据更长”的机会,这是某些企业和用例(如住宅太阳能板)的常见优惠。
现在,这只是查询中的一个例子,但应用开发者可能会编写几个这样的查询来覆盖日和周的平均值,以及电池使用情况、电池水平和最新值等。最终,他们希望得到10到20个可以展示给最终用户的值。您可以在[这里](https://docs.influxdb.org.cn/influxdb/cloud-serverless/reference/sql/functions/)找到InfluxDB中所有这些函数的列表。
一旦他们有了这些值,他们就可以将所有这些数据点与存储客户数据的SQL数据库相结合,例如姓名、地址等。他们可以使用InfluxDB的Python客户端库[Python客户端库](https://github.com/InfluxCommunity/influxdb3-python)将他们的两个数据集在Pandas中结合起来。
以下是最终连接的示例。在连接方面,Pandas有几个选项。在这个例子中,我使用的是内连接,因为我不想丢失两个数据集中的任何数据。您可能需要重命名一些列,但总体而言,这个查询的结果是一个可以按需转换以使用的合并数据框。
您可以想象数据科学家如何使用这些工具在数据集中运行异常检测以识别故障设备,并提醒客户注意设备的退化以及所需的维修。如果存储数据有费用,用户还可以将此数据与财务数据集相结合,以确认哪些客户支付了延长存储时间,并可能获得额外信息。即使在这样一个简单的例子中,也有许多利益相关者,在规模扩大时,需要访问和使用多个数据集的人数只会增加。
关键要点
在世界上有如此多的数据,将所有数据存储在单个数据库或数据存储库中的概念可能看起来很有吸引力。(为了明确起见,您可能希望将所有相同类型的数据存储在单个数据库中,例如时间序列数据。)虽然这在小规模上可能是一个可行的解决方案,但现实情况是,无论是小型还是大型公司,都可以从利用多个数据源带来的成本节约、效率提升和用户体验提升中受益。随着行业的不断发展,工程师必须适应并精通与多个数据存储库一起工作的能力,并且从不同来源无缝收集和查询数据的能力变得越来越重要。采用这种做法使组织能够充分利用其数据潜力,并使工程师能够轻松地驾驭不断扩大的数据管理领域。