ITの教科書検索
入門読了 約12分

Amazon Redshiftとは ― データウェアハウスの仕組み

Redshiftは、大量のデータを集計・分析するデータウェアハウスです。RDSと何が違うのか、列指向だとなぜ集計が速いのか、データをどう入れるのかに答えます。

目次
  1. Amazon Redshiftとは
  2. RDSとRedshiftの違い
  3. 列指向ストレージ
  4. リーダーノードとコンピュートノード
  5. 動かして確かめる:処理を選ぶ
  6. データの入れ方
  7. Redshift Serverless
  8. 使いどころと向かない場面
  9. 練習問題

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の違い(Amazon Redshift Database Developer Guideをもとに作成)
比べる点Amazon RDSAmazon Redshift
向く処理注文の登録など、1件ずつの読み書き大量の行の集計と分析
表の保存の仕方行ごとに保存する列ごとに保存する
データの入れ方アプリが1件ずつ書き込むS3などからまとめて読み込む
問い合わせの処理1つのDBインスタンスが行う複数のコンピュートノードが並列に行う
一意・主キー・外部キーの制約守られる目安として使われ、守られない

列指向ストレージは、集計に必要な列だけを読む

データベースは、表のデータをブロックという単位でディスクに保存します。RDSで動く一般的なRDBは、1行の値をまとめて1つのブロックに保存します。この保存方法を行指向と呼びます。

Redshiftは、同じ列の値を多数の行の分まとめて、1つのブロックに保存します。この保存方法を列指向と呼びます。同じ表で売上の合計を求める場合でも、2つの方法では読むブロックの数が違います。

行指向:1行を1ブロックに注文番号日付商品売上1行目10014/1ペン3002行目10024/1ノート5003行目10034/2ペン3004行目10044/3消しゴム100読むブロック:4つ列指向:1列を1ブロックに1行目2行目3行目4行目注文番号1001100210031004日付4/14/14/24/3商品ペンノートペン消しゴム売上300500300100読むブロック:1つ
同じ表の売上の合計を求めるときに、読むブロックを色で示しています。行指向では売上がどのブロックにも入っているので、全部を読みます。列指向では、売上のブロックだけを読めば足ります。図では、1つのブロックに1行または1列だけを入れて単純にしています。

列指向では、集計に使う列のブロックだけを読めば済みます。Redshiftの資料の例では、100列の表で5列だけを使う問い合わせなら、読むのは表のデータの約5%です。行指向では、使わない95列が入ったブロックも読みます。

1つのブロックには同じ種類の値が並ぶので、その型に合った方法で圧縮できます。圧縮するとディスクから読む量がさらに減ります。ブロックの大きさも、一般的なデータベースが2KB〜32KBなのに対して、Redshiftは1MBです。

逆に、1件の注文のすべての列を読み書きするなら、行指向のほうが1か所で済みます。列指向という語はデータベースの種類を表すときにも使います。ほかの種類との違いはNoSQLの記事にまとめています。

リーダーノードとコンピュートノードで、並列に処理する

Redshiftのデータウェアハウスは、クラスターという単位で動きます。クラスターには、データを保持して処理を行うコンピュートノードが1台以上あります。2台以上のときは、全体をまとめるリーダーノードが加わります。

クライアントSQL結果リーダーノード①計画を作る④まとめて返すコンピュートノード担当の行を集計コンピュートノード担当の行を集計②処理を配る③途中の結果②処理を配る③途中の結果
クライアントがやりとりするのはリーダーノードだけです。リーダーノードが処理を配り、色の付いたコンピュートノードが同時に集計して、途中の結果をリーダーノードがまとめます。

2台以上のクラスターでは、クライアントがSQLを送る先はリーダーノードだけです。リーダーノードは、SQLを解析して実行計画を作ります。そして、コンピュートノードに処理を配ります。コンピュートノードは担当の行を処理し、途中の結果をリーダーノードに返します。

表の行は、あらかじめコンピュートノードに分散して保存されています。1台のコンピュートノードの中も、スライスという単位に分かれています。スライスごとに同じ処理を同時に行うので、行が多くても速く集計できます。この処理の仕方を、超並列処理と呼びます。

処理能力が足りなくなったら、ノードの数を増やすか、より大きなノードの種類に変更します。RA3などのノードでは、データの保存先が、S3を使うRedshift Managed Storageに分離されています。このため、処理能力と保存容量を別々に増やせます。料金も別々に払います。

動かして確かめる:処理を選んで、RDSとRedshiftのどちらが向くかを見る

次の図は、通販サイトの注文データの例です。処理を1つ選ぶと、向くサービスと理由、表のどこを読み書きするかが表示されます。

Amazon RDSが向く
理由
1件の注文の、すべての列をまとめて書き込む処理です。1行の値をまとめて保存する行指向が向きます。
読み書きする範囲
1行のすべての列

1行を丸ごと扱う処理はRDSに、多数の行の一部の列を集計する処理はRedshiftに向きます。キーを指定して1件ずつ読み書きする用途には、DynamoDBも候補です。

データの入れ方は、S3からCOPYで読み込むのが基本

Redshiftの表には、ほかの場所にあるデータをまとめて読み込みます。よく使うのは、S3に置いたCSVなどのファイルです。

読み込みに最も効率のよい方法は、COPYコマンドです。COPYは複数のファイルを同時に読み、コンピュートノードに分けて並列に書き込みます。INSERT文でも行を追加できますが、リーダーノードを通るので、COPYよりずっと遅くなります。

ほかのサービスから取り込む方法もあります。ゼロETL統合は、AuroraやRDSのデータを、Redshiftに複製し続ける仕組みです。業務のデータベースを使い続けたまま、複製したデータを分析できます。

Redshiftにデータを入れる主な方法(Amazon Redshift Database Developer Guide・Management Guideをもとに作成)
入れ方データの取得元向く場面
COPYコマンドS3・DynamoDB・EMRなど大量のファイルをまとめて読み込む
自動のCOPYS3の指定した場所新しいファイルが置かれるたびに読み込む
ゼロETL統合Aurora・RDS・DynamoDBなど業務のデータベースの変更を複製し続ける
ストリーミング取り込みKinesis Data Streams・Amazon MSK流れてくるデータをすぐに取り込む
INSERT文アプリやSQLのクライアント少数の行を追加する

データを整えてから取り込む流れは、データウェアハウスの記事の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は、主キーや外部キーの制約を守ります。

参考にした資料

練習問題(全5問)

Q1Amazon Redshiftの説明として最も適切なものはどれ?
Q2100列の表で、5列だけを使って全行を集計する。列指向の保存が速い理由はどれ?
Q3Redshiftのクラスターで、クライアントのSQLを受け取り、実行計画を作って処理を配るのはどれ?
Q4S3に置いた大量のCSVファイルを、Redshiftの表に読み込みたい。最も効率のよい方法はどれ?
Q5Redshiftを、注文を1件ずつ登録・更新する業務のデータベースとして使うのが向かない理由として正しいものはどれ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

AWSの記事を続けて読む

AWS 全38本中32本目