

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon EMR의 이전 AMI 버전에 고유한 Spark 애플리케이션
<a name="emr-3x-spark"></a>

## 대화식 또는 배치 모드로 Spark 사용
<a name="emr-3x-spark-interactive-batch"></a>

Amazon EMR에서는 두 가지 모드로 Spark 애플리케이션을 실행할 수 있습니다.
+ 대화형
+ 배치

콘솔 또는를 사용하여 장기 실행 클러스터를 시작할 때 SSH를 사용하여 Hadoop 사용자로 마스터 노드에 연결하고 Spark 셸을 사용하여 Spark 애플리케이션을 대화형으로 개발하고 실행할 AWS CLI수 있습니다. Spark를 대화식으로 사용하면 배치 환경에서 보다 더 쉽게 Spark 애플리케이션을 시제품화하거나 테스트할 수 있습니다. Spark 애플리케이션을 대화형 모드에서 수정한 후에는 해당 애플리케이션 JAR 또는 Python 프로그램을 Amazon S3에 있는 클러스터의 로컬 프라이머리 노드 파일 시스템에 추가할 수 있습니다. 그런 다음 이 애플리케이션을 배치 워크플로로 제출할 수 있습니다.

배치 모드에서는 Spark 스크립트를 Amazon S3 또는 로컬 프라이머리 노드 파일 시스템에 업로드한 다음, 작업을 클러스터에 하나의 단계로 제출합니다. 장기 실행 클러스터 또는 일시적 클러스터에 Spark 단계를 제출할 수 있습니다.

## Spark가 설치된 클러스터 생성
<a name="emr-3x-spark-install"></a>

**콘솔을 사용하여 Spark가 설치된 클러스터를 시작하려면**

1. 새 Amazon EMR 콘솔로 이동하고 측면 탐색에서 **이전 콘솔로 전환**을 선택합니다. 이전 콘솔로 전환할 때 예상되는 사항에 대한 자세한 내용은 [이전 콘솔 사용](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)을 참조하세요.

1. **클러스터 생성**을 선택합니다.

1. **소프트웨어 구성**에서 필요한 AMI 릴리스 버전을 선택합니다.

1.  **설치할 애플리케이션**의 목록에서 **Spark**를 선택한 다음 **구성 및 추가**를 선택합니다.

1. 인수를 추가하여 원하는 대로 Spark 구성을 변경합니다. 자세한 내용은 [Spark 구성](#emr-3x-spark-configure) 단원을 참조하십시오. **추가**를 선택합니다.

1.  필요에 따라 다른 옵션을 선택한 다음 **클러스터 생성**을 선택합니다.

다음은 Java를 사용하여 Spark가 설치된 클러스터를 생성하는 방법을 보여주는 예제입니다.

```
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
SupportedProductConfig sparkConfig = new SupportedProductConfig()
			.withName("Spark");

RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("Spark Cluster")
			.withAmiVersion("3.11.0")
			.withNewSupportedProducts(sparkConfig)
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myKeyName")
				.withInstanceCount(1)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m3.xlarge")
				.withSlaveInstanceType("m3.xlarge")
			);			
RunJobFlowResult result = emr.runJobFlow(request);
```

## Spark 구성
<a name="emr-3x-spark-configure"></a>

클러스터를 생성할 때 [Github의 awslabs/emr-bootstrap-actions/spark 리포지토리](https://github.com/awslabs/emr-bootstrap-actions/tree/master/spark)에 있는 부트스트랩 작업을 실행하여 Spark를 구성합니다. 부트스트랩 작업이 허용하는 인수는 해당 리포지토리의 [README](https://github.com/aws-samples/emr-bootstrap-actions/blob/master/spark/examples/README.md)를 참조하세요. 부트스트랩 작업은 `$SPARK_CONF_DIR/spark-defaults.conf` 파일의 속성을 구성합니다. 설정에 대한 자세한 내용은 Spark 설명서의 Spark 구성 주제를 참조하세요. 다음 URL의 "latest"를 `2.2.0` [http://spark.apache.org/docs/latest/configuration.html](http://spark.apache.org/docs/latest/configuration.html)과 같이 설치하는 Spark 버전 번호로 대체할 수 있습니다.

또한 각 애플리케이션 제출 시 Spark를 동적으로 구성할 수 있습니다. `spark` 구성 파일을 사용하여 실행기에 대한 리소스 할당을 자동으로 최대화하는 설정을 사용할 수 있습니다. 자세한 내용은 [Spark 기본 구성 설정 재정의](#emr-3x-spark-dynamic-configuration) 단원을 참조하십시오.

### Spark 기본 설정 변경
<a name="emr-3x-spark-default-settings"></a>

다음은 AWS CLI를 사용하여 `spark.executor.memory`가 2G로 설정된 클러스터를 생성하는 방법을 보여주는 예입니다.

**참고**  
가독성을 위해 Linux 줄 연속 문자(\$1)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

```
aws emr create-cluster --name "Spark cluster" --ami-version 3.11.0 \
--applications Name=Spark, Args=[-d,spark.executor.memory=2G] --ec2-attributes KeyName=myKey \
--instance-type m3.xlarge --instance-count 3 --use-default-roles
```

### Spark에 작업 제출
<a name="emr-3x-spark-submit-work"></a>

작업을 클러스터로 제출하려면 단계를 사용하여 EMR 클러스터에서 `spark-submit` 스크립트를 실행합니다. [AmazonElasticMapReduceClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/AmazonElasticMapReduceClient.html)에서 `addJobFlowSteps` 메서드를 사용하여 단계를 추가합니다.

```
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
StepFactory stepFactory = new StepFactory();
AddJobFlowStepsRequest req = new AddJobFlowStepsRequest();
req.withJobFlowId("j-1K48XXXXXXHCB");

List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
		
StepConfig sparkStep = new StepConfig()
	.withName("Spark Step")
	.withActionOnFailure("CONTINUE")
	.withHadoopJarStep(stepFactory.newScriptRunnerStep("/home/hadoop/spark/bin/spark-submit","--class","org.apache.spark.examples.SparkPi","/home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar","10"));

stepConfigs.add(sparkStep);
req.withSteps(stepConfigs);
AddJobFlowStepsResult result = emr.addJobFlowSteps(req);
```

### Spark 기본 구성 설정 재정의
<a name="emr-3x-spark-dynamic-configuration"></a>

애플리케이션마다 Spark 기본 구성 값을 재정의해야 할 때가 있습니다. 이 작업은 단계를 사용하여 애플리케이션을 제출할 때 기본적으로 옵션을 `spark-submit`에 전달함으로써 수행할 수 있습니다. 예를 들면 `spark.executor.memory`를 변경하여 실행자 프로세스에 할당된 메모리를 변경해야 할 때가 있습니다. 다음과 같은 인수를 사용하여 `--executor-memory` 스위치를 공급할 수 있습니다.

```
/home/hadoop/spark/bin/spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

마찬가지로, `--executor-cores` 및 `--driver-memory`를 조정할 수 있습니다. 단계에서 다음 인수를 단계에 제공합니다.

```
--executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

또한 `--conf` 옵션을 사용하여 기본 제공 스위치가 없는 설정을 조정할 수도 있습니다. 조정 가능한 다양한 설정에 대한 자세한 내용은 Apache Spark 설명서의 [Dynamically Loading Spark Properties](https://spark.apache.org/docs/latest/configuration.html#dynamically-loading-spark-properties) 주제를 참조하세요.