More Related Content Similar to Logをs3とredshiftに格納する仕組み Similar to Logをs3とredshiftに格納する仕組み (20) More from Ken Morishita (9) Logをs3とredshiftに格納する仕組み10. Redshi/とは
• AWSのデータベースサービス
– h;p://aws.amazon.com/jp/documentaPon/redshi//
• 大規模データの蓄積、集計などに強い
– 「Webから参照」ではなく「バッチ処理」向き
– データウェアハウス(DWH)用途
• 「Hadoop+Hive」の10倍の「速度」&「コスパ」
– h;p://www.slideshare.net/Hapyrus/amazon-‐redshi/-‐hadoop-‐hive10
10
11. Redshi/とは
• 列指向データベース
– →
集計処理やデータ圧縮にメリット
– →
1行だけ取得する、などは得意ではない
• 分散型・フルマネージドサービス
– データ容量は
2TB
〜
1600TB
まで対応可能
– 容量の変更もWebからぽちっと
• 移行時はサービスがReadOnlyになる
• Postgres8.0系のインターフェースでSQLが使える
– psql
や
Postgresql
Libraryが使える
– ODBCなども使える
11
12. Redshi/とは
• 対応リージョン(2013/05時点)
– バージニア、オレゴン、アイルランド
• DynamoDBやS3からデータのImportが可能
– 但し、S3は同一リージョンからのみ
• DynamoDB
にはリージョン制約はない?
• S3へのExportも可能
– 但し、同一リージョンへのみ
12
15. 1TBデータを保持した場合の料金比較
費目
前払い
単価
3年間費用
Redshi/
(XL
1ノード)
ノード
$3,000
$0.114/時間
$5,995
$5,995
RDS
(Xlarge
+
MulP
AZ)
インスタンス
$4,800
$0.326/時間
$13,367
$20,567
ストレージ
$0.2/月・GB
$7,200
Hadoop
+
Hive
(Xlarge
1台)
インスタンス
$1,198
$0.053
$2,590
$6,010
S3ストレージ
$0.095/月・GB
$3,420
15
3年リザーブドインスタンス
※バージニアリージョン
16. 1TBデータを保持した場合の料金比較
費目
前払い
単価
3年間費用
Redshi/
(XL
1ノード)
ノード
$3,000
$0.114/時間
$5,995
$5,995
RDS
(Xlarge
+
MulP
AZ)
インスタンス
$4,800
$0.326/時間
$13,367
$20,567
ストレージ
$0.2/月・GB
$7,200
Hadoop
+
Hive
(Xlarge
1台)
インスタンス
$1,198
$0.053
$2,590
$6,010
S3ストレージ
$0.095/月・GB
$3,420
16
Xlarge1台ではきっと遅すぎる
MulP
AZで
なければ半額
上限3TB
2TBまで同じ
S3上ではログはGZIPできるので10分の1くらいかも
18. 列の型
• 整数:
int2,
int4,
int8
• 実数:
float4,
float8,
numeric
• 論理値:
BOOL
• 文字列:
CHAR,
VARCHAR
• 日付時刻:
DATE,
TIMESTAMP
18
下記の11個
19. 文字列型の制約
• CHAR
– マルチバイト文字は扱えない
• VARCHAR
– UTF-‐8をサポート
– 65535バイトまで
– 4バイトUTF-‐8は扱えない
– 次のCode
Pointは扱えない
• 0xD800
-‐
0xDFFF
• 0xFDD0
-‐
0xFDEF,
0xFFFE,
and
0xFFFF
19
結構ひっかかりそう
21. Sort
Key
• DISK上にデータを保存するときの順序
– データブロック(1MB)単位で最大値と最小値を管理して
いる
– 不要なブロックを読まなくて済む→高速化
• こういう列を指定しましょう
– 直近のデータをよく使う
→
Timestamp
– よく範囲検索に使う列
– JOINの条件によく使う列
• 複合列で指定することもできる
21
31. 圧縮選定の支援機能
• 自動圧縮機能
– CREATE
TABLE直後の空のテーブルに対して
– COPYでデータを投入すると適切に選んでくれる
• デフォルトでは、1slice当たり10万件以上のデータが必要
• ANALYZE
COMPRESSION
– 現在のデータをみて、どの圧縮が良さそうか教えて
くれる
31
32. 制約の定義
• PRIMARY
KEY,
INDEX,
FOREIGN
KEY
は情報の
み
– 実際には何もチェックはされない
– Query
Planの参考に使われる
– でも重要だから付けておいた方が良い
• NOT
NULL制約だけはちゃんと機能する
32
34. データのImport:
COPY
コマンド
• DynamoDB
や 同一Region
S3から取り込み
• CSVやTSVのような形式のみ(JSONは非対応)
• GZIPファイルの読み込みも可能
• S3のprefixを指定して複数Importも可能
– 並列実行されるので高速になる
34
38. データ整理整頓:
VACUUM
• 2つの役割
• DELETEフラグの回収
– UPDATEやDELETEで削除フラグが付いた領域の回収
• UPDATEは内部的には「DELETE+INSERT」である
• 未ソート領域のソート
– INSERTやUPDATEされたデータは「未ソート領域」に保存される
• 両方もしくはどちらかのみの実行が可能
– ちょくちょくやるほうが実行時間は短くなる
38
40. 速度的なメモ
• 最小構成(XLノード1つ)に対して
• 1000万行(Gzip後79MB)のデータ
• COPY
に 約8分
• SELECT
key,
count(*)
などに 2〜3秒
40
h;p://qiita.com/items/b09711c41bcfc8c2f931
43. 冪等性について
• S3→Redshi/への再処理の可能性がある
• Importするデータに
”filename_”,
“lineno_”という
2列を常に追加して、再度Importするときに「検
出&削除」を事前にするようにした
• 圧縮すればそれほど容量は増加しない(はず)
– “filename_”
は
“TEXT255”
– “lineno_”
は
“Delta”
43
66. Amazon
EMR
• EMR(ElasPc
Map
Reduce)はHadoopサービス
• 色々面倒なHadoopのセットアップを省略
• クラウドらしく、必要な時に起動して、終わったら
破棄することも可能
• 今回は、常時起動して利用します
66
68. Apache
Hive
• Hadoop上のミドルウェア
– 類似にPigというのがある
• SQL
Likeにデータを操作できるので、調査には向
いている
– 新しい操作言語を覚えなくて良い
– コマンド打って戻ってくるまで1分くらいはかかるけど
• HadoopなのでHDFSやS3からデータを入出力
68
82. Hiveの動的ParPPon
• ParPPonは静的と動的がある
• 静的は、更新Queryに直接値を記述
LOAD
DATA
INPATH
‘/path/to/20130101.tsv’
INTO
TABLE
sales
parPPon
(dt=’20130101ʹ′);
• 動的は、データの値でParPPonできる
INSERT
TABLE
sales
PARTITION(date_id)
SELECT
*
FROM
hive_sales;
82
91. HiveにImportする時の冪等性の確保
■
Step
2
Import
IDをParPPon
Keyとして Insert
Overwrite
→
ParPPonを一旦削除してからコピーするので冪等
91
File
A
File
B
File
C
Import
ID
1
EMRクラスタ
ImportID=1/FileA
/FileB
/FileC
このImportIDが既に存在すれば、削除してからImportされる
MySQL
正常終了→完了フラグ
95. 処理性能の参考値
95
ログ
Fluentd
tail
Fluentd
s3
S3
Master
Core
Core
EMRクラスタ
MySQL
Hive
Small
×
5台
Large
×
2台
xlarge
×
1台
xlarge
×
2台
2000
Line/sec/台
×
2系統
10000
Line/sec
×
2系統
5分毎にUpload
5分毎にImport
(重複起動なし)
96. 処理性能の参考値
96
ログ
Fluentd
tail
Fluentd
s3
S3
Master
Core
Core
EMRクラスタ
MySQL
Hive
Small
×
5台
Large
×
2台
xlarge
×
1台
xlarge
×
2台
2000
Line/sec/台
×
2系統
10000
Line/sec
×
2系統
5分毎にUpload
5分毎にImport
(重複起動なし)
(A)から20〜40分後にHiveに格納された
ここまで
ほぼ遅延なし
15~20分程度
(A)
72時間で51.84億件 全てHiveに保存された
101. Log
Rotateの設定
Log
Rotateで create
オプションを付けると、Rotateした後に新
規に元ファイルを作成する
しかし、O_CREAT
で作成するので
→
ログをRotate
→<別プロセスがログを書く>(*A)
→
O_CREAT
→(*A)が消失する
ので、少し注意が必要である。
※
Kill
–HUP
するようなケースは気にしなくて良い
101
105. Hiveの動的ParPPonの上限
ParPPon数の上限がデフォで1000なので、
SET
hive.exec.dynamic.parPPon=true;
SET
hive.exec.dynamic.parPPon.mode=nonstrict;
SET
hive.exec.max.dynamic.parPPons=1000000;
SET
hive.exec.max.dynamic.parPPons.pernode=1000000;
SET
hive.exec.max.created.files=15000000;
みたいにして増やしておく必要がある
(数は適当。デメリット等は不明。単に増えると遅いのだ
と思う)
105
106. Hive実行時のOpPonメモ
106
SET
hive.exec.dynamic.parPPon=true;
SET
hive.exec.dynamic.parPPon.mode=nonstrict;
SET
hive.exec.max.dynamic.parPPons=1000000;
SET
hive.exec.max.dynamic.parPPons.pernode=1000000;
SET
hive.exec.max.created.files=15000000;
SET
hive.exec.compress.output=true;
SET
io.seqfile.compression.type=BLOCK;
SET
hive.exec.compress.intermediate=true;
SET
hive.intermediate.compression.type=BLOCK;
SET
mapred.output.compress=true;
SET
mapred.output.compression.type=BLOCK;
SET
mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET
hive.merge.mapfiles=true;
SET
hive.merge.mapredfiles=true;
SET
hive.merge.size.per.task=256000000;
SET
hive.merge.size.smallfiles.avgsize=16000000;