EMR上でSparkのWeb UIにアクセスする方法
小ネタです。EMRでSparkのWeb UIにアクセスする際はYARN ResourceManagerのWeb UI経由でアクセスする必要がありました。
YARN ResourceManager経由でアクセス
前提
以下の環境を前提としています。
- emr-4.6.0 でアプリケーションは Spark 1.6.1 on Hadoop 2.7.2 YARN with Ganglia 3.7.2
- ハードウェア構成は m1.medium を 1 台(検証用なのでマスターノードのみ)
- EC2キーペアを設定(SOCKSプロキシの利用に必要)
AWS CLIだと以下のようなコマンドになります。KeyName
, SubnetId
, log-uri
をご自身の環境に合わせればそのまま利用できるはずです。
aws emr create-cluster --applications Name=Ganglia Name=Spark \ --ec2-attributes '{"KeyName":"XXXX","InstanceProfile":"EMR_EC2_DefaultRole","SubnetId":"subnet-dXXXX"}' \ --service-role EMR_DefaultRole --enable-debugging --release-label emr-4.6.0 \ --log-uri 's3n://aws-logs-XXXX-ap-northeast-1/elasticmapreduce/' --name 'emr-4.6.0 spark' \ --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","InstanceType":"m1.medium","Name":"Master Instance Group"}]' \ --configurations '[{"Classification":"spark","Properties":{"maximizeResourceAllocation":"true"},"Configurations":[]}]' \ --region ap-northeast-1
SOCKSプロキシはResourceManagerのWeb UIへアクセスする際に利用します。公式ドキュメントに書かれているオプション2のSOCKSプロキシを利用する方法でWeb UIにアクセスします。
Amazon EMR クラスターでホストされているウェブサイトの表示 - Amazon Elastic MapReduce
事前準備
まずはYARN上にSpark Applicaitonを起動しておく必要があるので、今回はspark-shell
を起動しておきます。また、Web UIを表示した際に真っ白だと寂しいのでSparkのライセンスファイルをカウントする処理を実行しておきます。
まずはSSHでマスターノードに接続します。
ssh -i /path/to/XXXX.pem -l hadoop ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
SSH経由でマスターノードにアクセスして、spark-shell
を起動します。
[hadoop@ip-172-31-21-122 ~]$ spark-shell ... scala>
ライセンスファイルをカウントする処理を実行します。
scala> val textFile = sc.textFile("file:/usr/lib/spark/LICENSE") textFile: org.apache.spark.rdd.RDD[String] = file:/usr/lib/spark/LICENSE MapPartitionsRDD[1] at textFile at <console>:27 scala> textFile.count() res0: Long = 294
Spark Web UIへのアクセス
では実際にSparkのWeb UIを表示したいと思います。まずResourceManagerのWEB UIにアクセスし、そこからSparkのWeb UIにアクセスします。
ResourceManagerのWeb UIにアクセスすると、YARN Applicationの一覧にspark-shellが表示されているので、リンクをクリックします。
Applicationの詳細画面に[Tracking URL]があるので、こちらをクリックします。
無事、SparkのWeb UIが表示されました。
直接アクセスしてみる
参考までに標準の4040
ポートでアクセスしてみます。アクセスすると表示が崩れていることが分かります。
最後に
最初標準のポートにアクセスして表示が崩れていて、多少悩んだので参考になれば幸いです。結局検索して以下のページを見つけて解決しました。
amazon emr - Spark UI on AWS EMR - Stack Overflow