Amazon Redshiftとは ― データウェアハウスの仕組み
Redshiftは、
Amazon Redshiftとは、大量のデータを分析するためのデータウェアハウス
何年分もの売上データを集計するような分析は、注文を受け付ける業務のデータベースとは別の場所で行うのが一般的です。Amazon Redshiftは、そうした分析のためのデータウェアハウスを、AWSが管理するサービスです。
データウェアハウスは、業務で発生したデータを集めて、分析のために保存しておくデータベースです。Redshiftでは、ペタバイト規模までのデータを、SQLで問い合わせて分析できます。PostgreSQLを元に作られていて、多くのSQLのクライアントがほぼそのまま使えます。機器の用意やソフトウェアの更新、バックアップは、AWSが行います。
RDSとRedshiftの違いは、1件ずつの更新か、大量の集計か
RDSもRedshiftも、表に入れたデータをSQLで扱うリレーショナルデータベースです。違うのは、得意な処理です。
RDSは注文の登録のような1件ずつの読み書きに、Redshiftは大量の行の集計に向きます。記録する処理をOLTP、分析する処理をOLAPと呼びます。2つの違いは、データウェアハウスの記事で説明しています。
Redshiftも、行の追加や削除はできます。それでもAWSの資料は、Redshiftを大量のデータの分析とレポートに合わせて設計したものとしています。そのため、通常は業務のデータをRDSに置き、そのコピーをRedshiftで分析します。
| 比べる | Amazon RDS | Amazon Redshift |
|---|---|---|
| 向く | 注文の | 大量の |
| 表の | 行ごとに | 列ごとに |
| データの | アプリが | S3などから |
| 問い合わせの | 1つの | 複数の |
| 一意・主キー・外部キーの | 守られる | 目安と |
列指向ストレージは、集計に必要な列だけを読む
データベースは、表のデータをブロックという単位でディスクに保存します。RDSで動く一般的なRDBは、1行の値をまとめて1つのブロックに保存します。この保存方法を行指向と呼びます。
Redshiftは、同じ列の値を多数の行の分まとめて、1つのブロックに保存します。この保存方法を列指向と呼びます。同じ表で売上の合計を求める場合でも、2つの方法では読むブロックの数が違います。
列指向では、集計に使う列のブロックだけを読めば済みます。Redshiftの資料の例では、100列の表で5列だけを使う問い合わせなら、読むのは表のデータの約5%です。行指向では、使わない95列が入ったブロックも読みます。
1つのブロックには同じ種類の値が並ぶので、その型に合った方法で圧縮できます。圧縮するとディスクから読む量がさらに減ります。ブロックの大きさも、一般的なデータベースが2KB〜32KBなのに対して、Redshiftは1MBです。
逆に、1件の注文のすべての列を読み書きするなら、行指向のほうが1か所で済みます。列指向という語はデータベースの種類を表すときにも使います。ほかの種類との違いはNoSQLの記事にまとめています。
リーダーノードとコンピュートノードで、並列に処理する
Redshiftのデータウェアハウスは、クラスターという単位で動きます。クラスターには、データを保持して処理を行うコンピュートノードが1台以上あります。2台以上のときは、全体をまとめるリーダーノードが加わります。
2台以上のクラスターでは、クライアントがSQLを送る先はリーダーノードだけです。リーダーノードは、SQLを解析して実行計画を作ります。そして、コンピュートノードに処理を配ります。コンピュートノードは担当の行を処理し、途中の結果をリーダーノードに返します。
表の行は、あらかじめコンピュートノードに分散して保存されています。1台のコンピュートノードの中も、スライスという単位に分かれています。スライスごとに同じ処理を同時に行うので、行が多くても速く集計できます。この処理の仕方を、超並列処理と呼びます。
処理能力が足りなくなったら、ノードの数を増やすか、より大きなノードの種類に変更します。RA3などのノードでは、データの保存先が、S3を使うRedshift Managed Storageに分離されています。このため、処理能力と保存容量を別々に増やせます。料金も別々に払います。
動かして確かめる:処理を選んで、RDSとRedshiftのどちらが向くかを見る
次の図は、通販サイトの注文データの例です。処理を1つ選ぶと、向くサービスと理由、表のどこを読み書きするかが表示されます。
- 理由
- 1件の
注文の、 すべての 列を まとめて 書き込む 処理です。 1行の 値を まとめて 保存する 行指向が 向きます。 - 読み書きする範囲
- 1行の
すべての 列
- 理由
- 1件の
注文の 行だけを 書き換える 処理です。 少数の 行を 何度も 読み書きする 処理には、 行指向が 向きます。 - 読み書きする範囲
- 1行の
一部の 列
- 理由
- 1人分の
行を 探して、 その 行の 列を まとめて 読む 処理です。 行ごとに 保存してあれば、 1か所を 読めば 済みます。 - 読み書きする範囲
- 1行の
すべての 列
- 理由
- 大量の
行から、 日付と 売上の 2列だけを 読む 処理です。 列ごとに 保存してあれば、 ほかの 列を 読まずに 済みます。 - 読み書きする範囲
- すべての
行の 2列
- 理由
- 何年分もの
行を、 いくつもの 切り口で 集計する 処理です。 コンピュートノードが 行を 分けて 並列に 処理します。 - 読み書きする範囲
- すべての
行の 数列
- 理由
- 注文の
登録は RDSで 続け、 複製した データを Redshiftで 分析します。 ゼロETL統合を 使うと、 複製の 仕組みを AWSが 管理します。 - 読み書きする範囲
- 複製した
データの 多くの 行
1行を丸ごと扱う処理はRDSに、多数の行の一部の列を集計する処理はRedshiftに向きます。キーを指定して1件ずつ読み書きする用途には、DynamoDBも候補です。
データの入れ方は、S3からCOPYで読み込むのが基本
Redshiftの表には、ほかの場所にあるデータをまとめて読み込みます。よく使うのは、S3に置いたCSVなどのファイルです。
読み込みに最も効率のよい方法は、COPYコマンドです。COPYは複数のファイルを同時に読み、コンピュートノードに分けて並列に書き込みます。INSERT文でも行を追加できますが、リーダーノードを通るので、COPYよりずっと遅くなります。
ほかのサービスから取り込む方法もあります。ゼロETL統合は、AuroraやRDSのデータを、Redshiftに複製し続ける仕組みです。業務のデータベースを使い続けたまま、複製したデータを分析できます。
| 入れ方 | データの | 向く |
|---|---|---|
| COPYコマンド | S3・DynamoDB・EMRなど | 大量の |
| 自動の | S3の | 新しい |
| ゼロETL統合 | Aurora・RDS・DynamoDBなど | 業務の |
| ストリーミング取り込み | Kinesis Data Streams・Amazon MSK | 流れてくる |
| INSERT文 | アプリや | 少数の |
データを整えてから取り込む流れは、データウェアハウスの記事のETLと同じです。ゼロETL統合では、この複製の仕組みを利用者が作らずに済みます。
Redshift Serverlessは、容量を自動で決める使い方
Redshiftの利用形態は2つあります。ノードの種類と数を利用者が選ぶプロビジョンドのクラスターと、Redshift Serverlessです。
Redshift Serverlessでは、クラスターを用意せずに、データを読み込んで問い合わせられます。処理に必要な容量はAWSが用意し、負荷に合わせて自動で増減します。この容量は、RPUという単位で数えます。
処理の料金は、問い合わせを実行している間に使ったRPUと時間で決まります。問い合わせが動いていない間は、処理の料金はかかりません。保存したデータの料金は、これとは別に、量に応じてかかります。
使いどころと、Redshiftを使わないほうがよい場面
Redshiftの使いどころは、何年分もの業務のデータを集めて、集計やレポートに使うことです。分析ツールからSQLで問い合わせ、売上の推移などをグラフにします。重い集計を、業務のデータベースで行わずに済みます。
小さな更新をたくさん行う業務のデータベースには、Redshiftを使いません。Redshiftの資料は、1行か数行ずつ追加すると、圧縮の効率が落ちるとしています。1件ずつの読み書きが中心なら、RDSやAurora、DynamoDBを選びます。
制約の扱いも違います。Redshiftでは、一意・主キー・外部キーの制約は、実行計画を立てるときの目安として使われるだけです。違反する行を追加しても、エラーにはなりません。
Redshiftは、キーが正しいものとして実行計画を立てます。そのため、主キーが重複していると、問い合わせが誤った結果を返すことがあります。NOT NULLの制約は守られます。
重複しないことを保証したいデータは、送信元のデータベースや、読み込む前の処理で確認します。RDSやAuroraで動くMySQLやPostgreSQLは、主キーや外部キーの制約を守ります。
参考にした資料
- AWS「What is Amazon Redshift?」
- AWS「Data warehouse system architecture」(リーダーノード・コンピュートノード・スライス)
- AWS「Columnar storage」
- AWS「Amazon Redshift Performance」(超並列処理と圧縮)
- AWS「Loading data in Amazon Redshift」と「Use a COPY command to load data」
- AWS「Use a multi-row insert」
- AWS「Table constraints」
- AWS「Zero-ETL integrations」
- AWS「What is Amazon Redshift Serverless?」
- AWS「Billing for on-demand compute capacity」(RPUと料金)
- AWS「Amazon Redshift provisioned clusters」(ノードの種類とRedshift Managed Storage)
- AWS「Amazon Redshift FAQs」(INSERT文の読み込みの経路)
練習問題(全5問)
正解:大量の
Redshiftは、
正解:
列指向は、
正解:リーダーノード
クライアントが
正解:COPYコマンドで、
COPYコマンドは、
正解:1件ずつの
Redshiftは、
選んでから「採点する」を押すと、解説つきで答え合わせができます。