EMRでSpark環境を用意する

AWSのEMRを利用して、Apach Spark環境を作成してみます。EMRのバージョンは、5.14.0です。

EC2キーペアの用意

EMRで作成されたEC2で利用する、EC2キーペアを用意しておきます。

EMRでクラスタ作成

advanced optionsを選択

AWSコンソールのEMRコンソールに移動して、 Create cluster をクリック。 クラスタ作成画面にて、 Go to advanced options をクリック。

EMRで作成するソフトウェア環境の定義

Software Configuration で、HadoopとSparkを選択。

f:id:goodbyegangster:20180701151223p:plain

今回はPython3系にてPySparkを起動させたいため、software settingsにて、以下のjsonを入力しています。

[
    {
        "Classification": "spark-env", 
        "Configurations": [
            {
                "Classification": "export", 
                "Configurations": [], 
                "Properties": {
                   "PYSPARK_PYTHON": "/usr/bin/python3"
                }
            }
        ], 
        "Properties": {}
    }
]

初期構築時にSparkの設定を入れるには、このプロセス時に設定ファイルであるjsonを定義しておく必要があります。

jsonのテンプレートはこちらを参考。

アプリケーションの設定 - Amazon EMR

PySparkの場合、与えられるパラメータは下記マニュアルに記載されています。これをjson定義ファイルの ConfigurationsProperties の中に記載してあげます。今回は、Pythonバイナリファイルのパス定義として、Python3系のパスに指定しています。

Configuration - Spark 2.3.1 Documentation

Add steps の項目では、クラスターが起動時に自動実行する(spark-submitで動かしたい)Sparkプログラムを定義できます。

EMRクラスターの設定

EMRクラスターを構成する、EC2のリソース設定をします。Spark環境の場合、Yarnクラスターマネージャとなるマスターノードと、Executor実行環境であるコアノードを作成します。作成方法は、以下2つの方法から選択できます。

  • ユニフォーム・インスタンス・グループ
    • 各ノード(マスター、コア、タスク)が、同じインスタンスタイプで構成される
    • 追加できるディスクサイズも、各ノード単位で統一される
  • インスタンス・フリート
    • 配置先サブネットとして複数を指定可能
      • ただし、指定されたサブネットから最適なサブネットがAWSにより1つ選択され、そのサブネット内に配置される
    • 各ノードあたり、最大5つのインスタンスタイプを指定可能
      • 指定するインスタンスタイプに合わせて、追加できるディスクサイズもカスタマイズ可能
      • ただし、マスターノードが単一構成、オートスケール不可であるのは、ユニフォーム・インスタンス・グループと変わらず
    • コアグループ・タスクグループで必要となる、vCPU数またはユニット数(必要なリソース単位をユニットという概念で定義できる)を指定
      • それに合致したインスタンスタイプ・ノード数のEC2が自動的に起動される

以下の画面は、インスタンス・フリートにて作成している画面です。

f:id:goodbyegangster:20180701213200p:plain

クラスターの設定オプション

設定オプションを定義する部分です。

EMRFS consistent view とは、EMRFSを利用する場合にs3の結果整合性の問題を回避してくれるビューらしいです。Hadoop側の更新処理とs3側のファイル更新処理の整合性を担保してくれるとのこと。Spark環境では不要ですね。

Bootstrap Action では、クラスタ初期起動時に実行してくれるスクリプト定義できます。EC2のユーザーデータみたいなもの。

f:id:goodbyegangster:20180701213101p:plain

クラスターのセキュリティ設定

必要なセキュリティ設定を実施します。EMR用に作成されたEC2には、デフォルトでは以下定義のセキュリティグループが付与されます。

Amazon EMR マネージドセキュリティグループを使用する - Amazon EMR

f:id:goodbyegangster:20180701151256p:plain

で、処理を進めていけば、設定されたEMRクラスターであるEC2が起動してきます。

接続方法

クラスターのマスターノードに接続

実際にマスターノードに接続して、PySparkを起動してみます。マスターノードへSSH接続を行います。セキュリティグループにて、必要なポートが開放されていない場合、ちゃんと設定をしてあげます。

接続してみると、こんな感じ。ちゃんとPython3系でPySparkが起動しています。

Last login: Sat Jun 30 15:18:23 2018

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
9 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.

EEEEEEEEEEEEEEEEEEEE MMMMMMMM           MMMMMMMM RRRRRRRRRRRRRRR
E::::::::::::::::::E M:::::::M         M:::::::M R::::::::::::::R
EE:::::EEEEEEEEE:::E M::::::::M       M::::::::M R:::::RRRRRR:::::R
  E::::E       EEEEE M:::::::::M     M:::::::::M RR::::R      R::::R
  E::::E             M::::::M:::M   M:::M::::::M   R:::R      R::::R
  E:::::EEEEEEEEEE   M:::::M M:::M M:::M M:::::M   R:::RRRRRR:::::R
  E::::::::::::::E   M:::::M  M:::M:::M  M:::::M   R:::::::::::RR
  E:::::EEEEEEEEEE   M:::::M   M:::::M   M:::::M   R:::RRRRRR::::R
  E::::E             M:::::M    M:::M    M:::::M   R:::R      R::::R
  E::::E       EEEEE M:::::M     MMM     M:::::M   R:::R      R::::R
EE:::::EEEEEEEE::::E M:::::M             M:::::M   R:::R      R::::R
E::::::::::::::::::E M:::::M             M:::::M RR::::R      R::::R
EEEEEEEEEEEEEEEEEEEE MMMMMMM             MMMMMMM RRRRRRR      RRRRRR

[hadoop@ip-172-31-53-151 ~]$ pyspark
Python 3.4.8 (default, Apr 25 2018, 23:50:36)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/06/30 15:19:50 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.0
      /_/

Using Python version 3.4.8 (default, Apr 25 2018 23:50:36)
SparkSession available as 'spark'.

WEB管理コンソールへの接続

Hadoop側で提供している各種webコンソールも利用できます。アクセスする方法は、AWSコンソールのEMR画面より、作成したクラスター環境をたどると、リンクが表示されています。

f:id:goodbyegangster:20180701151258p:plain

Sparkのwebコンソールはこちら。マスターノードの18080ポートになります。必要である場合、セキュリティグループの設定変更を。

f:id:goodbyegangster:20180701151301p:plain

Yarnのwebコンソールはこちら。マスターノードの8088ポートになります。こちらも必要である場合、セキュリティグループの設定変更を。

f:id:goodbyegangster:20180701151304p:plain

各webコンソールで利用されるポート情報は下記です。

Amazon EMR クラスターでホストされているウェブサイトの表示 - Amazon EMR

お手軽ですね。