원격 시스템 또는 엣지 노드에서 Amazon EMR 클러스터로 Spark 작업을 제출하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 3월2일

Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스와 같은 원격 시스템에서 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 S3(Amazon Simple Storage Service)로 복사합니다. 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에 대한 독립형 모드를 지원하지 않습니다. 다음과 같은 명령으로는 원격 Amazon EMR 클러스터에 Spark 애플리케이션을 제출할 수 없습니다.

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

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?