AWS Data Engineer Associate 学習メモ

:::note warn
※学習用のメモのため、内容が正しくない可能性があります。
:::


## RedShift
- Spectrum
データをRedShuiftにはロードせず、S3データを直接並列クエリ可能
- フェデレーテッドクエリ
RDSのPostgre、MySQLに対して直接クエリ可能
- COPY コマンド、並列ロード　、スライス数
イベントドリブン（S3アップロードをトリガーにしてCOPYジョブの実行も可能
- Redshiftデータ共有機能
クロスアカウント、クロスリージョンでのデータ共有も可能
- Streaming Ingestion
Kinesisデータストリーム、MSK（Kafka）からのストリーミング取り込みをサポート
- Lake Formationとの連携で、きめ細かい権限管理が可能
- Apache Sparkからの高速アクセス
- Amazon Redshift Data API
HTTPSエンドポイントを通じてRedshiftクラスターに直接アクセスすることができ、SQLクエリを実行できる

- 結果セットのキャッシュ
リーダーノードでクエリ受付、キャッシュ確認してあったらコンピュートノードにはいかない
- マテリアライズドビュー
頻繁に実行するクエリパターンを高速化
- ショートクエリアクセラレーション
ショートクエリは専用の高速キューにルーティングされ、ショートクエリの実行がヘビークエリによって邪魔されないようになる

<details><summary>Redshift 並行処理とスライス</summary>
S3 データレイクに新しいデータが到着するたびに Athena テーブルを更新する場合は、どの AWS のサービスを使用できるでしょうか。選択肢の 1 つとして、AWS Glue と AWS Glue クローラーを使用できます。この例について、もう 1 つ質問をしましょう。複数のソースから大量のファイルを受信しているとします。1 日の終わりにすべてのファイルがマージされ、1 つの gzip ファイルに圧縮されます。このファイルは、S3 バケットにアップロードされます。次に、ファイルは Amazon Redshift クラスターにロードされます。

 

どのようにこの設定を変更すれば、Amazon Redshift クラスターに対するコピープロセスをより高速に実行できるでしょうか。基本に立ち返ってみましょう。Copy コマンドは Amazon Redshift の超並列処理アーキテクチャを活用し、Amazon S3 バケットにあるファイルを並列で読み込み、ロードすることを理解している必要があります。そうすれば、ファイル数が Amazon Redshift クラスターのスライス数の倍数になるように gzip ファイルを小さなファイルに分割できます。すると、Amazon Redshift がスライスに並行してデータをロードできるため、全体的なロード時間を改善できます。データを複数のファイルに分割し、テーブルで分散キーを設定することにより、並列処理を使用できます。


</details>

#### VACUUM
- REINDEX ソートキー最適化

### データロード速度改善
- ファイルを分割することで、並列処理を可能にする
- COPYコマンドによりS3からRedshiftへの高速なデータ転送を実現
- 単一のCOPYコマンドを使用すると、Redshiftは自動的にワークロードを分散し、クラスター内の全ノードとスライスを効率的に活用
- ALLディストリビューションスタイル
テーブルのデータを全ノードに複製、更新頻度の低い小規模テーブルに対してこれを実行することで小規模テーブルとの結合操作が高速化され、ネットワーク転送のオーバーヘッドが削減
- プライマリキーと外部キーを設定する
Redshiftのクエリオプティマイザーがより効率的な実行計画を生成できるようになります。これらのキーは、テーブル間の関係を明確にし、結合操作の最適化に役立ちます
- ソートキー
Where句で頻繁に使用されるカラムをソートキーにすることで、速度改善が見込める

### ログ
- STL_ALERT_EVENT_LOG
クエリオプティマイザがパフォーマンスの問題を検出した際に自動的に警告を記録する
クエリの実行中に発生した重要なパフォーマンスイベントや潜在的な問題を記録
- STL_QUERY_METRICS
個々のクエリの実行に関する詳細な統計情報
- STL_USAGE_CONTROL
クエリの実行時間やリソース消費量に基づいて設定された制限に関する情報を記録
- STL_PLAN_INFO
クエリの実行計画に関する情報


## その他データ連携、取り込み
- App Flow
SaaSサービスとのデータ連携
- AWS Transfer family
Transfer SFTP
- Data Sync
オンプレデータを連携
- Snow Family
大量データの取り込み



## Amazon Redshift Serverless
- クラスターの手動プロビジョニングや削除の必要性を排除し、運用の自動化を実現
- 需要に応じて自動的にスケーリングする
- 分析結果は自動的にAmazon S3に保存されるため、クラスターの削除後もデータにアクセスできる

## EMR
Amazon EMR はあらゆる機能を備えた分散型 Hadoop 環境です。その変換実行能力は AWS Glue の実行能力を上回ります。AWS Glue はフルマネージド ETL サービスですが、Amazon EMR はそうではありません。Amazon EMR の場合、Spark、Hive、Pig、Hbase、Presto など、追加のフレームワークとソフトウェアのインストールが必要です。AWS Glue はデータのクレンジング、エンリッチ化、移動のみが必要な場合に最適なソリューションです。

- インスタンスフリート
複数のインスタンスタイプとサブネットにわたってキャパシティを分散させることができ、単一のインスタンスタイプやアベイラビリティーゾーンに依存することによるリスクを軽減します
- スポットインスタンス
    - 大幅なコスト削減を可能にしますが、中断のリスクがあります
    - タスクノードは追加の計算能力を提供するために使用され、クラスターの中核的な機能には影響を与えません。タスクノードは、データの保存や管理には関与せず、主に計算処理を担当します
    - タスクノードが中断されても、マスターノードとコアノードが intact であれば、処理を中断されたポイントから再開することが可能

- オンデマンドインスタンスへの切り替えオプション
スポットインスタンスが利用できない場合でも、ジョブの継続性を確保し、SLAを遵守する

- Gravitonインスタンス
パフォーマンスを維持しつつコストを削減する

- Hive外部メタストアを使用することで、EMRクラスター間でテーブル定義やスキーマ情報を共有することが可能
- **KeepJobFlowAliveWhenNoSteps**プロパティをtrueに設定することで、クラスターがジョブの完了後も継続して実行されるようになる

## Glue
- AWSGlueServiceRoleポリシーを含むIAMロールを作成することで、クローラーがS3バケットにアクセスし、必要な操作を実行するための適切な権限が付与される
- ジョブメトリクス
現在のジョブのパフォーマンスと必要なリソースを正確に分析することができます
- 最大キャパシティパラメータの値を増加
ジョブに割り当てられるData Processing Unit (DPU)の数を増やすことができます
- FindMatches機械学習トランスフォーム
データ内の類似レコードや重複エントリーを自動的に特定する
- Detect PIIトランスフォーム
大量のデータ内のPIIを効率的に識別
- Glue Data Quality
PII匿名化ルールを設定することで、識別されたPIIを適切に匿名化することができる
- DynamicFrameクラスのuseS3ListImplementation
S3のリスト操作のパフォーマンスが向上
- DynamicFrameクラスのgroupFilesオプション:inPartition
同じパーティション内の小さなファイルがグループ化され、ファイルの読み取り回数が減少し、処理効率が向上するとともに、メモリ使用量も抑えられます
- Glue ワークフロー
他AWSサービスとの連携がなく、EMRなどデータ分析のサービスのみの連携であればGlueワークフローで十分
Lambdaなどほかサービスを連携するならStep Functionsを使用する必要あり

### MSK (Kafka)
スケーラビリティに優れた分散メッセージキュー
ストリーミングデータをリアルタイムで取り込んで処理するために最適化された分散データストア
1. レコードストリームを公開しサブスクライブする
2. レコードが生成される順序でレコードのストリームを効果的に保存
3. レコードのストリームをリアルタイムで処理する


### Open Search
リアルタイムのアプリケーションモニタリング、ログ分析、ウェブサイト検索などの幅広いユースケースにご利用いただける分散型、コミュニティ主導型、Apache 2.0 ライセンス、100% オープンソースの検索および分析スイート
- filter_path
OpenSearch Serviceからの応答に含まれるフィールドを制御

### Database Migration Service DMS
オンプレや他社クラウドのDBをAWSへ移行するツール


## AWS Data　Pipeline
オンプレミスのデータ抽出変換ロード
JDBCデータストアへの読み取り書き込みが可能

複雑ではないワークフロー
→Data Pipeline, Glueを使用
複雑
→Step functionsを使用

## Air Flow
ワークフロー
クラウド上でデータパイプラインを大規模に設定・運用する
Apache AirflowとPythonで実装


## S3
### ストレージクラス
- S3 Standard
頻繁にアクセスされるデータ向け
- S3 Standard-IA
存続期間が長くあまり頻繁にアクセスされないデータ向け
- S3 Intelligent-Tiering
アクセスパターンが変化、または不明な存続期間が長いデータ向け
- S3 One Zone-IA
存続期間が長くあまり頻繁にアクセスされない、且つ重要度の低いデータ向け
- S3 Glacier
取得時間が数分から数時間許容される長期アーカイブデータ向け
- S3 Glacier Deep Archive
取得時間が12時間許容される長期アーカイブデータ向け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284906/98b6e1e2-0a47-2ec8-9bd2-be2e4d2c6e14.png)

## AWS Data Exchange
クラウド上でサードパーティのデータセットを簡単に検索、購読、使用、共有することができるプラットフォーム

## DataSync
- オンプレミスとAWS間、またはAWSストレージサービス間での大容量データ転送を自動化するためのサービス
- ファイルベースのデータ転送に特化したサービス
- 増分転送をサポート、スケジューリング機能
- 転送中および保存中のデータの暗号化を自動的に行い、データの整合性チェックも実施

## Athena
- Athenaデータソースは、Apache SparkからAthenaのデータに直接アクセスすることを可能にする?→合ってるか不明
- Athenaデータソースを使用することで、SparkはAthenaのメタデータを理解し、効率的にクエリを実行することができる?→合ってるか不明
- クエリごとのデータ使用量制御機能を使用することで、1回のクエリで処理されるS3内のデータ量に上限を設定することが可能
- Athenaワークグループ
異なるユーザーグループやアプリケーション間でクエリの実行を分離し、コストを管理するための機能。各グループやシステム用に個別のワークグループを作成することで、クエリの実行環境を論理的に分離
- 小さなファイルが多数存在すると、Athenaはクエリ実行時に多くのファイルを読み取る必要があるため、大きなオブジェクトに統合する方が良い。スキャンファイル数も減る
- S3バケットのプレフィックスを基にしたパーティションプロジェクションによるパフォーマンス改善

## Lake Formation
データレイクの設定、セキュリティ、ガバナンスを簡素化し、細粒度のアクセス制御を提供する
- ブループリント：汎用的なデータ取り込みテンプレートを使用
    - バルクロード：
    - インクリメンタルロード：
- セキュリティ＆コントロール：パーミッション、SQLライクでシンプルなアクセス制御
- 強調＆利用：データカタログ
- 監視＆監査：路銀、コンソールによるアクティビティの詳細確認


## IAM
- sts:AssumeRole
一時的なセキュリティ認証情報を取得するために使用
sts: セキュリティトークンサービスを経由して一時的な権限を付与される

## KMS
- SSE-KMSを使用することで、S3オブジェクトの暗号化が自動的に行われる
- KMSキーへのアクセスをIAMポリシーで制限することで、特定のユーザやグループのみがアクセスできるようにできる
- 監査ログを自動的に生成するため、誰がいつ暗号化キーにアクセスしたかを追跡することができる
- SSE-KMSは他の選択肢と比較して、セキュリティと利便性のバランスが取れている

## AWS Database Migration Service（DMS）
- 異なるデータベース間でのデータ移行を専門に扱うサービス
- CDC データの変更をリアルタイムでキャプチャし、ターゲットデータベースに適用する変更データキャプチャ（CDC）機能

## AWS Glue DataBrew
- データの準備と変換を容易にするサービスであり、コーディングを最小限に抑えながら複雑なデータ変換を行うことができる
- Tableau Prep Builderみたいなもんかな


## Amazon Managed Service for Apache Flink
大規模なストリームデータの処理に特化したオープンソースフレームワーク

## Step Functions
- Mapステート
配列やリストの各要素に対して同じ処理を並行して実行できる機能を提供
- Parallelステート
限られた数の並行ブランチを同時に実行する
- Task ステート
単一のタスクや関数を実行するために使用
- Choiceステート
条件分岐のために使用

## Kinesis
- Kinesis Data Stream
ストリームデータの取り込み、保存、転送がスコープ
    - 超リアルタイム
    - シャード数を増やして同時並行処理
    - データ内のパーティションキーでシャードが分かれる
        - パーティションキーを適切に選択しないと、シャードで分散処理がされない
    - ファンアウトにより、コンシューマごとに専用のスループットを確保することが可能
    - Lambda 関数を拡張ファンアウトのコンシューマーとして登録することでパフォーマンス向上
    - データの保持期間はデフォルトで24h 延長可能、最大1年
    - on demandでは、シャードの管理自動化、柔軟なスケーリングが可能
    - 容量モード
        - プロビジョンド：シャード数は固定
        - オンデマンド：シャード数は自動スケール
- Data Firehose
    - バッファに蓄積して配信する、ニアリアルタイム
    - シャードの管理が不要
    - Lamda Functionにより、簡易的なデータ変換も可能
    -　API Gatewayを連携することで様々なサービスに連携可能
データ配信サービス
- Data Analytics　→　Apache Flinkに改名
    - ストリームデータをリアルタイムに操作
    - Lambdaではできない柔軟で複雑な分析が可能
    - SQL, Python, Apache Flinkをサポート
　
- MSK　Apache Kafka
    - 様々なAWSサービスとの統合
    - Serverlessもある

## SageMaker
SageMaker 機械学習リネージトラッキングを使用すると、機械学習のワークフローステップに関する情報を作成できるデータの正確性、完全性、信頼性を確認できる

## Amazon Macie
個人情報などの機密サービスを自動的に発見して通知、保護してくれる

## Lambda
パフォーマンス要件をみたすために
- 同時実行の上限を設定
- 即時の応答を必要としない非同期呼び出し
- 同時実行数のプロビジョニングを使用して関数を事前ウォーミング
- 関数に適切なタイムアウト値を設定
- 想定される実行時間に基づいてタイムアウトを調整し、一時的なエラーを処理するように再試行動作を設定
- Amazon EBS ボリュームにプロビジョンド IOPS を使用して、入力/出力パフォーマンスを向上

# データモデリング
概念的モデル、論理モデル、物理的モデル、正規化モデル

## OLTP
OLTP はトランザクション処理とリアルタイムの更新用に最適化されており、データの最新の状態に焦点を当てます。OLTP では正規化または非正規化モデルを使います。OLTP は OLAP と比べて必要なストレージ容量が小さく、応答時間も短いです。OLTP は注文処理、決済処理、顧客データ管理に適しています

## OLAP
OLAP は複雑なデータ分析とレポート用に最適化されており、データの最新の状態と履歴データに焦点を当てます。OLAP はスタースキーマ、スノーフレークスキーマなどの分析モデルを使用します。必要なストレージ容量が大きく、テラバイトからペタバイトが必要です。OLAP は顧客の行動予測と傾向の分析に適しています。