AWS認定データ分析 - 専門知識を受験した時の話

## この記事の概要
2022/12/03
**AWS認定データ分析 - 専門知識**
(AWS Certified Data Analytics - Specialty(DAS-C01))
を受験したので、その時の記録

復習用ノートとして、また後で見返して今後の資格試験受験時の参考にしたり仕事で使いたくなったとき思い出せるようにまとめます。

## 試験の概要

![スクリーンショット 2022-11-06 18.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/d3bc77b0-4a44-8d6e-f85b-3290d2c175d0.png)

**SPECIALTY**カテゴリの試験で、この試験では「AWS データレイクと分析サービスを利用して、データからインサイトを得るための専門知識を認定します。」とのこと。
AWS公式より引用：[引用元](https://aws.amazon.com/jp/certification/certified-data-analytics-specialty/)

**◼︎ 試験要項**
問題数　　：65問(うち15問は採点対象外)
試験時間　：180分
受験料　　：¥30,000(税別)※公式サイトでは「300USD」の表記ですが、為替レートに関わらず税別¥30,000です。
合格ライン：100~1000点中750点(約72%、採点対象の問題37/50正解で合格)
受験資格　：なし
有効期限　：3年

**◼︎ 出題範囲**

| 分野 | 出題割合 |
|:--|:--:|
| 第 1 分野: 収集 | 18% |
| 第 2 分野: ストレージとデータ管理 | 22% |
| 第 3 分野: 処理 | 24% |
| 第 4 分野: 分析と可視化 | 18% |
| 第 5 分野: セキュリティ | 18% |

**2022/11時点の最新バージョン(Ver.2.0)** のものです。
バージョンアップで範囲等は変更されるので、受験時は公式サイトの「試験ガイド」を確認してください。
[AWS Certified Data Analytics - Specialty 認定](https://aws.amazon.com/jp/certification/certified-data-analytics-specialty/)

## 勉強開始前の状態
AWSで動いているアプリの保守開発/運用の業務を5年程度、現在も継続中。データ分析の経験はゼロ。
AWS認定はこれまで9個取得済み。

- [AWS認定ソリューションアーキテクトを受験した時の話](https://qiita.com/aminosan000/items/24c6dff9532658a5c4d5)
- [AWS認定デベロッパーアソシエイトを受験した時の話](https://qiita.com/aminosan000/items/89bc76f77626314f3182)
- [AWS認定SysOpsアドミニストレーターアソシエイトを受験した時の話](https://qiita.com/aminosan000/items/b1765260e8ad1435a366)
- [AWS認定ソリューションアーキテクトプロフェッショナルを受験した時の話](https://qiita.com/aminosan000/items/f172b7add8303926bddc)
- [AWS認定DevOpsエンジニアプロフェッショナルを受験した時の話](https://qiita.com/aminosan000/items/ee2fe130bfca1164f4a5)
- [AWS認定セキュリティ - 専門知識を受験した時の話](https://qiita.com/aminosan000/items/435fc411a4d10cf6ba43)
- [AWS認定データベース - 専門知識を受験した時の話](https://qiita.com/aminosan000/items/1f2a8d5b7611a3d31247)
- [AWS認定アドバンストネットワーキング - 専門知識を受験した時の話](https://qiita.com/aminosan000/items/dfea62d2c6cc2763d15c)

## 勉強に使ったもの

**1. AWS公式模擬試験(AWS Certified Data Analytics - Specialty Official Practice Question Set (DAS-C01 - Japanese))**
**AWS Skill Builder**で**無料**で提供されている20問の**模擬試験**。何度でも実施できるのではじめに実施します。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/12508/aws-certified-data-analytics-specialty-official-practice-question-set-das-c01-japanese

**2. AWS公式E-learning(Exam Readiness: AWS Certified Data Analytics - Specialty (Japanese))**
**AWS Skill Builder**で**無料**で提供されている試験対策の**公式E-learning**、試験範囲についてサンプル問題をはさみながら教えてくれます。試験範囲の要点について知ることができるので、受講する価値はあると思います。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/12387/exam-readiness-aws-certified-data-analytics-specialty-japanese

**3. オンライン問題集(非公式)**
AWS認定受験時に毎回購入している「Whizlabs」
DASのコースは最新のバージョンの問題が **265問(65問×3パターン+セクション問題が50問+お試し問題が20問)** 用意されています。
**18.95USD**からクーポン利用で30%offの**13.27USD**(日本円で¥2,000ぐらい) でした。
円安の影響もあり昔に比べて少し高くなりましたね、買い切りで内容の更新もされるのでXmasやBlackFlidayなどで**割引率が高い**クーポンが出てきたときに買っておくと少し**お得**になりますが、今回は11月中に受験したかったので、30%offで我慢します。
いつもどおり、Google翻訳で翻訳して利用。

https://www.whizlabs.com/learn/course/aws-certified-data-analytics-specialty/

## 勉強(試験準備)の流れ
### 1. 試験ガイドを読む
はじめに、公式サイトの[「**試験ガイド**」](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-analytics-specialty/AWS-Certified-Data-Analytics-Specialty_Exam-Guide.pdf)を読みます。
メインは↓の「アナリティクス」関連のサービスですね、きっと。

アナリティクス:
 - Amazon Athena
 - Amazon CloudSearch
 - Amazon Elasticsearch Service (Amazon ES)
 - Amazon EMR
 - AWS Glue
 - Amazon Kinesis (Kinesis Video Streams を除く)
 - AWS Lake Formation
 - Amazon Managed Streaming for Apache Kafka
 - Amazon QuickSight
 - Amazon Redshift

全く触れたことがないサービスもあるので、要勉強です。

### 2. サンプル問題と模試を実施する
次に、公式の**サンプル問題と模試**をやってみます。
**無料**なので気軽に実施できます。これで**問題のレベル感**と**自分のレベル感**、そのギャップを確認します。
もちろんここでわからなかった部分はメモしておいて**後で調べます**。覚えたほうが良さそうな部分は**ノートに書き出します**。

### 3. Exam Readinessを受講する
公式E-Learningはためになることが多いので、受講しておきます。

### 4. 練習問題を解く
すでに基礎知識はあるので、練習問題を解いてわからないところを集中的に勉強します。
全問解いてから回答の確認をしていると問題文を2回ずつ読むことになって効率が悪いので、practice modeでその場で回答を確認し、間違っていた場合メモしたりすぐに調べるようにしています。

### 5. 復習する
ここまで勉強しながらまとめたノートと練習問題の回答/解説を見返しながら、覚え直し+まだ足りなそうな部分の勉強をします。
今回は

- Amazon EMR
- Amazon Kinesis
- Amazon Redshift
- Amazon QuickSight
- Amazon Elasticsearch Service
- AWS Glue

のBlackBelt過去動画を見て勉強。2倍速で再生しながら気になったところで止めてメモしたりします。

いつも書いていませんでしたが、はじめにこの記事を途中まで書いて、試験準備としてやるべきこととそれにかかる時間を計算して、スケジューリングしたりしています。
例えば問題集が**265問**あるので、だいたい**10問で1h**として**26.5時間**+**模試1h**+**E-learning6h**で**33.5h**が最低ライン = **2.5週間(平日1h/日, 休日5h)**
プラス理解不足の解消でBlackBeltを見たりすると**もう1週間増えて3週間**〜とか、カレンダーに置きながら計画します。

## 勉強時間
**約45時間**

## 受験後
結果は**スコア794**で合格。
自信を持って答えられない問題も多く、150分間使って回答したあと30分間見直しで制限時間ギリギリまで使いました。

![スクリーンショット 2022-12-03 21.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/9bde690c-b40d-ee7e-64e0-9338bb223c7f.png)

![スクリーンショット 2022-12-03 21.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/0f13bb23-a404-52b2-3886-eff2054e78aa.png)

![スクリーンショット 2022-12-03 21.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/57f8c20d-f5c2-05c3-e0c9-a28fc707a264.png)

AWS認定は試験終了後、その場で合否が画面に表示されるときとされないときがあるんですが、今回は表示されるやつでした。
最近更新されたものは表示されない？

AWS認定12種、残りはMLとSAP on AWSの2つ、MLはDAと近い分野なのでこのまま勉強を続けて近いうちに受験予定です。

![スクリーンショット 2022-12-04 11.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/0f55871a-a256-17bf-c281-598ae44ec21d.png)

## 勉強ノート
試験のために勉強しながらまとめたノート  
※ここに書いてあることは、あくまで私が理解が足りないと感じ、覚えたかったことだけです。試験範囲を網羅はしていません。

### データ分析関連用語

| 用語 | 説明 |
|:-|:-|
| **データレイク**<br>(Data Lake) | データの構造や大きさ、性質、種類などにかかわらず、あらゆるデータを**未加工の生データ**の形で集めるDB/ストレージ(そのままのデータたちが漂う湖) |
| **データウェアハウス**<br>(DWH:Data Ware House) | 分析しやすいよう**変換/構造化されたデータ**を格納するDB(きれいに箱詰めされて整頓されたデータたちが保管される倉庫) |
| **データマート**<br>(Data Mart) | 用途に応じて分析に**必要なデータ**だけに素早くアクセスできるように**分割**した小規模なDB(ジャンルごとの商品を並べる市場) |
| **BIツール**<br>(ビジネスインテリジェンスツール) | さまざまなデータを集約し、**分析/視覚化**を行いビジネスに活用するためのツール、**グラフやテーブルを表示するダッシュボード**を提供する。 |
| **インサイト**<br>(洞察/Insights) | データ分析から導き出される**本質的需要** |
| **巡回セールスマン問題** | ある箇所から複数の地点を巡って戻ってくる際の**最短経路**を求める問題 |
| **サイロ化**<br>(silos) | データやシステムが部署などで**分割**され、連携/集約による活用ができていない状態、あるいは意図的に**相互に分離**された状態。 |

### データ分析ワークロードのアーキテクチャ

AWSを利用したデータ分析ワークロードは**データソースや利用目的**によりアーキテクチャに最適なサービスが異なる。
この試験では要件に応じた最適なアーキテクチャを選択する問題も出題される。
これはデータ分析に限らず、大きなデータを集計/取り込み/出力するバッチ処理の設計にも活かせるので覚えておく。

- **データソース**の種類(input)
- 中間処理の**リアルタイム性**
- 分析結果の**利用方法**(output)

などに注目する。

まず「**データソース**」

- **RDB**: DMSの「継続的なレプリケーション」または「変更データキャプチャ (CDC)」によりS3へデータの変更を同期する
- **オンプレ**: DataSyncエージェントをインストールし、S3へ変更を同期する
- **DynamoDB**: GlueでS3へ出力、またはDynamoDBストリーム→Lambda→Kinesis Data FirehoseでS3やKinesis Data Analyticsへストリームを出力する
- **IoTデバイス**: Kinesisへストリーミングまたは、IoT Coreを通してDynamoDB,S3,Lambda,OpenSearch等に送信

次に「**リアルタイム性**」

- **リアルタイム**: Kinesis Data Analytics等のストリームで処理する
- **バッチ処理**: Glue、EMR等で大量データを一括で処理する

そして「**出力先**」

- **アドホッククエリ**: 蓄積したデータに対し必要に応じた(アドホック)クエリをしたい場合、RedshiftやS3に格納し、Redshiftの場合直接、S3の場合Athenaでクエリする
- **ダッシュボード(視覚化)**: ダッシュボードを作成し、必要なデータをグラフで視覚化する場合、上記のRedshiftやAthenaをソースにQuickSightでダッシュボードを作成するか、OpenSearchに送信しKibanaでダッシュボードを作成する

データ分析関連のサービスとその他のサービスの関係を書き出してみる。
![Architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/0e392c78-c3bc-0598-84f1-1ff870ff7694.png)
※この中にない入出力も可能だが、AWS推奨のプラクティスとしてよく登場するようなデータの流れを図にした
※Kinesis Data Firehoseは出力先にRedshiftを指定できるが、内部ではS3に一度出力しCOPYコマンドを呼び出しているため、Redshiftへの直接出力ではない

### Amazon EMR
**Apache Hadoop**や**Apache Spark**などの**ビッグデータフレームワーク**を使用して大量データを処理/分析するインスタンス群を構築/管理できるサービス。

Apache Hadoopエコシステムはバッチ処理やリアルタイム処理、ML、インタラクティブな処理などを行えるOSS群。

![スクリーンショット 2022-11-30 1.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/a506c9c6-7373-9b82-7bb3-feac3f4c2b76.png)

![スクリーンショット 2022-11-30 1.34.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/bd42863f-2668-e224-e482-29cf0047cae0.png)

![スクリーンショット 2022-11-30 1.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/b8674e7c-6b1a-0749-960d-3d4c7f6cf104.png)

■構成イメージ図
![Untitled(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/809ccc65-4061-fc93-bc13-f1575ad5b375.png)

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-what-is-emr.html

https://www.youtube.com/watch?v=G9KWJtCX2ws

#### ノード
EMRのクラスターには3つのノードタイプが存在し、クラスター作成時にそれぞれのスペックや数を設定する。

![スクリーンショット 2022-11-30 1.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/dbd7137b-4bee-504f-91fc-a96c26ff664f.png)

| ノードタイプ | 説明 |
|:-|:-|
| マスターノード | クラスターを管理するノード。マスターノードが1つの場合単一障害点となる。マルチマスターモードを選択するとマスターノードは3つになり障害時自動的にフェイルオーバーする。 |
| コアノード | マスターノードによって管理される。実行中のコアノード停止はデータ損失となるるためスポットインスタンスの利用時は注意。 |
| タスクノード | 計算タスクを実行するためのノード。エフェメラルストレージへのデータ保存などを行わないため、スポットインスタンスなどで途中で終了されても問題ない。 |

![スクリーンショット 2022-11-24 20.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/ff65e4c4-d43b-f8c0-5bc0-7cfe2216b9b9.png)

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-master-core-task-nodes.html

#### ソフトウェア
クラスター構成時にHadoop、Hive、Jupyter、SparkなどのHadoopエコシステムのソフトウェアから有効にするものを選択する。

![スクリーンショット 2022-11-24 20.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/2e210c3f-b4b7-1615-fd1e-f1b48d8e37a8.png)

![スクリーンショット 2022-11-30 1.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/8202dc8a-d70b-285f-22da-ddd5e58b8d3c.png)


■各ソフトウェアの概要

| ソフトウェア | 概要 |
|:-|:-|
| Hadoop | **大規模データの蓄積・分析**を分散処理技術によって実現するオープンソースのミドルウェア。 |
| JupyterHub | シングルユーザーモードの**Jupyterノートブックサーバー**の複数のインスタンスをホストできる。 |
| Ganglia | Hadoopの**メトリクスを監視**する。 |
| Hive | HDFSで大規模なデータセットのクエリを実行するのに役立つ**SQLライクなデータウェアハウジング**システム |
| JupyterEnterpriseGateway | 遠隔地にあるノートブックに代わってカーネルを起動することができるWebサーバー。 |
| Mahout | Hadoopの**機械学習**ライブラリの1つ |
| Oozie | Hadoopの**ジョブスケジュール**に使用される、JavaのWebアプリケーション。 |
| TensorFlow | Googleが開発した**機械学習**ライブラリ、TonY(TensorFlow on YARN)によりHadoop上での分散処理ができる。 |
| Zeppelin | インタラクティブな**データ検索用のノートブック**。 |
| Tez | YARNをベースにした、高パフォーマンスのバッチおよびインタラクティブなデータ処理アプリケーションのためのフレームワーク。 |
| HBase | HDFSの最上位に位置する**列指向**の非リレーショナルデータベース。 |
| Presto | 複数のソースからの大量のデータセットの対話型分析クエリ用に設計された**高速のSQLクエリエンジン**。 |
| MXNet | ニューラルネットワークやその他の**ディープラーニング**アプリケーションを構築するために設計されたアクセラレーションライブラリ。 |
| Hue(Hadoop User Experience) | クラスターで異実行されるアプリケーションのフロントエンドとして動作し、複数の異なるHadoopエコシステムプロジェクトを**Webベースの1つのGUI**にまとめる。 |
| Spark | **機械学習、ストリーム処理、グラフ分析**に役立つ**ビッグデータの分散処理**システム。データをインメモリにアクティブにキャッシュするため、特定のアルゴリズムやインタラクティブクエリの場合にパフォーマンスが向上する。<br>Scala、Java、およびPythonをネイティブでサポートしている。<br>またSQL(Spark SQL)、機械学習(MLlib)、ストリーム処理(Spark Streaming)、グラフ処理(GraphX)用のライブラリが含まれている。 |
| Livy | Sparkを実行するEMRクラスターを、**REST**インターフェイスによって操作できるようにする。 |
| Flink | 高スループットのデータソースでリアルタイムのストリーム処理ができる**ストリーミングデータフローエンジン**。 |
| Pig | Pigは複雑な結合や**クエリを簡単に実行**できるようにする。SQLに近い「Pig Latin」という言語でクエリを行う。 |
| Zookeeper | **分散システムを調整**するサービス。設定情報を集中管理する。 |
| Sqoop | **RDBとの間のデータのエクスポートとインポート**に使用する。 |
| Phoenix | OLTPと業務分析に使用され、Apache HBaseバッキングストアと連携して標準SQLクエリおよびJDBC APIが使用できるようにする。 |
| HCatalog | Pig、Spark SQL、MapReduceアプリケーション内の**HiveメタストアテーブルにRESTまたはCLIでアクセス**できるようにするツール。 |

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-hadoop.html

#### Hiveメタストア
Hiveのメタストア情報はデフォルトではマスターノードのMySQL(エフェメラルストレージ)になる。
そのため、永続化が必要な場合は外部メタストアを設定する。
外部メタストアに選択できるのは以下の2つ

 - AWS Glue Data Catalog
 - Amazon RDS または Amazon Aurora

![スクリーンショット 2022-11-30 1.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/06987abe-fb7e-dc91-d112-be6979c7ffb4.png)

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-metastore-external-hive.html

#### ファイルシステム
要件に応じてファイルシステムを選択する。

| ファイルシステム | 概要 |
|:-|:-|
| HDFS | Hadoop用ファイルシステム、**処理が高速**、ストレージは**エフェメラル(揮発性)** |
| EMRFS | S3にファイルを読み書きする、**データを永続化**できるがHDFSより遅い。 |
| ローカルファイルシステム | インスタンスストアにデータを保存する。 |
| S3BFS(ブロックファイルシステム) | 現在は非推奨のレガシーな設定 |

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-plan-file-systems.html

#### S3DistCp

S3からEMRクラスターへのデータコピーにはEMRクラスターにデフォルトでインストールされているS3DistCpを利用する。
マネコンやCLIでEMRクラスターにS3DistCpステップを追加することで実行できる。

```bash:CLIコマンド例
aws emr add-steps --cluster-id j-3GYXXXXXX9IOK --steps file://./myStep.json
```

```json:myStep.json
[
    {
        "Name":"S3DistCp step",
        "Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com","--src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","--dest=hdfs:///output","--srcPattern=.*[a-zA-Z,]+"],
        "ActionOnFailure":"CONTINUE",
        "Type":"CUSTOM_JAR",
        "Jar":"command-runner.jar"
    }
]
```

https://aws.amazon.com/jp/premiumsupport/knowledge-center/copy-s3-hdfs-emr/

#### 時間制限があるワークロードでのスポットインスタンス活用
EC2インスタンスフリートに「**プロビジョニングタイムアウト**」を定義することで、クラスターがターゲットキャパシティを満たすのに十分なスポットインスタンスがない場合、オンデマンドに切り替わることでSLAを守る。
スポットインスタンスが足りている場合は、スポットインスタンスでコストを削減できる。

![スクリーンショット 2022-11-30 1.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/91da0121-ce78-0413-33d0-fe77063d4640.png)

スポットインスタンスが不足した場合、オンデマンドに切り替える or 起動を諦める なども設定できる。

![スクリーンショット 2022-11-30 1.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/29e565df-4520-5a8a-c35c-06f2b7844cac.png)

#### Apache Livy
EMRクラスターにApache Livyをインストールすると、**RESTインターフェイス**でEMRクラスターのSparkジョブを実行できる。

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-livy.html

Livyへは以下のURIでリクエストする。

```
http://:8998/master-public-dns-name
```

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-web-interfaces.html

#### その他メモ

- 暗号化オーバーライド機能を使うと保存先のS3ごとに異なる暗号化方法を利用できる  
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-data-encryption-options.html
- クラスターを利用時以外停止することでコスト削減でしたい場合、CloudWatchのIsIdleメトリクスで終了を検知する
- EMRFSではSSE-Cは使用できない
- EMRの同時実行数は2~256
- YARN（Yet Another Resource Negotiator）: リソースの管理とスケジュールを担い、各データノードで何が起こるべきかを決定する。

### Amazon Redshift

DWH(データウェアハウス)に最適化されたフルマネージドなPostgreSQLベースの列指向DB。
リーダーノード、コンピュートノード、ストレージの3層に分かれており、必要に応じてコンピュートノードとストレージをスケーリングする。

![redshift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/67aa1f8d-bf5f-3e1e-2d71-7a6281dcdd30.png)


![スクリーンショット 2022-11-30 0.29.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/ba2fa985-5af5-65a9-863e-0031fd38e7ed.png)

![スクリーンショット 2022-11-30 0.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/022f3e19-03af-9960-2e06-287cc1afcadc.png)

https://www.youtube.com/watch?v=Myzy68VEXjM

#### ノードタイプ

| 世代 | タイプ | 特徴 |
|:-:|:-:|-|
| 第２世代 | DC2 | ・各コンピューティングノードが個別のSSDストレージを持つ<br>・**速度が速い**(C=computeで覚える) |
| 第２世代 | DS2 | ・各コンピューティングノードが個別のHDDストレージを持つ<br>・**大容量**(S=storageで覚える) |
| 第3世代 | RA3 | ・データ処理とストレージを独立させる方式<br>・各ノードは個別のストレージを持たない代わりに、**RMS（Redshift Managed Storage）と呼ばれるSSD**を共有利用する<br>・SSDに入り切らないデータはS3に自動でオフロードされる<br>・RA3でしか使えない機能もあり、**今後構築する場合はRA3推奨** |

RA3のスペックと料金

| サイズ | vCPU | メモリー | ストレージ上限 | I/O | 価格(東京リージョン) |
|-|-|-|-|-|-|
| ra3.xlplus | 4 | 32 GiB | 32TB RMS | 0.65GB/秒 | 1.278USD/h |
| ra3.4xlarge | 12 | 96 GiB | 64TB RMS | 2GB/秒 | 3.836USD/h |
| ra3.16xlarge | 48 | 384 GiB | 64TB RMS | 8GB/秒 | 15.347USD/h |

https://aws.amazon.com/jp/redshift/pricing/#Amazon_Redshift_node_types

#### データロード

`COPY`コマンドを利用しS3、DynamoDB、EMR、SSH接続可能なサーバからデータをロードできる。
この際、利用するIAMロールや区切り文字、フォーマットなどを指定する。
PurquetやORCなどのフォーマットも指定することができる。

```sql:S3からのデータロード例
COPY table_name
FROM 's3://mybucket/data/parquet/'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER ','
FORMAT AS PARQUET
REGION 'ap-northeast-1';
```

![スクリーンショット 2022-11-30 0.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/72dbeae5-95d0-1a72-8e87-1d4a98650794.png)

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/tutorial-loading-data.html

`INSERT`コマンドでデータを投入することもできる。
大量データの場合`COPY`より時間がかかる。
テーブル未作成で既存テーブルからコピーしたい場合、`CREATE TABLE AS`でも可能。

```sql:他のテーブルからのINSERT例
INSERT INTO dst_table_name
(SELECT * FROM src_table_name);
```

```sql:値を指定したINSERT例
INSERT INTO category_stage VALUES
(13, 'Concerts', 'Other', default);
```

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_INSERT_30.html

#### アプリケーションからのクエリ

Redshiftへのクエリは**Data API**を利用する。
永続的な接続は行わず、SDKを介してHTTPエンドポイントへ非同期のリクエストを行う。
認証にはSecrets Managerに保存された認証情報または一時的なDB認証情報を利用する。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/data-api.html

#### DR対策
RedshiftのDR対策として自動スナップショットを有効にし、異なる1つのリージョンへ自動的にコピーさせることができる。

#### 分散スタイル
テーブル作成時に4つの分散スタイルのいずれかを指定する。指定しない場合はAUTO分散になる。

| スタイル | 特徴 |
|:-|:-|
| AUTO分散 | テーブルデータのサイズに基づいて最適な分散スタイルを割り当てる。 |
| EVEN分散 | テーブルが結合に参加しない場合に適している。 |
| キー分散 | テーブル間で結合を行う場合に適している。 |
| ALL分散 | マスターなどの更新の少ない大きなテーブルに適している。 |

![スクリーンショット 2022-11-30 0.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/9428f715-2be3-f866-570c-3f8cfbe804cf.png)

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_choosing_dist_sort.html

#### 列圧縮

データ保存時に圧縮することでディスクI/Oが減少し、クエリパフォーマンスが向上する。
デフォルトでは`ENCODE AUTO`となっており、圧縮エンコードは自動的に管理される。

テーブル作成時に列に対し圧縮タイプまたはエンコードを指定できる。

```sql
CREATE TABLE product(
  product_id INT ENCODE RAW,
  product_name CHAR(20) ENCODE BYTEDICT
);
```

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Compressing_data_on_disk.html

`COPY`コマンドで`COMPUPDATE`に`ON`を指定すると自動圧縮を有効にできる、データが含まれているテーブルに自動圧縮は適用できない。

```sql
COPY biglist FROM 's3://mybucket/biglist.txt' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|' COMPUPDATE ON;
```

#### 自動スナップショット
Redshiftで自動スナップショットを設定するとデフォルトでは8時間ごとにスナップショットが作成される。
スケジュールをcron式で設定する事もできる。

```bash
cron(分 時間 曜日)
```

で指定する。

```bash:例
# 平日の16:00から22:00まで1時間おき
cron(0 16-22/1 MON-FRI)

# 毎日12:30から4時間おき
cron(30 12/4 *)

# 毎週土曜日の21:00
cron(0 21 土)
```

CLIによるスケジュールの定義は`create-snapshot-schedule`コマンドを実行する。

```bash:コマンド例
create-snapshot-schedule --schedule-identifier "my-test" --schedule-definition "cron(0 17 SAT,SUN)" "cron(0 9,17 MON-FRI)"
```

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/working-with-snapshots.html#working-with-snapshot-scheduling

#### バキューム処理

`VACUUM`コマンドを実行すると、行を再ソートしてスペースを再利用できる。これによりパフォーマンスが改善される可能性がある。
`VACUUM`実行中はCPUとディスクに負荷がかかるため、夜間などの使用率の低い時間帯に実行する。
また、`ANALYZE`を実行することで、クエリの実行計画のためのメタデータが更新される。そのため1日1回程度`VACUUM`後に`ANALYZE`をセットで実行することが推奨される。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_VACUUM_command.html

#### Amazon Redshift Spectrum
Redshift Spectrumを使用すると、Redshiftテーブルにデータをロードすることなく、S3のファイルから直接データを取得できる。Redshift Spectrumクエリでは超並列処理を採用しており、大きなデータセットに対する処理が非常に高速で実行される。

![スクリーンショット 2022-11-30 0.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/11f0229a-bfc9-41de-98e2-f1dadd1637d0.png)

Redshift Spectrumを利用するには

1. IAMロールとクラスターの関連付け
1. 外部スキーマの作成
1. 外部テーブルの作成

が必要となる。
外部スキーマと外部テーブルは`CREATE`クエリで作成する。

```sql:外部スキーマの作成例
CREATE EXTERNAL SCHEMA myspectrum_schema 
FROM DATA CATALOG
DATABASE 'myspectrum_db'
IAM_ROLE 'arn:aws:iam::123456789012:role/myspectrum_role'
CREATE EXTERNAL DATABASE IF NOT EXISTS;
```

```sql:外部テーブルの作成例
CREATE EXTERNAL TABLE myspectrum_schema.sales(
  salesid INTEGER,
  listid INTEGER,
  sellerid INTEGER,
  buyerid INTEGER,
  eventid INTEGER,
  dateid SMALLINT,
  qtysold SMALLINT,
  pricepaid DECIMAL(8,2),
  commission DECIMAL(8,2),
  saletime TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://redshift-downloads/tickit/spectrum/sales/'
TABLE PROPERTIES ('numRows'='172000');
```

#### ワークロード管理(WLM:Work Load Management)
複数のワークロードが1つのクラスターを利用する際競合しないよう、自動でコントロールする機能がある。

![スクリーンショット 2022-11-30 0.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/17070c37-d945-565d-5cab-5520e39c4a29.png)

![スクリーンショット 2022-11-30 0.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/f199c498-7fed-61dc-ad99-df677c48d0b3.png)

#### ショートクエリアクセラレーション(SQA)
SQAを有効にすると機械学習アルゴリズムを使用してクエリの実行時間を予測し、実行時間が短い一部のクエリを実行時間が長いクエリより優先する。
デフォルトのパラメータグループおよび新しいパラメータグループではデフォルトで有効になっている。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/wlm-short-query-acceleration.html

![スクリーンショット 2022-11-30 0.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/6cdc3d16-9c6b-87af-679e-ebe179719b4b.png)

#### その他メモ

- 最大同時実行レベルは50
- キューは最大8

### AWS Glue

ETLやデータからスキーマの自動生成、データのクリーニングなど、分析、機械学習、アプリケーション開発のためのデータ検出、準備、結合ができるサーバレスなデータ統合サービス。
GlueジョブやGlue DataBrew、Glueデータカタログなど複数の機能を含んでいる。

https://dev.classmethod.jp/articles/re-introduction-2022-aws-glue/

https://youtu.be/px96mjFoZwM

#### ETLジョブの種類

| 種類 | 概要 |
|:-|:-|
| Apache Spark | 最低2DPU必要、最小請求単位1分 |
| Sparkストリーミング | 1または0.0625DPUを使用、 最小請求単位1分|
| Pythonシェル | 小規模から中規模の一般的なタスクに最適、Sparkより安価、最低2DPU必要、最小請求単位10分 |

#### ワーカータイプ

| タイプ | 概要 |
|:-|:-|
| Standard | このタイプを選択する場合は最大キャパシティー(実行時に割り当てることができるDPUの数)を指定する。50GBのディスクと2個のエグゼキュターがある。 |
| G.1X | このタイプを選択する場合はワーカー数を指定する。各ワーカーには1DPUが割り当てられ、ワーカーごとに1個のエグゼキューターがある。**メモリを大量に消費するジョブに推奨**。AWS Glue2.0以降のデフォルト。 |
| G.2X | このタイプを選択する場合はワーカー数を指定する。各ワーカーには2DPUが割り当てられ、ワーカーごとに1個のエグゼキューターがある。**機械学習変換を実行するジョブに推奨**。 |
| G.025X | このタイプを選択する場合はワーカー数を指定する。各ワーカーには0.25DPUが割り当てられ、ワーカーごとに1個のエグゼキューターがある。**少量のストリーミングジョブに推奨**。AWS Glue3.0のストリーミングジョブでのみ使用可能。 |

※1DPU = 4vCPU, 16GBのメモリ, 64GBのディスク

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/add-job.html

#### AWS Glue DataBrew
データのクレンジングや正規化など、分析用データの準備を自動化したり素早く行うためのサービス。
マネジメントコンソール上でインタラクティブにデータの変換を行ったり、作成した変換ジョブをStep FunctionsのStepに組み込むなどができる。

![スクリーンショット 2022-12-03 1.17.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/a78c77f2-9055-ed5d-648f-c260f05ecd7f.png)

![スクリーンショット 2022-12-03 1.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/a07d763b-b01a-3ed6-a501-9ac00b4a8ada.png)

https://youtu.be/jglmTz1yISc

#### Glue ML Transforms(機械学習変換)
機械学習タスクを実行し、潜在的重複(インクリメンタルマッチ)の検出などデータをクリーニングするために利用できる。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/machine-learning-transform-tutorial.html

#### その他メモ
- AWS Glue Schema Registryは、データストリームスキーマを一元的に検出、制御し、発展させることができる。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/schema-registry.html
- ワークフローを利用すると依存関係のある複数のジョブを管理できる
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/orchestrate-using-workflows.html

### Amazon Kinesis
モバイルアプリやIoT機器などからのストリーミングデータを扱うためのサービス群

![スクリーンショット 2022-11-30 2.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/fad875a6-c4cf-4fd6-1a2e-90d421d5afbe.png)

■Kinesisプラットフォームの構成イメージ
![kinesis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/58c3f94d-c8b8-3038-93cf-596644f38d20.png)

https://pages.awscloud.com/rs/112-TZM-766/images/20180110_AWS-BlackBelt-Kinesis.pdf

#### Amazon Kinesis Data Streams
シンプルなストリームを扱うサービス、ストリームに出し入れする(プロデューサー&コンシューマー)その他サービスと組み合わせて利用する。

![スクリーンショット 2022-11-30 2.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/e982dac8-890a-05b0-37c1-10f5c18dd0c6.png)

![スクリーンショット 2022-11-30 2.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/ed01ef47-77ed-eae5-df69-1dba902f7a46.png)

##### ストリームのタグ付け
Kinesis Data Streamには「タグ」として独自のメタデータを付与することができる。
タグはキーと値のペアの形でストリームに定義する。

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/tagging.html

#### 拡張ファンアウト
Kinesis Data Streamsでは拡張ファンアウトと呼ばれる機能がある。これを使用することでコンシューマーは、シャードごとに毎秒最大2MBのレコードを受信できる。これによりスケーラビリティとパフォーマンスを上げられる。

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/enhanced-consumers.html

##### KPL/KCL

- Kinesis Producer Library(KPL): Kinesisストリームへデータを出力するアプリケーションの開発用ライブラリ
- Kinesis Client Library(KCL): Kinesisストリームからデータを取得し処理するアプリケーションの開発用ライブラリ

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/developing-producers-with-kpl.html

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/shared-throughput-kcl-consumers.html

通常のKPL/KCLはJava用のライブラリだが、Lambda+Python用の「Kinesis Producer LibraryAWS Lambda」もある

https://docs.aws.amazon.com/ja_jp/kinesisanalytics/latest/dev/lambda-preprocessing.html

##### KPLの設定
KPL利用時に設定できる値がいくつかある。
この値を変更することで動作を調整できる。
例えば、`RecordMaxBufferedTime`を高い値にするとパッケージ合計サイズが大きくなり、スループットが向上する。設定値を変更する場合KPLアプリケーションの再起動が必要。

```java:コード例 インスタンス生成時に指定(Java)
KinesisProducerConfiguration config = new KinesisProducerConfiguration()
        .setRecordMaxBufferedTime(3000)
        .setMaxConnections(1)
        .setRequestTimeout(60000)
        .setRegion("us-west-1");
        
final KinesisProducer kinesisProducer = new KinesisProducer(config);
```

```java:コード例 設定ファイル利用時(Java)
KinesisProducerConfiguration config = KinesisProducerConfiguration.fromPropertiesFile("default_config.properties");
```

```ini:default_config.properties
RecordMaxBufferedTime = 100
MaxConnections = 4
RequestTimeout = 6000
Region = us-west-1
```

KPL(Kinesis Puroducer Library)PutRecords操作は書き込み失敗したレコードを自動的にKPLバッファーに追加し、再試行できるようにする

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-kpl-config.html

##### KCLのリーステーブル
KCLはKinesis Data Streamsアプリケーションごとに一意のDynamoDBテーブルを作成する。
これを利用してKCLコンシューマアプリケーションで処理されたシャードを追跡する。
読み取りの途中で失敗した場合は、新しいワーカーが失敗したレコードから再開できる。

![スクリーンショット 2022-11-30 2.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/46b20f0a-0792-f049-4ab5-6c8f73e1959a.png)

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/shared-throughput-kcl-consumers.html#shared-throughput-kcl-consumers-leasetable

##### 順序保証
`PutRecords`で複数のレコードを送信した場合、1つのレコードが失敗しても後続の処理は停止しない、そのため順序が保証されない。ストリームの書き込みと読み込みの順序を保証する場合`PutRecord`を使用する。

https://docs.aws.amazon.com/ja_jp/kinesis/latest/APIReference/API_PutRecords.html

##### IoT機器からのストリーム
IoT機器からKinesisストリームへの出力はAWS IoT(サービス)を利用する。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/what-is-aws-iot.html

![スクリーンショット 2022-11-19 18.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/16840c11-6a5e-29e3-af69-c7160d5b5bbb.png)

![スクリーンショット 2022-11-19 18.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/676f7900-0255-76a3-39dc-b64c1d68df5d.png)

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-12_AWS_Summit_Online_2020_IoT01.pdf

#### Amazon Kinesis Data Firehose
Kinesisストリームは

- S3
- Redshift(S3経由)
- Amazon ES
- HTTPエンドポイント
- その他サードパーティのSaaS

などに直接出力することはできない、ストリームを受け取って変換するためにKinesis Data Firehoseを間に挟む必要がある。

![スクリーンショット 2022-11-30 2.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/d234f6ca-a941-5bab-003e-77071e45f603.png)

![スクリーンショット 2022-11-30 2.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/22aa3b23-9258-ae9f-6d27-542e66d81c88.png)

https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/what-is-this-service.html

Kinesis Data FirehoseではLambda関数によるデータの変換を設定することができる。
LambdaはKinesis Data Firehoseに変換されたデータを返し、返されたデータをKinesis Data Firehoseが出力先に出力する。この際変換前のデータも出力するよう設定することもできる。

Kinesis Data Firehoseは複数のAZに冗長化されている。

#### Amazon Kinesis Data Analytics
ストリームに対して実行するSQLを定義し、SQLにより分析や変換されたストリームを出力する。
リアルタイム分析用サービス。
入力元と出力元はいずれもKinesis Data Streams or Kinesis Data Firehose。ストリームとストリームの間に挟む。

![スクリーンショット 2022-11-30 2.31.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/6aad6d74-97ab-e0ee-9dd2-02ecbefc09c6.png)

![スクリーンショット 2022-11-30 3.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/7d10c92c-1d36-2104-19e0-9fd15198f35f.png)

##### Lambdaによる前処理
Kinesis Data AnalyticsではSQL実行の前にLambdaによる変換やデータ補完などが設定できる。

![スクリーンショット 2022-11-30 3.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/032f9308-9351-d125-fd70-ef1a1077126e.png)

##### ウィンドウクエリ
Kinesis Data Analyticsでは常に流れてくるストリームに対して、時間と行の条件によって取得する範囲を指定する、これを「ウィンドウクエリ」や「ウィンドウSQL」という。
AWSでは3つのウィンドウタイプがサポートされている。

| ウィンドウタイプ | 概要 |
|:-|:-|
| Stagger(ずらし)ウィンドウ | 一貫性のない時間に届くデータに対して、時間ベースの集計をする |
| タンブリング(重複しない)ウィンドウ | 範囲が重複しない固定の周期で集計する |
| スライディングウィンドウ | 固定サイズのウィンドウを時間とともにスライドする |

![スクリーンショット 2022-11-30 3.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/da6077b4-d542-6397-f2a1-f2546fa0c484.png)

https://dev.classmethod.jp/articles/kinesis-data-analytics-timestamp-and-window-query-pattern/

https://docs.aws.amazon.com/ja_jp/kinesisanalytics/latest/dev/windowed-sql.html

##### スキーマエディタ
Amazon Kinesis Data Analytics アプリケーションの入力ストリームのスキーマはコンソールから定義できる。指定できる形式は以下の3種類。

- JSON入力ストリームのJSONPath式
- カンマ区切り値 (CSV) 形式の入力ストリームの列番号
- アプリケーション内データストリームの列名とSQLデータ型

https://docs.aws.amazon.com/ja_jp/kinesisanalytics/latest/dev/console-summary-edit-schema.html

### IoT Core
IoTデバイスとAWSサービスを統合するためのフルマネージドサービス

#### AWS IoTルール
IoTデバイスから受け取ったデータに対し、以下のAWSサービスへデータのPUTや実行を行える。

- DynamoDB
- S3
- SNS
- SQS
- Lambda
- Kinesis Data Stream
- Kinesis Data Firehose
- OpenSearch Service
- CloudWatchメトリクス
- CloudWatchアラーム
- Step Functions
- Timestream
- AWS IoT Analytics
- AWS IoT Events
- AWS IoT SiteWise

その他にもAWS IoTによるフィルタリングやHTTPエンドポイントへのリクエストなどもできる。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rule-actions.html

### Amazon CloudSearch
フルマネージドの検索エンジンサービス、CSV/JSON/XMLなどのデータの集まりをアップロードし、HTTP/HTTPSのエンドポイントにリクエストすることで検索を実行できる。
データ量やリクエストトラフィックに合わせて自動的にスケーリングする。

#### 要素

CloudSearchに登場する要素たち

| 要素 | 概要 |
|:-|:-|
| 検索ドメイン| データを管理/保管する場所(RDBでいうところのDBサーバ)　|
| コーパス | 検索対象のデータのコレクション(集まり) |
| インデックス | ひとかたまりのデータスキーマ(RDBでいうところのテーブル)ドキュメントから自動生成できる　|
| ドキュメント | ページや投稿などの1項目(RDBでいうところのレコード) |
| ファセット | 絞り込みとフィルタ処理のためのカテゴリを表すインデックスフィールド |

#### 分析スキーム

分析スキームを個別に設定し、下記の検索オプションを追加することができる。

| オプション | 概要 |
|:-|:-|
| アルゴリズムによるステミング | アルゴリズムによるステミング実行レベルを指定<br>※ステミング=異なる語形でも意味が同じワードを語幹でマッチングさせる(swims, swimmingどちらで検索しても双方にヒットさせるなど) |
| ステミングディクショナリ | アルゴリズムによるステミングの結果を辞書でオーバーライドする |
| ストップワード | インデックス作成時及び検索中に無視する単語　|
| シノニム | 異なるワードで同じ意味の単語を指定して同じ検索結果を得られるようにする |

### AWS Lake Formation

S3やRDB,NoSQLからS3へデータを読み込み、データレイクを構築/管理できるサービス。
アクセス管理された中央データストアを作成できる。
Lake FormationはGlueの機能を多数利用しており、Glueの拡張機能とも言える。

https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/how-it-works.html

https://www.youtube.com/watch?v=riS_STGzZHI

#### 用語
Lake Formationの用語

| 用語 | 概要 |
|:-|:-|
| データレイク | Lake Formationによって管理される永続データ　|
| データアクセス | IAMポリシーによりアクセスは制御される |
| ブループリント | データレイクにデータを簡単に取り込めるようにするデータ管理テンプレート |
| ワークフロー | 一連の関連するAWS Glueのジョブ、クローラ、およびトリガーのためのコンテナ |
| Data Catalog | 永続的なメタデータストア |
| 基盤となるデータ(Underlying Data) | Data Catalog テーブルがポイントするソースデータまたはデータレイク内のデータ |
| プリンシパル | IAMユーザーもしくはロール、またはADユーザー |
| データレイク管理者 | あらゆるData Catalogリソースまたはデータロケーションに対する許可を任意のプリンシパル(自分自身を含む)に付与できるプリンシパル |

#### ブループリント

ワークフローはGlueまたはブループリントから作成できる
ブループリントのタイプは以下

| タイプ | 概要 |
|:-|:-|
| Database snapshot(データベーススナップショット) | すべてのテーブルからのデータを、JDBC ソースからデータレイクにロードまたは再ロードします。除外パターンに基づいて、一部のデータをソースから除外することもできる |
| Incremental database(増分データベース) | 以前に設定されたブックマークに基づいて、新しいデータだけを JDBC ソースからデータレイクにロードする |
| Log file(ログファイル) | AWS CloudTrail、Elastic Load Balancing ログ、Application Load Balancer ログなどのログファイルソースからのデータを一括でロードする |

### Amazon Forecast

統計アルゴリズムと機械学習アルゴリズムを使用して、非常に正確な時系列予測を実現するフルマネージドサービス。

https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/what-is-forecast.html

### Amazon Athena

S3のJSON, CSV, Parquetなどのファイルに対し、SQLを実行することができる。
また、データソースコネクタを作成しフェデレーテッドクエリを利用するとCloudWatch LogsやDynamoDB、RDS、DocumentDB、OpenSearchなどに直接クエリすることもできる。複数のデータソースのデータを結合することもできる。

#### ワークグループ

ワークグループは、ユーザー、チーム、アプリケーション、またはワークロードを分離するための機能。
ワークグループごとにクエリ結果の出力先、暗号化設定、コスト、データ量の上限などを個別に設定できる。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/manage-queries-control-costs-with-workgroups.html

#### その他メモ
- Parquetは列ごとの圧縮が可能なため、S3から読み取られるバイト数を減らしクエリのパフォーマンス改善が期待できる。データの分割もできる。
- Glacierにはクエリできない。
- S3のSSEが有効な場合、異なるリージョンのAthenaからクエリはできない(複合権限がないため)
- バケットのバージョニングが有効な場合、最新バージョンにしかクエリできない。
- 列形式でビューを作成した場合、出力フォーマットはParquetまたはORCとなる。

### Amazon QuickSight

フルマネージドのBI(ビジネスインテリジェンス)サービス。
AWS内外の複数のデータソースの情報を単一のダッシュボードとして視覚化(グラフや表に)することができる。

![スクリーンショット 2022-11-30 1.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/273fb2db-9b18-fe9c-9424-52a23036f9ae.png)

![スクリーンショット 2022-11-30 1.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/4dc4924a-8950-3f01-ee6b-dc158da1e017.png)

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html

https://www.youtube.com/watch?v=jjxr2j990rc

#### データソース
QuickSightで指定できる主なデータソースは以下

- Amazon RDS
- Amazon Athena
- Amazon OpenSearch Service
- Amazon Redshift
- Amazon S3
- AWS IoT Analytics
- Timestream

**DynamoDB**をデータソースにはできない

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-data-sources.html

#### SPICE
データソースから読み込みの多いデータを取り込んでおくことで応答速度を上げるためのインメモリDB

![スクリーンショット 2022-11-30 1.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/e9cc7a08-a781-706c-f2c0-2ea089a15458.png)

#### ファイルデータのインポート
S3またはオンプレのファイルをデータソースとしてインポートできる。
このとき、JSONやCSV/TSVだけでなく、Excelファイル(.xlsx)やzip/gzip圧縮されたファイルもそのまま読み込める。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-data-sources.html#file-data-sources

#### ML(機械学習)インサイト
QuickSightには機械学習を使用して、データ内の隠されたインサイトや傾向をダッシュボードに反映する機能がある。
機械学習インサイトは以下の3つの主要機能を持つ。

- MLを使用した**異常検出**: データを継続的に分析し異常 (外れ値) を検出
- MLを使用した**予測**: 内蔵の機械学習Random Cut Forestアルゴリズムにより、外れ値を除く季節性や傾向の検出、欠損値の入力など、複雑な現実のシナリオを自動的に処理し変化を予測する。
- **自動ナラティブ(説明文)**: ダッシュボードに自動的に生成した説明文を追加してくれる。

![スクリーンショット 2022-11-30 1.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/e0ac284f-1210-b340-0033-94634fe0ba7d.png)

![スクリーンショット 2022-11-30 1.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/e0840864-2a90-1469-4fec-313d4feb7b8b.png)

![スクリーンショット 2022-11-30 1.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/b587ba06-0a1c-21ee-2d89-4ef873313518.png)

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/making-data-driven-decisions-with-ml-in-quicksight.html

#### ビジュアルタイプ
ビジュアルにはさまざまなタイプのグラフなどを表示できる。

![スクリーンショット 2022-11-30 1.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/3ae8ddf7-0b33-b4fe-ad3b-c9d56479c513.png)

#### Presto
オープンソースの分散型SQLクエリエンジン、高速な分析クエリを実行でき、RDB/NoSQLともにサポートしている。
EMR, S3, RDS, Redshiftなどにクエリできる。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/create-a-data-source-presto.html

EMRとPrestoを利用することでビッグデータの視覚化ができる。

https://aws.amazon.com/jp/blogs/big-data/visualize-big-data-with-amazon-quicksight-presto-and-apache-spark-on-amazon-emr/

### AWS DataSync

以下の3つのデータ転送を行うことができる

- オンプレとAWS間
- AWSストレージサービス間
- クラウドストレージとAWS間

オンプレからの移行先に指定できる主なサービスは以下の3つ

- S3
- EFS
- Amazon FSx

その他サポートされる送信元と宛先の一覧は以下のページ参照

https://docs.aws.amazon.com/datasync/latest/userguide/working-with-locations.html

#### AppFlow
サードパーティのSaaSアプリケーションとAWSサービスの間でデータを転送する。

- Salesforce
- Slack
- Datadog
- Google Analytics

などのSaaSと
 
- S3
- Redshift

などのAWSサービスが対象。

<img alt="AppFlow" src="https://d1.awsstatic.com/product-marketing/sandstone/product-page-diagram_Amazon-AppFlow%402x.8d2898573c44a4e4e602b28772caad7a6b13e8c9.png" />

https://docs.aws.amazon.com/ja_jp/appflow/latest/userguide/what-is-appflow.html

#### その他メモ
- 複数バケットへの転送も可能
- データ移行時にS3 Transfer Accelerationはサポートしていない

### Amazon Opensearch Service(Elasticsearch Service)
OpenSearch(旧Elasticsearch)はログやクリックストリームなどの分析などに利用できる**OSSの分散型全文検索エンジン**。
Amazon Opensearch ServiceはAWSによりマネージドでOpenSearch環境を構築管理できるようにしたもの。
Amazon OpenSearchでドメインを作成すると、OpenSearchと連携できるBIツールのKibanaも自動的に立ち上がる。

![スクリーンショット 2022-11-30 0.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/c799cf8d-e8a9-dd7b-8fa6-928f8e7802f1.png)

Opensearchでは分散型の設計思想として3つのマスターノードを用意することが推奨される。

![スクリーンショット 2022-11-30 0.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/89557d07-f4b9-17de-d640-b233ba4360dc.png)

https://www.youtube.com/watch?v=2Ecgr63fLSM

#### シャード数の最適化

`シャード数 = インデックスサイズ / 30GB` で計算する
例えばインデックスが5GBの場合1以下なので切り上げ1、70GBの場合切り上げ3

https://aws.amazon.com/jp/blogs/database/get-started-with-amazon-elasticsearch-service-how-many-shards-do-i-need/

#### クラスター間検索
クラスター間検索を利用すると複数のドメインにまたがってクエリと集計を実行できる。
検索を実行するソースドメインからターゲットドメインへの接続を設定する。
双方向に検索したい場合は2つの接続を設定する必要がある。

<img src="https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/images/ccs.png">

![スクリーンショット 2022-11-30 0.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/05ab7359-563b-83f0-bfed-d0fdc55d7889.png)

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/cross-cluster-search.html

#### UltraWarmノード
ドメイン作成時にUltraWarmを有効にすると大量の読み取り専用データをコストパフォーマンスに優れた方法で保存できる。
UltraWarmノードではS3をストレージとして利用する。

![スクリーンショット 2022-11-30 0.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/e5d1220f-7c87-9db2-3d5a-5851bf28141b.png)

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/ultrawarm.html

### Amazon MSK

Amazon Managed Streaming for Apache Kafka (Amazon MSK) は、Apache Kafkaを使ってストリーミングデータを処理するアプリケーションの構築および実行を可能にする、フルマネージドサービス。

### AWS IoT Analytics
IoTデータの分析をかんたんに実行するためのフルマネージドサービス
データストアにはJSONとParquet形式のファイルを保存可能

### DWH基礎

- ファクトテーブル: DWHに1つ以上存在し集計したい値を持つ、複数のディメンションテーブルと１対多の関係になる
- ディメンションテーブル: ファクトテーブルに対し一対他の関係で結びつき、分析の観点を与えるテーブル

https://dev.classmethod.jp/articles/dwh-entrance/

### AWS Elemental MediaStore
ライブ配信に必要な高パフォーマンスと即時の整合性を実現する、動画配信およびストレージサービス

https://docs.aws.amazon.com/ja_jp/mediastore/latest/ug/what-is.html

### その他

- DAXは変更前後両方の項目を出力する
- 各サービスのデータ整合性
  - Apache Kafka/Amazon MSK: 順序保証あり/少なくとも1回
  - SQS(FIFO): 順序保証あり/正確に1回
  - SQS(スタンダード): 順序保証なし/少なくとも1回
  - Kinesis Data Streams: 順序保証あり/少なくとも1回
  - Kinesis Data Firehose: 順序保証なし/少なくとも1回
  - DynamoDBストリーム: 順序保証あり/正確に1回
- Athenaはクエリのたびに料金が発生するため、アクセス頻度の高いレポートはAthenaよりRedshiftのほうが費用対効果が高い