RedshiftのGettingStartedやってみた

Redshiftを使った事がなかったのでGettingStartedをやってみたのでそのメモ。

[Amazon Redshift の使用を開始する](http://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/getting-started.html)

# 事前準備

+ Redshift用のInboundでTCPの5439ポートを許可するSecutiryGroup
+ S3へのアクセス権限を持ったIAMのアクセスキー及びシークレットキーを控える

# EC2の起動

+ VPCにAmazonLinuxのEC2を起動

# Redshiftの起動(クラスターの起動）

ユーザー名などは任意で

Cluster Details

+ Cluster Identifier->my-example-cluster
+ Database Name->()
+ Database Port->5439
+ Master User Name->masteruser
+ Master User Password->xxxx

Node Configuration

+ Node Type->dc1.large(7 EC2 Compute Units(2 Virtual cores)per node
+ Cluster Type->Single Node

Additional Configuration

+ Encrypt Database->None
+ Choose a VPC->Default VPC
+ Cluster Subnet Group->default
+ Public Accessbile->No
+ Availability Zone->No Preference
+ VPC Secutity Groups->事前準備で作成したものを設定

# psqlで接続する

Postgresqlの互換性があり、psqlで接続できるようなのでやってみる。事前にRedshift起動後、接続先endpointは確認しておくこと。

```bash
# psqlのインストール
$sudo yum install postgresql94 -y

# psqlで接続
$psql -U masteruser -h <endpoint> -p 5439 dev
```

# S3からデータを突っ込んでみる

以下の通り、事前に準備してあるS3のデータをCOPYコマンドで登録します。

[ステップ 5: Amazon S3 のサンプルデータをロードする](http://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/rs-gsg-create-sample-db.html)

まずはテーブルを作成します。

```createtable.txt
create table users(
	userid integer not null distkey sortkey,
	username char(8),
	firstname varchar(30),
	lastname varchar(30),
	city varchar(30),
	state char(2),
	email varchar(100),
	phone char(14),
	likesports boolean,
	liketheatre boolean,
	likeconcerts boolean,
	likejazz boolean,
	likeclassical boolean,
	likeopera boolean,
	likerock boolean,
	likevegas boolean,
	likebroadway boolean,
	likemusicals boolean);

create table venue(
	venueid smallint not null distkey sortkey,
	venuename varchar(100),
	venuecity varchar(30),
	venuestate char(2),
	venueseats integer);

create table category(
	catid smallint not null distkey sortkey,
	catgroup varchar(10),
	catname varchar(10),
	catdesc varchar(50));

create table date(
	dateid smallint not null distkey sortkey,
	caldate date not null,
	day character(3) not null,
	week smallint not null,
	month character(5) not null,
	qtr character(5) not null,
	year smallint not null,
	holiday boolean default('N'));

create table event(
	eventid integer not null distkey,
	venueid smallint not null,
	catid smallint not null,
	dateid smallint not null sortkey,
	eventname varchar(200),
	starttime timestamp);

create table listing(
	listid integer not null distkey,
	sellerid integer not null,
	eventid integer not null,
	dateid smallint not null  sortkey,
	numtickets smallint not null,
	priceperticket decimal(8,2),
	totalprice decimal(8,2),
	listtime timestamp);

create table sales(
	salesid integer not null,
	listid integer not null distkey,
	sellerid integer not null,
	buyerid integer not null,
	eventid integer not null,
	dateid smallint not null sortkey,
	qtysold smallint not null,
	pricepaid decimal(8,2),
	commission decimal(8,2),
	saletime timestamp);
```


```bash
# psqlからSQLを実行
$psql -U masteruser -h <endpoint> -p 5439 dev -f createTable.sql

# ログインしてテーブル定義を確認
$psql -U masteruser -h <endpoint> -p 5439 dev

dev=# \d
           List of relations
 schema |   name   | type  |   owner
--------+----------+-------+------------
 public | category | table | masteruser
 public | date     | table | masteruser
 public | event    | table | masteruser
 public | listing  | table | masteruser
 public | sales    | table | masteruser
 public | users    | table | masteruser
 public | venue    | table | masteruser
(7 rows)
```

次にS3からデータを取得して突っ込みます。
`<aws_access-key-id`と`secret-access-key`は事前準備で作成したS3へのアクセス権があるものに置換してください。

```copy.sql
copy users from 's3://awssampledbuswest2/tickit/allusers_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' region 'us-west-2';

copy venue from 's3://awssampledbuswest2/tickit/venue_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' region 'us-west-2';

copy category from 's3://awssampledbuswest2/tickit/category_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' region 'us-west-2';

copy date from 's3://awssampledbuswest2/tickit/date2008_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' region 'us-west-2';

copy event from 's3://awssampledbuswest2/tickit/allevents_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-west-2';

copy listing from 's3://awssampledbuswest2/tickit/listings_pipe.txt' 
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 
delimiter '|' region 'us-west-2';

copy sales from 's3://awssampledbuswest2/tickit/sales_tab.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'
delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS' region 'us-west-2';
```

同じように実行

```bash
$psql -U masteruser -h <endpoint> -p 5439 dev -f copy.sql
```

登録されたか確認します。

```select.sql
select count(*) from users;
select count(*) from venue;
select count(*) from category;
select count(*) from date;
select count(*) from event;
select count(*) from listing;
select count(*) from sales;
```

```bash
$psql -U masteruser -h <endpoint> -p 5439 dev -f copy.sql
```

# リソース削除

EC2のterminate,RedshiftのshutdownをCLIかマネージメントコンソールから
特ににRedshiftは忘れずに。

# 所感

+ 簡単にクラスタが組めて面白い
+ Postgresql互換なのでとっつきやすい
+ S3からのコピーが簡単