步骤 4:配置 cqlsh COPY FROM 设置 - Amazon Keyspaces(Apache Cassandra 兼容)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

步骤 4:配置 cqlsh COPY FROM 设置

本部分概述如何确定 cqlsh COPY FROM 的参数值。cqlsh COPY FROM 命令读取您之前准备的 CSV 文件,并使用 CQL 将数据插入到 Amazon Keyspaces 中。该命令将行分开,并将 INSERT 操作分配给一组 Worker。每个 Worker 与 Amazon Keyspaces 建立连接并通过该通道发送 INSERT 请求。

cqlsh COPY 命令没有在 Worker 之间均匀分配工作的内部逻辑。但是,您可以手动对其进行配置,以确保均匀分配工作。首先查看以下关键的 cqlsh 参数:

  • DELIMITER:如果您使用逗号以外的分隔符,则可以设置此参数,此参数默认为逗号。

  • INGESTRATEcqlsh COPY FROM 每秒尝试处理的目标行数。如果未设置,则默认为 100000。

  • NUMPROCESSES:cqlsh 为 COPY FROM 任务创建的子 Worker 进程的数量。此设置的最大值为 16,默认值为 num_cores - 1,其中 num_cores 是运行 cqlsh 的主机上的处理内核数。

  • MAXBATCHSIZE:批次大小决定了在单个批次中插入到目标表中的最大行数。如果未设置,cqlsh 将使用插入 20 行的批次。

  • CHUNKSIZE:传递给子 Worker 的工作单元的大小。默认情况下,它设置为 5000。

  • MAXATTEMPTS:重试失败 Worker 块的最大次数。达到最大尝试次数后,失败记录将写入一个新的 CSV 文件中,您可以在调查失败后再次运行该文件。

根据您为目标表预置的 WCU 数量设置 INGESTRATEcqlsh COPY FROM 命令的 INGESTRATE 不是限制,而是目标平均值。这意味着它可以(并且经常)突破您设定的数字。要允许暴增并确保有足够的容量来处理数据加载请求,请将 INGESTRATE 设置为表写入容量的 90%。

INGESTRATE = WCUs * .90

接下来,将 NUMPROCESSES 参数设置为比系统上的内核数少一个。要弄清楚系统的内核数,您可以运行以下代码。

python -c "import multiprocessing; print(multiprocessing.cpu_count())"

在本教程中,我们使用以下值。

NUMPROCESSES = 4

每个进程都会创建一个 Worker,并且每个 Worker 都会与 Amazon Keyspaces 建立连接。Amazon Keyspaces 在每个连接上每秒可支持最多 3000 个 CQL 请求。这意味着您必须确保每个 Worker 每秒处理的请求少于 3000 个。

INGESTRATE 一样,Worker 经常会突破您设置的数字,并且不受时钟秒数的限制。因此,考虑到暴增,请将 cqlsh 参数设置为每个 Worker 每秒处理 2500 个请求。要计算分配给 Worker 的工作量,请使用以下准则。

  • INGESTRATE 除以 NUMPROCESSES

  • 如果 INGESTRATE/NUMPROCESSES > 2500,请降低 INGESTRATE 以使此公式成立。

INGESTRATE / NUMPROCESSES <= 2,500

在配置设置以优化示例数据的上传之前,让我们回顾一下 cqlsh 默认设置,看看使用它们会如何影响数据上传过程。由于 cqlsh COPY FROM 使用 CHUNKSIZE 创建工作块(INSERT 语句)以分配给 Worker,因此工作不会自动均匀分配。根据 INGESTRATE 设置,有些 Worker 可能会处于闲置状态。

要在 Worker 之间均匀分配工作并使每个 Worker 保持每秒 2500 个请求的最佳速率,必须通过更改输入参数来设置 CHUNKSIZEMAXBATCHSIZE、和 INGESTRATE。要优化数据加载期间的网络流量利用率,请为 MAXBATCHSIZE 选择一个接近最大值 30 的值。通过将 CHUNKSIZE 更改为 100,将 MAXBATCHSIZE 更改为 25,10000 行将均匀分配给四个 Worker(10000/2500 = 4)。

以下代码示例说明了如何执行此操作。

INGESTRATE = 10,000 NUMPROCESSES = 4 CHUNKSIZE = 100 MAXBATCHSIZE. = 25 Work Distribution: Connection 1 / Worker 1 : 2,500 Requests per second Connection 2 / Worker 2 : 2,500 Requests per second Connection 3 / Worker 3 : 2,500 Requests per second Connection 4 / Worker 4 : 2,500 Requests per second

总而言之,在设置 cqlsh COPY FROM 参数时使用以下公式:

  • INGESTRATE = 写入容量单位 * 0.90

  • NUMPROCESSES = 内核数 - 1(默认设置)

  • INGESTRATE/NUMPROCESSES = 2500(这必须是一个真语句。)

  • MAXBATCHSIZE = 30(默认为 20。Amazon Keyspaces 最多可接受 30 个批次。)

  • CHUNKSIZE = (INGESTRATE/NUMPROCESSES)/MAXBATCHSIZE

现在您已经计算了 NUMPROCESSESINGESTRATECHUNKSIZE,接下来可以加载数据。