

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ステップ 4: `cqlsh COPY FROM` を設定する
<a name="bulk-upload-config"></a>

このセクションでは、`cqlsh COPY FROM` のパラメータ値を決定する方法について説明します。`cqlsh COPY FROM` コマンドは、前の手順で準備した CSV ファイルを読み取り、CQL を使用して Amazon Keyspaces にデータを挿入します。このコマンドにより、行の分割と一連のワーカー間での `INSERT` オペレーションの配分が行われます。各ワーカーは Amazon Keyspaces との接続を確立し、このチャンネルに沿って `INSERT` リクエストを送信します。

`cqlsh COPY` コマンドには、ワーカー間でワークを均等に分配するための内部ロジックがありません。ただし、ワークが均等に分配されるように手動で設定することはできます。まず、次の主要な cqlsh パラメータを確認します。
+ **DELIMITER** — カンマ以外の区切り文字を使用した場合はこのパラメータを設定できます。デフォルトはカンマです。
+ **INGESTRATE** — `cqlsh COPY FROM` により処理が試行される 1 秒あたりのターゲット行数。設定しない場合のデフォルト値は 100,000 です。
+ **NUMPROCESSES** — `COPY FROM` タスクに対して cqlsh により作成される子ワーカープロセスの数。この設定の最大値は 16 で、デフォルトは `num_cores - 1` です。`num_cores` は cqlsh が実行されているホストの処理コア数です。
+ **MAXBATCHSIZE** - バッチサイズにより、1 つのバッチで挿入先テーブルに挿入される最大行数が決まります。設定されていない場合、cqlsh により挿入行数が 20 行のバッチが使用されます。
+ **CHUNKSIZE** — 子ワーカーに渡すワーク単位のサイズ。デフォルトでは、5,000 に設定されます。
+ **MAXATTEMPTS** — 失敗したワーカーチャンクの再試行の最高回数。最高試行回数に達すると、失敗したレコードが新しい CSV ファイルに書き込まれ、後ほど、失敗を調査した上で再実行できます。

ターゲット送信先テーブルにプロビジョニングした WCU の数に基づいて `INGESTRATE` を設定します。`cqlsh COPY FROM` コマンドの `INGESTRATE` は制限ではなくターゲット平均です。これは、設定した数を大きく上回る可能性がある (多くの場合そうなる) ことを意味します。このような超過を許可し、データロードリクエストを処理できるだけの十分なキャパシティを確保するには、`INGESTRATE` をテーブルの書き込みキャパシティの 90% に設定します。

```
INGESTRATE = WCUs * .90
```

次に、`NUMPROCESSES` パラメータを、システムのコア数より 1 少ない値に設定します。システムのコア数を調べるには、次のコードを実行します。

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

このチュートリアルでは、以下の値を使用します。

```
NUMPROCESSES = 4
```

各プロセスでワーカーが作成され、各ワーカーで Amazon Keyspaces への接続が確立されます。Amazon Keyspaces は、接続ごとに 1 秒あたり最大で 3,000 件の CQL リクエストに対応できます。つまり、各ワーカーの 1 秒あたりのリクエスト処理数が 3,000 件未満であるか確認する必要があるということです。

`INGESTRATE` と同様に、ワーカーは設定した数値を大幅に上回ることが多く、クロックの秒数に制限されません。したがって、大幅な超過を考慮しておくために、各ワーカーの 1 秒あたりの目標リクエスト処理数が 2,500 件になるように cqlsh パラメータを設定します。ワーカーに分配されるワーク量を計算するには、次のガイドラインを使用します。
+ `INGESTRATE` を `NUMPROCESSES` で割ります。
+ `INGESTRATE` / `NUMPROCESSES` > 2,500 になった場合は、この式が真になるように `INGESTRATE` を下げます。

```
INGESTRATE / NUMPROCESSES <= 2,500
```

サンプルデータのアップロードを最適化するための設定を行う前に、`cqlsh` のデフォルト設定を再確認し、その使用がデータのアップロードプロセスにどのように影響するのか見てみましょう。`cqlsh COPY FROM` では `CHUNKSIZE` を使用して膨大なワークが作成されて (`INSERT` ステートメント) ワーカーに分配されるので、ワークは自動的には均等に分配されません。`INGESTRATE` 設定によっては、アイドル状態になるワーカーもあります。

ワーカー間でワークを均等に分配し、各ワーカーに対して 1 秒あたりの最適なリクエスト数を 2,500 件で維持するには、入力パラメータを変更して `CHUNKSIZE`、`MAXBATCHSIZE`、`INGESTRATE` に設定する必要があります。データロード中のネットワークトラフィックの使用率を最適化するには、`MAXBATCHSIZE` の値として最大値の 30 に近い値を選択します。`CHUNKSIZE` を 100 に、`MAXBATCHSIZE` を 25 に変更すると、10,000 行が 4 つのワーカーに均等に分配されます (10,000 / 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** = write\$1capacity\$1units \$1 .90
+ **NUMPROCESSES** = num\$1cores -1 (デフォルト)
+ **INGESTRATE / NUMPROCESSES** = 2,500 (これは true ステートメントでなければなりません。)
+ **MAXBATCHSIZE** = 30 (デフォルトは 20。Amazon Keyspaces では最大で 30 のバッチが受け入れられます。)
+ **CHUNKSIZE** = (INGESTRATE / NUMPROCESSES) / MAXBATCHSIZE

これで `NUMPROCESSES`、`INGESTRATE`、`CHUNKSIZE` の計算が完了し、データをロードする準備が整いました。