从多个来源收集和查询数据的最佳实践
作者: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 数据帧,因为它是一个如此流行的工具。
以下代码是在 InfluxDB 中使用 SQL 查询的示例,它返回过去一周内此特定设备(通过序列号)的平均电池电量
此查询将在应用程序端发生。当用户登录并注册其发电机的序列号时,这使您能够存储带有序列号标签的数据以用于过滤。为了便于阅读此查询,更容易想象所有发电机数据都进入一个大型数据库。实际上,更可能的是每个序列号都是一个唯一的数据存储,特别是如果您想为客户提供“付费延长数据存储时间”的机会,这对于某些企业和用例(如住宅太阳能电池板)来说是很常见的。
现在,这只是一个查询,但应用程序开发人员可能会编写多个此类查询,以涵盖每日和每周的平均值,并考虑电池使用量、电池电量和最新值等。最终,他们希望最终得到 10 到 20 个值,他们可以将其显示给最终用户。您可以在此处找到 InfluxDB 的所有这些函数的列表。
一旦他们拥有这些值,他们就可以将所有这些数据点与他们的 SQL 数据库(其中包含客户数据,例如姓名、地址等)结合起来。他们可以使用 InfluxDB Python 客户端库在 Pandas 中组合他们的两个数据集。
这是最终连接的示例。当涉及到连接时,Pandas 有一些选项。在此示例中,我使用内连接,因为我不想丢失来自我的两个数据集中的任何数据。您可能需要重命名一些列,但总的来说,此查询会生成一个组合的数据帧,然后您可以根据需要进行转换以供使用。
您可以想象数据科学家如何使用这些工具对数据集运行异常检测,以识别故障设备并提醒客户注意退化和需要的维修。如果存储数据需要收费,用户还可以将此数据与财务数据集结合起来,以确认哪些客户支付了延长的存储时间,并可能收到额外的信息。即使在这个简单的示例中,也有许多利益相关者,并且随着规模的扩大,需要访问和使用多个数据集的人数只会增加。
主要要点
在世界上有如此多数据的情况下,将所有内容存储在单个数据库或数据存储中的想法可能看起来很诱人。(需要明确的是,您可能希望将所有相同类型的数据存储在单个数据库中,例如,时间序列数据。)虽然这在小规模上可能是一个可行的解决方案,但现实情况是,小型和大型公司都可以从利用多个数据来源带来的成本节约、效率提升和增强的用户体验中受益。随着行业的发展,工程师必须适应并精通使用多个数据存储,并且从不同来源无缝收集和查询数据的能力变得越来越重要。采用这种方法使组织能够充分利用其数据的潜力,并使工程师能够轻松驾驭不断扩展的数据管理领域。