リモートマシンまたはエッジノードから Amazon EMR クラスターに Spark ジョブを送信するにはどうすればよいですか?

最終更新日: 2020 年 3 月 2 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスなどのリモートマシンから Amazon EMR クラスターに Apache Spark ジョブを送信したいと考えています。

簡単な説明

リモートマシンから EMR クラスターに Spark ジョブを送信するには、以下の条件が満たされている必要があります。

1.    リモートマシンからすべてのクラスターノードへのネットワークトラフィックが許可されている。

2.    すべての Spark および Hadoop バイナリがリモートマシンにインストールされている。

3.    リモートマシン上の設定ファイルが EMR クラスターをポイントしている。

解決方法

リモートマシンからすべてのクラスターノードへのネットワークトラフィックが許可されていることを確認する

  • EC2 インスタンスをリモートマシンまたはエッジノードとして使用している場合: そのインスタンスのセキュリティグループから各クラスターノードのセキュリティグループへのインバウンドトラフィックを許可します。
  • 独自のマシンを使用している場合: 自分のマシンの IP アドレスから各クラスターノードのセキュリティグループへのインバウンドトラフィックを許可します。

Spark およびその他の依存バイナリをリモートマシンにインストールする

バイナリをインストールするには、次のステップで説明するように EMR クラスターのマスターノードからファイルをコピーします。これは、EMR クラスターとリモートマシンの両方に同じバージョンを着実にインストールする最も簡単な方法です。

1.    次のコマンドを実行して、リモートマシンにフォルダ構造を作成します。

sudo mkdir -p /var/aws/emr/
sudo mkdir -p /etc/hadoop/conf
sudo mkdir -p /etc/spark/conf
sudo mkdir -p /var/log/spark/user/
sudo chmod 777 -R /var/log/spark/

2.    EMR クラスターのマスターノードからリモートマシンに以下のファイルをコピーします。フォルダ構造やファイル名は変更しないでください。
/etc/yum.repos.d/emr-apps.repo
/var/aws/emr/repoPublicKey.txt

3.    次のコマンドを実行して、Spark および Hadoop バイナリをインストールします。

sudo yum install -y hadoop-client
sudo yum install -y hadoop-hdfs
sudo yum install -y spark-core
sudo yum install -y java-1.8.0-openjdk

Spark で AWS Glue データカタログを使用する場合は、リモートマシンで次のコマンドを実行して AWS Glue ライブラリをインストールします。

sudo yum install -y libgssglue

設定ファイルを作成して EMR クラスターをポイントする

注意: rsync などのツールを使用して、EMR マスターノードからリモートインスタンスに設定ファイルをコピーすることもできます。

1.    EMR クラスターのマスターノードで次のコマンドを実行して、設定ファイルを Amazon Simple Storage Service (Amazon S3) にコピーします。yours3bucket に使用するバケットの名前を指定します。

aws s3 cp /etc/spark/conf s3://yours3bucket/emrhadoop-conf/sparkconf/ --recursive
aws s3 cp /etc/hadoop/conf s3://yours3bucket/emrhadoop-conf/hadoopconf/ --recursive

2.    コアノードとタスクノードで次のコマンドを実行して、S3 バケットからリモートマシンに設定ファイルをダウンロードします。yours3bucket に前のステップで使用したバケットの名前を指定します。

sudo aws s3 cp s3://yours3bucket/emrhadoop-conf/hadoopconf/ /etc/hadoop/conf/ --recursive
sudo aws s3 cp s3://yours3bucket/emrhadoop-conf/sparkconf/ /etc/spark/conf/ --recursive

3.    EMR クラスターに Spark ジョブを送信するユーザーの HDFS ホームディレクトリを作成します。次のコマンドでは、sparkuser にユーザーの名前を指定します。

hdfs dfs –mkdir /user/sparkuser
hdfs dfs -chown sparkuser:sparkuser /user/sparkuser

これで、リモートマシンで Spark ジョブの準備ができました。

Spark ジョブを送信する

EMR クラスターに Spark ジョブを送信するには、次のコマンドを実行します。次の値を置き換えます。
org.apache.spark.examples.SparkPi: ジョブのエントリポイントとして機能するクラス
/usr/lib/spark/examples/jars/spark-examples.jar:Java .jar ファイルへのパス

spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

hdfs コマンドを使用して、リモートマシンから HDFS データにアクセスすることもできます。

一般的なエラー

スタンドアロンモード

Amazon EMR では、Spark のスタンドアロンモードがサポートされていません。次のようなコマンドでは、Spark アプリケーションを Amazon EMR リモートクラスターに送信することはできません。

SparkConf conf = new
SparkConf().setMaster("spark://master_url:7077”).setAppName("Word Count");

代わりに、この記事の前半で説明したように、ローカルマシンをセットアップします。次に spark-submit コマンドを使用して、アプリケーションを送信します。

java.lang.UnsupportedClassVersionError

次のエラーは、リモート EC2 インスタンスが Java バージョン 1.7 を実行していて、EMR クラスターが Java バージョン 1.8 を実行しているときに発生します。

Exception in thread "main" java.lang.UnsupportedClassVersionError:
org/apache/spark/launcher/Main : Unsupported major.minor version 52.0

このエラーを解決するには、次のコマンドを実行して EC2 インスタンスの Java バージョンをアップグレードします。

sudo yum install java-1.8.0
sudo yum remove java-1.7.0-openjdk

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合