Download - Amazon Athena 初心者向けハンズオン
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Makoto Shimura, Data Science Solution ArchitectAmazon Web Services Japan, K. K.2017.10.25
Amazon Athena初⼼者向けハンズオン
⾃⼰紹介
所属:アマゾンウェブサービスジャパン株式会社
業務:ソリューションアーキテクト(データサイエンス領域)
経歴:Hadoopログ解析基盤の開発データ分析データマネジメントや組織のデータ活⽤
志村 誠 (Makoto Shimura)
ハンズオンの最中に質問を投げることができます
• Adobe Connect の Q&A ウィンドウから、質問を書き込んでください。(書き込んだ質問は、主催者にしか⾒えません)
• 今後のロードマップに関するご質問はお答えできませんのでご了承ください。
• Twitter へツイートする際はハッシュタグ #awsblackbelt をご利⽤ください。
Q&A ウインドウの右下のフォームに質問を書いてください
質問を書き終わったら吹き出しマークを押して送信してください
このハンズオンの⽬的
1. Amazon Athena がどのようなものかを理解する
2. 実際に Amazon Athena を使ってみて,AWS のマネジメントコンソールからクエリを投げたり,データの持ち⽅によるクエリ速度の違いを体感たりする
注意点
このハンズオンでは,ごくわずかですが,Amazon Athena の利⽤料⾦が発⽣します
Amazon Athena の料⾦は,スキャンしたデータ 1 TB につき 5 ドル(課⾦単位は MB で,最低 10 MB から)
詳細は以下の AWS の公式サイトをご確認くださいhttps://aws.amazon.com/jp/athena/pricing/
事前に準備すべきもの
AWS アカウント• AWS アカウント作成の流れとポイント
https://aws.amazon.com/jp/register-flow/
Web ブラウザ• Firefox または Chrome を推奨
注意事項• お客様の環境により、本ラボが実施できない場合がございます
• すべてのサポートは難しい点についてご了承ください• 本資料からコピーアンドペーストしないでください
• 不必要なスペース等が⼊る可能性があります• 複数の画⾯を表⽰するため、ディスプレイ表⽰を⼯夫してください
オンラインセミナー配信画⾯
ブラウザ(Chrome, Firefox)・資料(PDF)閲覧・AWS マネジメントコンソール・簡易アプリケーション・⼊⼒⽤テキストなど 任意のテキストエディタ
・コピーアンドペースト⽤に使⽤
Agenda
Amazon Athena 概要• Amazon Athena とは• Amazon Athena のデータ形式とパフォーマンス
ハンズオン• 前準備とデータの確認• サンプルデータを S3 にアップロードしてクエリ• ファイルフォーマットによるクエリ速度の違いを確認
Amazon Athena とは• re:Invent 2016 のキーノートにて発表された新サービス• バージニア北部,オレゴン,オハイオ,アイルランド,シンガポール,
東京の計 6 リージョンで展開• クエリエンジンとして Presto を使⽤
https://aws.amazon.com/jp/blogs/news/amazon-athena-interactive-sql-queries-for-data-in-amazon-s3/
Presto : ⾼速な分散クエリエンジン• Athenaで使⽤しているクエリエンジン• データをディスクに書き出さず,すべてメモリ上で処理• ノード故障やメモリ溢れの場合にはクエリ⾃体が失敗• インタラクティブクエリ向け
https://prestodb.io/overview.html
参考: Presto のアーキテクチャ
Athena のデータ形式 / 圧縮形式データ形式 圧縮形式
• CSV• TSV• Parquet• ORC• JSON• Regex• Avro• Cloudtrail• Grok
• Snappy• Zlib• GZIP• LZO
* https://aws.amazon.com/jp/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/** https://aws.amazon.com/about-aws/whats-new/2017/08/amazon-athena-adds-support-for-querying-data-using-logstash-grok-filters/
データ設計に影響する Athena の特性
• Athena は読み込むデータ量を絞って,すべての処理をメモリ状で⾏うことで,⾼速に結果を返すことができる
• いかにして読み込むデータ量を減らすかが重要• パーティション• 列指向フォーマット• 圧縮
* Online Transactional Processing ** Online Analytical Processing
パーティション
• S3のオブジェクトキーの構成をテーブルに反映して,読み込むファイル数を減らす
• WHERE で読み込み範囲を絞るときに頻繁に使われるカラムを,キーに指定する
• 絞り込みの効果が⾼いものが向いている• ログデータの場合,⽇付が定番• “year/month/day” と階層で指定する
SELECTmonth, action_category, action_detail, COUNT(user_id)
FROMaction_log
WHEREyear = 2016AND month >= 4AND month < 7
GROUP BYmonth, action_category, action_detail
以下のS3パスだけが読み込まれるs3://athena-examples/action-log/year=2016/month=04/day=01/...s3://athena-examples/action-log/year=2016/month=07/day=31/
列指向フォーマット
指向 特徴
⾏指向• レコード単位でデータを保存• 1カラムのみ必要でも,レコード全
体を読み込む必要がある• TEXTFILE(CSV, TSV) など
列指向• カラムごとにデータをまとめて保存• 特定の列だけを扱う処理では,ファ
イル全体を読む必要がない• ORC, Parquet など
https://orc.apache.org/docs/spec-intro.html
1 2 3 4 5 6
1 2 3 4 5 6
列指向
⾏指向
1 2 3 4 5 6
列指向フォーマット & 圧縮
分析クエリを効率的に実⾏できる
たいていの分析クエリは,⼀度のクエリで⼀部のカラムしか使⽤しない単純な統計データなら,メタデータで完結する
1 2 3 4 5 6 1 2 3 4 5 6
列指向⾏指向
データ読み込みの効率があがる• 圧縮と同時に使うことで読み込み効率が向上• カラムごとに分けられてデータが並んでいる• 同じカラムは,似たような中⾝のデータが続く
ため,圧縮効率がよくなる
1 2 3 4 5 61 2 3 4 5 6
列指向⾏指向
料⾦体系
• クエリ単位の従量課⾦• S3 のデータスキャンに対して,$5 / 1TB の料⾦
• バイト数はメガバイト単位で切り上げられ,10MB 未満のクエリは 10MB と計算される(0.0055円/10MB; 1$=110円)
• スキャンデータ量は,圧縮状態のデータサイズで計算される
• 別リージョンからデータを読み込む場合には,別途S3のデータ転送料⾦がかかる
• DDL のクエリや,実⾏に失敗したクエリの料⾦は無料• キャンセルしたクエリは料⾦がかかる
進捗確認ログインと環境設定まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンを クリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ハンズオン(1)サンプルデータをS3 にアップロードしてクエリ
AWS アカウント ID を確認しておく
• 画⾯右上をクリックして,AWS アカウント ID をメモ• ハイフンは除いた 12 桁の数字でメモしてください
1. 画⾯右上のユーザー名をクリック
2. アカウントID をメモハイフンは無視
必要事項を⼊⼒してバケットを作成
1. バケット名を⼊⼒「アカウントID-20171025-titanic」
2. リージョンが「⽶国東部(バージニア北部)」であることを確認
3. 「作成」をクリック
ダウンロードしたクエリファイルの確認
• テキストエディタで,titanic.sql を開く• 16 ⾏⽬の S3 バケットを,先ほど作成したものに変更
バケット名を,先ほど作成した「アカウントID-20171025-titanic」に変更する
進捗確認クエリファイルの修正まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
Athena の開始画⾯
Athena を初めて使う場合には,この画⾯が表⽰されるので,
「Get Started」を押して先に進む
チュートリアルがハイライトされる場合には,× ボタンを押して,元の画⾯に戻る
進捗確認テーブルデータの確認まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
クエリの内容を確認
selectclass, sex, count(survived) as total_cnt, sum(survived) as survived_cnt
fromtitanic_db.titanic
group byclass, sex
order byclass
, sex;
クエリの内容を確認
selectclass, sex, count(survived) as total_cnt, sum(survived) as survived_cnt
fromtitanic_db.titanic
group byclass, sex
order byclass
, sex;
以下の 4 カラムを返す- 客室ランク,- 性別,- 全乗客数,- ⽣存者数(値が 1 のもの)
客室ランクと性別ごとに値を集約する
客室ランクと性別で,アルファベット順に並べる
クエリの内容を確認selectclass, sex, total_cnt, survived_cnt, round(cast(survived_cnt as double)/cast(total_cnt as double), 2) as survival_rate
from (selectclass, sex, count(survived) as total_cnt, sum(survived) as survived_cnt
fromtitanic_db.titanic
whereclass != '*ʼ
group byclass, sex
)order bysurvival_rate desc;
クエリの内容を確認selectclass, sex, total_cnt, survived_cnt, round(cast(survived_cnt as double)/cast(total_cnt as double), 2) as survival_rate
from (selectclass, sex, count(survived) as total_cnt, sum(survived) as survived_cnt
fromtitanic_db.titanic
whereclass != '*ʼ
group byclass, sex
)order bysurvival_rate desc;
⽣存者数を⼈数で割って⽣存率を算出
先ほどのクエリをサブクエリとして実⾏して,その結果に対してさらに処理を⾏う
進捗確認クエリ結果の確認まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ハンズオン (2)ファイルフォーマットによるクエリ速度の違いを確認
対象データ: Swingbench
• ベンチマーク⽤のサンプルデータベース• その中の Sales テーブルを使⽤
データサイズ 約 90 GB
データサイズ(gzip圧縮時) 約 40 GB
行数 1,472,876,032行
期間 1995/01 – 2013/12
同⼀テーブルを 2 種類のデータ形式で読込
データ形式 圧縮形式 パーティション クエリ実⾏速度
tsv gzip なし• 遅い• すべてのカラムを読み込む
必要あり
parquet snappy年,⽉でパーティション作成
• 速い• クエリで必要なカラムのみ
読み込む• クエリで必要なパーティ
ションのみ読み込む
作成したテーブルのパーティションを認識1.「 parquet + snappy テーブルの
パーティションを認識 」のクエリをコピーして貼付
2. クエリの実⾏
3. しばらく待つと,Results に認識されたパーティションの⼀覧が表⽰される
作成したテーブルのパーティションを確認
1.「 作成したパーティションの確認」のクエリをコピーして貼付
2. クエリの実⾏
3. しばらく待つと,Results に認識されたパーティションの⼀覧が表⽰される
進捗確認パーティションの確認まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
tsv + gzip テーブルに対するクエリの実⾏ (1)
selectprod_id, count(1) as deal_conut, avg(quantity_sold) as average_sold_num, sum(quantity_sold*amount_sold) as total_sales
fromswingbench_db.sales_gz
whereyear(time_id) = 2013and month(time_id) = 4
group byprod_id
order bytotal_sales desc
limit 20;
tsv + gzip テーブルに対するクエリの実⾏ (2)
selectprod_id, count(1) as deal_conut, avg(quantity_sold) as average_sold_num, sum(quantity_sold*amount_sold) as total_sales
fromswingbench_db.sales_gz
whereyear(time_id) = 2013and month(time_id) = 4
group byprod_id
order bytotal_sales desc
limit 20;
gz テーブルに対するクエリ
timestamp を年⽉に変換
tsv + gzip テーブルに対するクエリの実⾏ (3)
1.「 tsv テーブルに対してクエリ」のクエリをコピーして貼付
2. クエリの実⾏
3. 実⾏時間とスキャンデータ量を確認する
4. 結果を確認
parquet + snappy テーブルに対するクエリの実⾏ (1)
selectprod_id, count(1) as deal_conut, avg(quantity_sold) as average_sold_num, sum(quantity_sold*amount_sold) as total_sales
fromswingbench_db.sales_parquet
whereyear = 2013and month = 4
group byprod_id
order bytotal_sales desc
limit 20;
parquet + snappy テーブルに対するクエリの実⾏ (2)
selectprod_id, count(1) as deal_conut, avg(quantity_sold) as average_sold_num, sum(quantity_sold*amount_sold) as total_sales
fromswingbench_db.sales_parquet
whereyear = 2013and month = 4
group byprod_id
order bytotal_sales desc
limit 20;
parquet テーブルに対するクエリ
パーティション情報を利⽤
parquet + snappy テーブルに対するクエリの実⾏ (3)
1.「 parquet テーブルに対してクエリ 」のクエリをコピーして
貼付
2. クエリの実⾏
3. 実⾏時間とスキャンデータ量を確認する
4. 結果が先ほどと同じなのを確認
進捗確認クエリの実⾏まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ハンズオン (3)複数のユーザで Athena を利⽤
Amazon Athena ⽤の IAM ロールの作成
• IAM は,Identity and Access Management という,AWS 上での権限管理を⾏うためのサービスです
• Athena を使⽤するためには,以下の権限が必要です• Amazon Athena へのフルアクセス権限• Amazon S3 オブジェクトへの Read/Write/List 権限• AWS Glue のデータカタログの主要 API へのアクセス権限
IAM ユーザーを新規に作成
1. ユーザー名に「athena_user」と⼊⼒する
2. 「awsマネジメントコンソールへのアクセス」にチェック
3. パスワードのリセットが必要のチェックを外す
4. 「次のステップ」を押す
進捗確認ユーザーの作成まで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
バケットが作成できないことを確認
1. バケット名を⼊⼒「アカウントID-20171025-titanic」
2. リージョンが「⽶国東部(バージニア北部)」であることを確認
3. 「作成」をクリック
進捗確認管理者ユーザーでのサインインまで終わりましたか?
1. ⼈型アイコン右の ▽ ボタンをクリックしてプルダウンを開く
2. 「賛成」をクリック(ボタンが「賛成の消去」に変わるので,そのまま待つ)
3. 確認が終わったら,「賛成を消去」をクリック
Athena のテーブルとデータベースを削除
1. athena_cleanup.sql の中のクエリをについて,最初の 1 ⾏を貼り付ける
2. クエリを実⾏
3. 上記の 1-2 を,残りのクエリのぶんだけ繰り返す
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ハンズオン (4)AWS QuickSight から Athena に接続
QuickSight の初期設定 1. 「Quicksight account name」に適当な名前を⼊⼒
2. 「Notification email address」に⾃分の AWS アカウントで使⽤しているメールアドレスを⼊⼒
3. 「region」はUS East (N. Virginia) を選択
4. チェックボックスはすべて選択
5. 「Finish」を押す