数据建模 - Amazon Timestream
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

数据建模

Amazon Timestream for 旨在收集、存储和分析来自应用程序和设备的时间序列数据,这些数据会发出一系列带有时间戳的数据。 LiveAnalytics 为了获得最佳性能,发送到 Timestream 的数据 LiveAnalytics 必须具有时间特征,并且时间必须是数据的典型组成部分。

Timestream for 允许您 LiveAnalytics 灵活地以不同的方式对数据进行建模,以满足您的应用程序需求。在本节中,我们将介绍其中的几种模式,并为您提供优化成本和绩效的指导方针。熟悉维度和度量概念 Amazon Timestream LiveAnalytics 等关键。在本节中,在决定是创建单个表还是创建多个表来存储数据时,您将详细了解以下内容:

  • 将哪些数据放在同一个表中,与何时要将数据分隔到多个表和数据库中。

  • 如何在 LiveAnalytics 多测量记录的 Timestream 与单测量记录之间进行选择,以及使用多测量记录进行建模的好处,尤其是在您的应用程序同时跟踪多个测量值时。

  • 将哪些属性建模为维度或度量。

  • 如何有效使用度量名称属性来优化查询延迟。

单桌与多桌

在应用程序中对数据进行建模时,另一个重要方面是如何将数据建模为表和数据库。Timestream 中的数据库和表 LiveAnalytics 是用于访问控制的抽象,用于指定 KMS 密钥、保留期等。Timestream 用于 LiveAnalytics自动对您的数据进行分区,旨在扩展资源以匹配应用程序的摄取、存储、查询负载和要求。

Timestream 中的表 LiveAnalytics 可以扩展到存储的 PB 级数据和每秒写入数十千兆字节的数据量。查询每小时可以处理数百 TB。Timestream 中的查询 LiveAnalytics 可以跨越多个表和数据库,提供联接和并集,让您可以无缝访问多个表和数据库中的数据。因此,在决定如何在 Timestream 中组织数据时,数据规模或请求量通常不是主要考虑的问题。 LiveAnalytics在决定将哪些数据放在同一个表中,而不是放在不同的表中,或者放在不同的数据库中的表时,以下是一些重要的注意事项。

  • 按表的粒度支持数据保留策略(内存存储保留、磁存储保留等)。因此,需要不同保留策略的数据需要放在不同的表中。

  • Amazon KMS 用于加密数据的密钥是在数据库级别配置的。因此,不同的加密密钥要求意味着数据需要存放在不同的数据库中。

  • Timestream for LiveAnalytics 支持在表和数据库的粒度上进行基于资源的访问控制。在决定将哪些数据写入同一个表,哪些数据写入不同的表时,请考虑您的访问控制要求。

  • 在决定将哪些数据存储在哪个表中时,请注意维度数量、度量名称和多度量属性名称的限制

  • 在决定如何组织数据时,请考虑您的查询工作负载和访问模式,因为查询延迟和编写查询的难易程度将取决于此。

    • 如果您将经常查询的数据存储在同一个表中,这通常会简化您编写查询的方式,这样您就可以经常避免编写联接、并集或公用表表达式。这通常还会降低查询延迟。您可以使用维度和度量名称上的谓词来筛选与查询相关的数据。

      例如,假设您存储来自六大洲设备的数据。如果您的查询经常访问来自各大洲的数据以获得全球汇总视图,那么将来自这些大洲的数据存储在同一个表中将使查询更易于编写。另一方面,如果您将数据存储在不同的表上,则仍然可以在同一个查询中合并数据,但是,您将需要编写一个查询来合并来自不同表的数据。

    • Timestream for 对您的数据 LiveAnalytics 使用自适应分区和索引,因此仅对与您的查询相关的数据向查询收费。例如,如果您有一个表存储来自六大洲一百万台设备的数据,如果您的查询中包含形式为WHERE device_id = 'abcdef'或的谓词WHERE continent = 'North America',则仅对设备或该大陆的数据进行查询收费。

    • 只要有可能,如果您使用度量名称将同一表中不同时发出或不经常查询的数据分开,那么使用诸如WHERE measure_name = 'cpu'查询之类的谓词,不仅可以获得计量优势,Timestream for LiveAnalytics 还可以有效地消除查询谓词中没有使用度量名称的分区。这使您能够将具有不同度量名称的相关数据存储在同一个表中,而不会影响查询延迟或成本,并且可以避免将数据分散到多个表中。度量名称本质上用于对数据进行分区和修剪与查询无关的分区。

多度量记录与单度量记录

Timestream for LiveAnalytics 允许您写入每条记录有多个度量(多度量)或每条记录单个度量(单度量)的数据。

多重测量记录

在许多用例中,您正在跟踪的设备或应用程序可能会在同一时间戳发出多个指标或事件。在这种情况下,您可以将同一时间戳发出的所有指标存储在同一个多指标记录中。也就是说,存储在同一多度量记录中的所有度量在同一行数据中显示为不同的列。

例如,假设您的应用程序正在从同时测量的设备发出诸如 cpu、内存和 disk_iops 之类的指标。以下是此类表的示例,其中同时发出的多个指标存储在同一行中。你会看到两台主机每秒发出一次指标。

主机名 measure_name Time cpu 内存 disk_iops
host-24gJU 指标 2021-12-01 19:00:00 35 54.9 38.2
host-24gJU 指标 2021-12-01 19:00:01 36 58 39
host-28gJU 指标 2021-12-01 19:00:00 15 55 92
host-28gJU 指标 2021-12-01 19:00:01 16 50 40

单项测量记录

当您的设备在不同的时间段发出不同的指标,或者您使用的是发出更改的自定义处理逻辑时,单项记录是合适的)。metrics/events at different time periods (for instance, when a device's reading/state由于每个度量都有唯一的时间戳,因此可以将这些度量存储在 Timestream 中各自的记录中。 LiveAnalytics例如,以物联网传感器为例,它可以跟踪土壤温度和湿度,只有在检测到与之前报告的条目相比有变化时,它才会发出记录。以下示例提供了使用单一测量记录发出此类数据的示例。

device_id measure_name Time measure_value::double measure_value::bigint
sensor-sea478 温度 2021-12-01 19:22:32 35 NULL
sensor-sea478 温度 2021-12-01 18:07:51 36 NULL
sensor-sea478 水汽 2021-12-01 19:05:30 NULL 21
sensor-sea478 水汽 2021-12-01 19:00:01 NULL 23

比较单测量值和多度量记录

Timestream for 允许您 LiveAnalytics 灵活地根据应用程序的要求和特征将数据建模为单度或多度量记录。如果您的应用程序需要,单个表可以存储单度量和多度量记录。通常,当您的应用程序同时发出多个度量/事件时,通常建议将数据建模为多度量记录,以实现高性能的数据访问和具有成本效益的数据存储。

例如,如果您考虑DevOps 使用一个跟踪来自数十万台服务器的指标和事件的用例,则每台服务器会定期发出 20 个指标和 5 个事件,其中事件和指标会同时即时发出。可以使用单测量记录或多度量记录对数据进行建模(有关生成的架构,请参阅开源数据生成器)。在此用例中,使用多度量记录与单度量记录对数据进行建模会得到:

  • 摄取计量-多重测量记录可使写入的摄取字节减少约40%

  • 摄取批处理-多重测量记录会导致发送的数据批量更大,这意味着客户端需要更少的线程和更少的 CPU 来处理摄取。

  • 存储计量-多重测量记录可将存储空间减少约8倍,从而显著节省内存和磁性存储的存储空间。

  • 查询延迟-与单度记录相比,多测量记录可降低大多数查询类型的查询延迟。

  • 查询计量字节-对于扫描小于 10 MB 数据的查询,单度记录和多度量记录都是可比较的。对于访问单个度量并扫描大于 10 MB 数据的查询,单一测量记录通常会导致计量的字节数较低。对于引用三个或更多度量的查询,多度量记录会减少计量的字节数。

  • 易于表达多度量查询-当您的查询引用多个度量时,使用多度量记录对数据进行建模可以更轻松地编写和更紧凑的查询。

前面的因素会有所不同,具体取决于您要跟踪的指标数量、数据有多少维度等。虽然前面的示例为一个示例提供了一些具体的数据,但我们在许多应用场景和用例中看到,如果您的应用程序在同一时刻发出多个度量,则将数据存储为多度量记录会更有效。此外,多度量记录为您提供了数据类型的灵活性,并将多个其他值存储为上下文(例如,存储请求 IDs和其他时间戳,稍后将讨论)。

请注意,多度量记录也可以对稀疏度量进行建模,例如前面的单度量记录示例:您可以使用measure_name来存储度量的名称,也可以使用通用的多度量属性名称,例如value_double存储度DOUBLE量、value_bigint存储度BIGINT量、value_timestamp存储其他TIMESTAMP值等。

维度和度量

Timestream 中的表格 LiveAnalytics 允许您存储维度(标识正在存储的设备/数据的属性)和度(您正在跟踪的指标/值);有关更多详细信息,请参阅。概念 Amazon Timestream LiveAnalytics 当您在Timestream上为应用程序建模时 LiveAnalytics,如何将数据映射到维度和度量会影响您的摄取和查询延迟。以下是有关如何将数据建模为维度和度量的指南,您可以将其应用于您的用例。

选择尺寸

标识发送时间序列数据的源的数据自然适合维度,维度是不会随着时间的推移而变化的属性。例如,如果您的服务器发布指标,则标识服务器的属性(例如主机名、区域、机架和可用区域)是维度的候选对象。同样,对于具有多个报告时间序列数据的传感器的物联网设备,诸如设备 ID 和传感器 ID 之类的属性是维度的候选对象。

如果要将数据写成多度量记录,则当您在表上执行DESCRIBE或运行SELECT语句时,维度和多度量属性会以列形式出现在表中。因此,在编写查询时,可以在同一个查询中自由使用维度和度量。但是,在构建写入记录以摄取数据时,在选择将哪些属性指定为维度以及哪些属性指定为度量值时,请记住以下几点:

  • 维度名称、维度值、度量名称和时间戳唯一标识时间序列数据。Timestream for LiveAnalytics 使用此唯一标识符自动消除重复数据。也就是说,如果 Timestream LiveAnalytics 接收的两个数据点具有相同的维度名称、维度值、度量名称和时间戳值,并且这些值具有相同的版本号,则用于重复数据消除的 Timestream。 LiveAnalytics如果新的写入请求的版本低于 Timestream 中已有的数据 LiveAnalytics,则写入请求将被拒绝。如果新的写入请求具有更高的版本,则新值将覆盖旧值。因此,如何选择维度值将影响这种重复数据消除行为。

  • 无法更新维度名称和值,但可以更新度量值。因此,最好将任何可能需要更新的数据建模为测量值。例如,如果您在工厂车间有一台可以改变颜色的机器,则可以将颜色建模为度量值,除非您还想将该颜色用作重复数据消除所需的识别属性。也就是说,测量值可用于存储只会随着时间的推移而缓慢变化的属性。

请注意,Timestream 中的表 LiveAnalytics 不会限制维度名称和值的唯一组合的数量。例如,在一个表中可以存储数十亿个这样的唯一值组合。但是,正如您将在以下示例中看到的那样,谨慎选择维度和度量可以显著优化请求延迟,尤其是查询延迟。

尺寸 IDs 独特

如果您的应用场景要求您存储每个数据点的唯一标识符(例如,请求 ID、交易 ID 或关联 ID),则将 ID 属性建模为度量值将显著改善查询延迟。使用多度量记录对数据进行建模时,ID 会与您的其他维度和时间序列数据显示在同一行中,因此您的查询可以继续有效地使用它们。例如,考虑到服务器发出的每个数据点都具有唯一的请求 ID 属性的DevOps 用例,与将唯一的请求 ID 建模为维度相比,将请求 ID 建模为度量值可以将不同查询类型的查询延迟降低多达 4 倍。

对于并非每个数据点都完全唯一但具有数十万或数百万个唯一值的属性,您可以使用类似的类比。您可以将这些属性建模为维度值或测量值。如果这些值是前面所讨论的写入路径上的重复数据消除所必需的,或者您经常在查询中将其用作谓词(例如,在WHERE子句中,在该属性值上有相等谓词,例如您的应用程序跟踪数百万台设备device_id = 'abcde'的位置),则需要将其建模为维度。

数据类型丰富,包含多度量记录

多重测量记录使您可以灵活地对数据进行有效建模。存储在多度量记录中的数据在表格中以列的形式出现,类似于维度,因此同样便于查询维度和度量值。你在前面讨论的示例中看到了其中的一些模式。在下面,您将找到其他模式,以有效使用多指标记录来满足应用程序的用例。

多度量记录支持数据类型DOUBLE、、BIGINTVARCHARBOOLEAN、和TIMESTAMP的属性。因此,它们自然适合不同类型的属性:

  • 位置信息:例如,如果您想跟踪某个位置(以纬度和经度表示),那么与将其存储为VARCHAR维度相比,将其建模为多度量属性可以缩短查询延迟,尤其是在您对纬度和经度有谓词的情况下。

  • 记录中的多个时间戳:如果您的应用场景要求您跟踪时间序列记录的多个时间戳,则可以将它们建模为多度量记录中的其他属性。此模式可用于存储带有未来时间戳或过去时间戳的数据。请注意,每条记录仍将使用时间列中的时间戳对记录进行分区、索引和唯一标识。

特别是,如果查询中包含谓词的数字数据或时间戳,则将这些属性建模为多度量属性而不是维度将降低查询延迟。这是因为在使用多度量记录中支持的丰富数据类型对此类数据进行建模时,如果将此类数据建模为维度,则可以使用原生数据类型VARCHAR来表示谓词,而不是将值从其他数据类型转换为其他数据类型。

在多度量记录中使用度量名称

Timestream 中的表 LiveAnalytics 支持名为度量名称的特殊属性(或列)。您可以为写入 Timestream 的每条记录为此 LiveAnalytics属性指定一个值。对于单项测量记录,自然会使用指标的名称(例如 CPU 或内存表示服务器指标,或者使用温度或压力表示传感器指标)。使用多度量记录时,会对多度量记录中的属性进行命名,这些名称将成为表中的列名。因此,CPU、内存、温度和压力可以成为多度量属性名称。一个自然的问题是如何有效地使用度量名称。

Timestream for LiveAnalytics 使用度量名称属性中的值对数据进行分区和索引。因此,如果表有多个不同的度量名称,并且查询使用这些值作为查询谓词,则 Timestream for LiveAnalytics 可以使用其自定义分区和索引来删除与查询无关的数据。例如,如果您的表具有cpumemory度量名称,并且您的查询具有谓词WHERE measure_name = 'cpu',则 Timestream for LiveAnalytics 可以有效地修剪与查询无关的度量名称的数据,例如本示例中具有度量名称内存的行。即使在多度量记录中使用度量名称,这种修剪也适用。您可以有效地使用度量名称属性作为表的分区属性。度量名称以及维度名称和值以及时间用于对 LiveAnalytics 表的 Timestream 中的数据进行分区。请注意 LiveAnalytics 表的 Timestream 中允许的唯一度量名称数量的限制。另请注意,度量名称也与度量值数据类型相关联。例如,单个度量名称只能与一种测量值类型相关联。该类型可以是DOUBLE、、BIGINTBOOLEANVARCHAR、或之一MULTI。使用度量名称存储的多度量记录的数据类型为。MULTI由于单个多指标记录可以存储具有不同数据类型(DOUBLE、、BIGINTVARCHARBOOLEAN、和TIMESTAMP)的多个指标,因此您可以将不同类型的数据关联到多指标记录中。

以下各节介绍几个不同的示例,说明如何有效地使用度量名称属性将不同类型的数据组合到同一个表中。

物联网传感器报告质量和价值

假设您有来自物联网传感器的应用程序监控数据。每个传感器跟踪不同的测量值,例如温度和压力。除了实际值外,传感器还报告测量的质量,这是对读数精度的衡量标准,也是测量的单位。由于质量、单位和值是一起发射的,因此可以将它们建模为多度量记录,如下面的示例数据所示,其中device_id是维度,qualityvalue、和unit是多度量属性:

device_id measure_name Time 质量 单位
sensor-sea478 温度 2021-12-01 19:22:32 92 35 c
sensor-sea478 温度 2021-12-01 18:07:51 93 34 c
sensor-sea478 pressure 2021-12-01 19:05:30 98 31 psi
sensor-sea478 pressure 2021-12-01 19:00:01 24 132 psi

这种方法允许您将多度量记录的优点与使用度量名称的值对数据进行分区和修剪相结合。如果查询引用单个测量值(例如温度),则可以在查询中包含measure_name谓词。以下是此类查询的示例,该查询还会投影质量高于 90 的测量单位。

SELECT device_id, time, value AS temperature, unit FROM db.table WHERE time > ago(1h) AND measure_name = 'temperature' AND quality > 90

在查询上使用measure_name谓词可以让 Timestream 有效地修剪与查询无关的分区和数据,从而缩短查询延迟。 LiveAnalytics

如果所有指标都是在相同的时间戳发出的,并且/或者在同一个查询中同时查询多个指标,则也可以将所有指标存储在同一个多指标记录中。例如,您可以使用诸如温度_质量、温度_值、温度_单位、压力_质量、压力_值和压力_单位等属性来构造多度量记录。前面讨论的关于使用单度量记录与多度量记录对数据进行建模的许多要点都适用于你决定如何对数据进行建模。请考虑您的查询访问模式以及数据的生成方式,以选择一种能够优化成本、提取和查询延迟以及便于编写查询的模型。

同一个表中包含不同类型的指标

另一个可以将多度量记录与度量名称值组合在一起的用例是对从同一设备独立发出的不同类型的数据进行建模。考虑一下 DevOps 监控用例,其中服务器发出两种类型的数据:定期发出的指标和不规则的事件。这种方法的一个例子是数据生成器对 DevOps 用例进行建模中讨论的架构。在这种情况下,您可以使用不同的度量名称将同一服务器发出的不同类型的数据存储在同一个表中。例如,同时发出的所有指标都与度量名称指标一起存储。与指标在不同时刻发出的所有事件都与度量名称事件一起存储。表的度量架构(例如,SHOW MEASURES查询的输出)为:

measure_name data_type Dimensions
events multi [{“data_type”: “varchar”、“dimension_name”: “availability_zone”}、{“data_type”: “varchar”、“dimension_name”: “instance_type”: “varchar”、“dimension_name”: “instance_name”}、{“data_type”: “varchar”、“varchar”、“dimension_name”: “instance_name”}、{“data_tydimension_name”: “process_name”}、{“data_type”: “varchar”、“dimension_name”: “jdimension_name”: “jdimen_name”: “jdimen_type”: “jdimension_name”: “region”}, {“data_type”: “region”}, {“data_type”: “dimension_type”: “region”}, {“data_type”: “dimension_“ varchar”、“dimension_name”: “silo”}]
指标 multi [{“data_type”: “varchar”、“dimension_name”: “availability_zone”}、{“data_type”: “varchar”、“dimension_name”: “instance_type”: “varchar”、“dimension_name”: “instance_name”}、{“data_type”: “varchar”、“varchar”、“dimension_name”: “instance_name”}、{“data_tydimension_name”: “os_version”},{“data_type”: “varchar”,“dimension_name”: “cell”},{“data_type”: “dimension_name”: “silo”},{“data_type”: “varchar”,“dimension_name”: “silo”},{“data_type”: “varchar”, “dimension_name”: “silo”},{“data_type”: “varchchar”,“dimension_name”: “instance_type”}]

在这种情况下,您可以看到事件和指标也有不同的维度集,其中事件具有不同的维度jdk_versionprocess_name而指标具有维度instance_typeos_version

使用不同的度量名称允许您编写带有谓词的查询WHERE measure_name = 'metrics',例如仅获取指标。此外,将同一个实例发出的所有数据放在同一个表中意味着你也可以使用instance_name谓词编写一个更简单的查询来获取该实例的所有数据。例如,WHERE instance_name = 'instance-1234'不带谓词的形式measure_name谓词将返回特定服务器实例的所有数据。

对多度量记录进行分区的建议

重要

此部分已被弃用!

这些建议已经过时。现在,使用客户定义的分区键可以更好地控制分区

我们已经看到,时间序列生态系统中越来越多的工作负载需要摄取和存储大量数据,同时在通过一组高基数维度值访问数据时需要低延迟的查询响应。

由于这些特性,本节中的建议对于具有以下特性的客户工作负载非常有用:

  • 已采用或想要采用多重衡量标准。

  • 预计会有大量数据进入系统,这些数据将被长期存储。

  • 其主要访问(查询)模式要求低延迟响应时间。

  • 要知道,最重要的查询模式涉及谓词中的某种过滤条件。此过滤条件基于高基数维度。例如,考虑按照、、serverID UserId DeviceId、主机名等进行的事件或聚合。

在这些情况下,所有多度量值的单一名称无济于事,因为我们的引擎使用多度量名称对数据进行分区,而使用单个值会限制您获得的分区优势。这些记录的分区主要基于两个维度。假设时间在 x 轴上,维度名称的哈希值在 measure_name y 轴上。measure_name在这些情况下,几乎像分区密钥一样起作用。

我们的建议如下:

  • 在针对像我们提到的用例这样的用例对数据进行建模时measure_name,请使用主查询访问模式的直接衍生物。例如:

    • 您的用例需要从最终用户的角度跟踪应用程序性能和 QoE。这也可能是跟踪单个服务器或物联网设备的测量结果。

    • 如果您要按以下条件进行查询和筛选 UserId,则需要在摄取时找到与之关联measure_name的最佳方式。 UserId

    • 由于多度量表只能容纳 8,192 个不同的度量名称,因此无论采用哪种公式,生成的不同值都不应超过 8,192 个。

  • 我们成功应用于字符串值的一种方法是对字符串值应用哈希算法。然后使用哈希结果的绝对值和 8,192 执行模运算。

    measure_name = getMeasureName(UserId)
    int getMeasureName(value) {
        hash_value =  abs(hash(value))
        return hash_value % 8192
    }
  • 我们还添加了abs()删除符号的功能,从而消除了值介于 -8,192 到 8,192 之间的可能性。这应该在模运算之前执行。

  • 通过使用此方法,您的查询的运行时间仅为在未分区的数据模型上运行所需时间的一小部分。

  • 查询数据时,请确保在谓词中包含筛选条件,该条件使用新派生的measure_name值。例如:

    • SELECT * FROM your_database.your_table WHERE host_name = 'Host-1235' time BETWEEN '2022-09-01' AND '2022-09-18' AND measure_name = (SELECT cast(abs(from_big_endian_64(xxhash64(CAST('HOST-1235' AS varbinary))))%8192 AS varchar))
    • 这将最大限度地减少扫描的分区总数,从而使您的数据随着时间的推移可以更快地转化为查询。

请记住,如果您想从此分区架构中获得好处,则需要在客户端计算哈希值,然后将其作为静态值传递给 Timestream,然后 LiveAnalytics 将其作为静态值传递给查询引擎。前面的示例提供了一种验证引擎是否可以在需要时解析生成的哈希值的方法。

时间 host_name location 服务器类型 cpu_usage 可用内存 cpu_temp

2022-09-07 21:48:44 .000000000

host-1235

美国东部1

5.8xl

55

16.2

78

R2022-09-07 21:48:44 .000000000

host-3587

美国西部1

5.8xl

62

18.1

81

2022-09-07 21:48:45.000 000 000 000

host-258743

欧盟中部

5.8xl

88

9.4

91

2022-09-07 21:48:45 .000000000

host-35654

美国东部2

5.8xl

29

24

54

R2022-09-07 21:48:45 .000000000

host-254

美国西部1

5.8xl

44

32

48

measure_name按照我们的建议生成相关内容,有两条路径取决于您的摄取模式。

  1. 用于历史数据的批量摄取-如果您要使用自己的代码进行批处理,则可以将转换添加到编写代码中。

    在前面的示例的基础上构建。

    List<String> hosts = new ArrayList<>(); hosts.add("host-1235"); hosts.add("host-3587"); hosts.add("host-258743"); hosts.add("host-35654"); hosts.add("host-254"); for (String h: hosts){ ByteBuffer buf2 = ByteBuffer.wrap(h.getBytes()); partition = abs(hasher.hash(buf2, 0L)) % 8192; System.out.println(h + " - " + partition); }

    输出

    host-1235 - 6445
    host-3587 - 6399
    host-258743 - 640
    host-35654 - 2093
    host-254 - 7051
    

    生成的数据集

    时间 host_name location measure_name 服务器类型 cpu_usage 可用内存 cpu_temp

    2022-09-07 21:48:44 .000000000

    host-1235

    美国东部1

    6445

    5.8xl

    55

    16.2

    78

    R2022-09-07 21:48:44 .000000000

    host-3587

    美国西部1

    6399

    5.8xl

    62

    18.1

    81

    2022-09-07 21:48:45.000 000 000 000

    host-258743

    欧盟中部

    640

    5.8xl

    88

    9.4

    91

    2022-09-07 21:48:45 .000000000

    host-35654

    美国东部2

    2093

    5.8xl

    29

    24

    54

    R2022-09-07 21:48:45 .000000000

    host-254

    美国西部1

    7051

    5.8xl

    44

    32

    48

  2. 用于实时摄取-您需要在数据传measure_name入时生成动态数据。

在这两种情况下,我们都建议您在两端(摄取和查询)测试哈希生成算法,以确保获得相同的结果。

以下是一些生成哈希值的代码示例。host_name

例 Python
>>> import xxhash >>> from bitstring import BitArray >>> b=xxhash.xxh64('HOST-ID-1235').digest() >>> BitArray(b).int % 8192 ### 3195
例 Go
package main import ( "bytes" "fmt" "github.com/cespare/xxhash" ) func main() { buf := bytes.NewBufferString("HOST-ID-1235") x := xxhash.New() x.Write(buf.Bytes()) // convert unsigned integer to signed integer before taking mod fmt.Printf("%f\n", abs(int64(x.Sum64())) % 8192) } func abs(x int64) int64 { if (x < 0) { return -x } return x }
例 Java
import java.nio.ByteBuffer; import net.jpountz.xxhash.XXHash64; public class test { public static void main(String[] args) { XXHash64 hasher = net.jpountz.xxhash.XXHashFactory.fastestInstance().hash64(); String host = "HOST-ID-1235"; ByteBuffer buf = ByteBuffer.wrap(host.getBytes()); Long result = Math.abs(hasher.hash(buf, 0L)); Long partition = result % 8192; System.out.println(result); System.out.println(partition); } }
例 Maven 中的依赖关系
<dependency> <groupId>net.jpountz.lz4</groupId> <artifactId>lz4</artifactId> <version>1.3.0</version> </dependency>