[初心者] EMRとは何ですか/とりあえずざっとまとめてチュートリアルしてみる
おはようございます、もきゅりんです。
ソリューションアーキテクト試験にも時折顔を出してくる、EMR。
業務的にはまず触ることもないため、スルーをしていました。
今更なのですが、どんなものかざっとまとめて触ってみた、といった内容です。
この稿が自分と同じような方の理解の一助となれたら幸いです。
EMRにそれほど興味もないけど、これ何なんだろう?ってことだけ触れておきたい方は用語と概要だけ見て頂ければ良いかと思います。
理解することを保証しませんが、数分です。
内容
- 用語
- 概要
- 分散処理基盤のアーキテクチャと機能
- 分散処理に適したアプリケーション
- EMRの暗号化について
- チュートリアルをやってみる
ちなみにですが、ちょっと古いのですが弊社の過去記事にもとても参考となるものがあります。
(これだけでも十分なような気もしている)
Hadoopとは?からQAと社内勉強会資料を弊社EMRおじさんの記事
EMRの入門記事で簡潔にまとまっており、ユースケースについても紹介されている記事
では、頻出用語です。
知ってて当然のようにドキュメントで出てくるけど、そもそもそれは何??っていう主要と思われる用語を独断と偏見で選んで簡単にまとめました。
用語
MapReduce
Googleが開発した、大規模なデータを効率的に分散処理するためのフレームワーク。必要な計算内容を実装したMap処理とReduce処理を用意して、このシステムにぶっこむとうまいこと分散処理してくれる。
Google File System(GFS)
Goolgeが開発した、分散ファイルシステム。
Googleは大量の情報をGFSに保存して、計算をMapReduceで行っている(らしい)。
Hadoopの場合は、Hadoop File System(HDFS)。
EMRの場合は、EMR File System(EMRFS)。S3をHDFSのように扱える。
Hadoop
上記、Googleが公開したMapReduceとGFSの論文に触発されて開発されたオープンソースのソフトウェアフレームワーク。
Spark
「Resilient Distributed Datasets (RDD)」という分散共有メモリの仕組みをもち、複数マシンでメモリを共有することで、機械学習のような同じ処理の繰り返し、同じデータを何度も使うような処理において、Hadoopと比較して大幅に高速だとされる。オープンソースのソフトウェアフレームワーク。
Hive
Hadoop上に構築されたデータウェアハウス構築環境で、SQLライクな「HiveQL」を使ってデータの集約・問い合わせ・分析を行える。
Pig
Hive同様、Hadoop上で動作するプログラムを作成する「Pig Latin」というスクリプト言語を使ってデータの集約・問い合わせ・分析を行える。
概要
下記に別途まとめていますが、先に簡単にEMRがやってくれることをざっくりまとめてしまうと、この3つだと思われます。
- 前提: 大量のデータがあります or 続々とデータが追加されていきます。
-
大量のデータをうまく分散処理してくれるマシンクラスターを作ります。
-
分散処理に適したアプリケーションを実行します。
※ 2の部分をブラックベルトだと、「分散処理基盤」と称しています。
本来は2,3を自力で色々考慮した上で、設計して実装しなければならないものを、EMRはポチポチするだけで構築してくれるという優れものなわけですね。
もう少しだけブラックベルトをベースにまとめます。
分散処理基盤のアーキテクチャと機能
アーキテクチャ
役割 | 主語 |
---|---|
大量のデータ or 続々と追加されるデータ | S3,Kinesis,DynanoDB |
うまく分散処理してくれるマシンクラスター | Master/Core/Task node |
分散処理に適したアプリケーション | Hadoop,Hive,Pig,HBase,Spark, ...etc |
補足:
Masterが一番偉い。CoreやTaskたちがちゃんと動いているか監視する。
CoreとTaskが頑張って仕事する。CoreはローカルディスクのHDFSを持っている。
機能
実行場所 | 方法 | 詳細 |
---|---|---|
クラスター外から | Stepで実行 | 任意のタイミングで設定・追加できる処理 |
AWSサービスで実行 | Lambda,Data Pipelineなど | |
各種スケジューラから実行 | Airflow,Luigi, or other schedulers on EC2 | |
クラスター上から | 各アプリケーションごとのインターフェースにより実行 | - |
分散処理に適したアプリケーション
先のHadoopやSparkを含めFlinkとかPrestoとかZeppelinとか...
ここを詳しく説明できる知見はありません。
分散処理系だけでなく、データベース系、GUI系など色々いるようです。
Sparkがまさに世の中でスパーキングしているらしいです。
EMRの暗号化について
詳細の仕様はこちらを確認してもらいたいのですが、こちらが概要図です。
簡潔にまとめたのが下記表です。
タイミング | 対応内容 |
---|---|
保管時の暗号化 | サーバー側の暗号化またはクライアント側の暗号化が可能 |
転送時の暗号化 | S3 暗号化が有効であるかどうかにかかわらず、TLSは、EMR クラスターノードと Amazon S3 間で伝送中の EMRFS オブジェクトを暗号化する |
ローカルディスクでの暗号化 | HDFS の暗号化に加えて、LUKS の暗号化も使用が可能, クラスターのインスタンスストアおよび EBS ストレージボリュームに適用, EBS ルートデバイスボリュームを暗号化するには、Amazon EMR バージョン 5.7.0 以降を使用し、カスタムAMI を指定する |
ローカル転送時の暗号化 | 各アプリケーション固有のオープンソース機能に依存する |
では、EMRというものをそれとなく把握した上で、チュートリアルをやってみます。
チュートリアル
1. サンプルクラスターの前提条件の設定
S3バケットの作成 Hive クエリからの出力データを保存するために必要です。 入力に使うサンプルデータは後ほど出てきます。
クラスターノードに接続するためのSSHキーペアが必要です。
なければ作成しておきましょう。(ただチュートリアルには必須ではありません。)
2. クラスターを起動
では、クラスターを起動します。
クラスター名とキーペア以外はデフォルトで進めます。
え、、、 デフォルトのm3.xlargeだとコケました...
サポートされるインスタンスタイプをよく確認して進めましょう。。
インスタンスをm3.largeに変更して作成し直しました。
待機中になるまで待機します。
15分くらいかかります。
3. クライアントから SSH 接続をクラスターに許可する
クライアントからの SSH を許可することは、チュートリアルを完了するための要件ではありませんが、SSH を使用してクラスターにアクセスすることは一般的な要件です。
らしいのでセキュリティグループを編集してポート22を開放して接続してみます。
(実際にはSSH用のSGを作成してMasterのEC2にアタッチする方が適切なのですが、今回はチュートリアルなのでご容赦下さい)
4. Hiveスクリプトをステップとして実行してデータを処理する
Hive スクリプトでHiveQL クエリを実行し、指定した Amazon S3 の出力場所にクエリ結果を書き込むステップを実行します。
サンプルデータとサンプルHiveスクリプトは、Amazon S3に保存されています。
データはAmazon CloudFront アクセスログファイル、サンプルスクリプトの内容は、指定された期間におけるオペレーティングシステムごとのリクエストの合計数を計算するもののようです。
下記以外はデフォルト設定で進めます。
- スクリプトS3場所
s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q
- S3 の場所の入力
s3://ap-northeast-1.elasticmapreduce.samples
- S3の場所の出力
s3://作成したバケット名/
Hiveスクリプトで、CloudFront アクセスログファイルの形式を整形して計算します。
スクリプトの実行完了は約 1 分かかるようです。
5. 結果の表示
なるほど、無事スクリプトが実行されて取得できていますね。
6. 後片付けする
忘れずにS3バケットとクラスターを削除しましょう。
以上となります。
如何でしたでしょうか。
自分は少しだけEMRとの距離が縮まった気がします。
いつもに増して、理解したとはとても言えない世界でしたが、やっていることと、使い方は何となく把握できました。
今回は、前提知識を揃えるのに時間を費やしました。。
参考
AWSチーム社内勉強会「EMRおじさんに聞いてみよう」レポート