

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

# Hadoop 애플리케이션 생성 또는 실행
<a name="emr-hadoop-application"></a>

**Topics**
+ [Amazon EMR을 사용하여 바이너리 빌드](emr-build-binaries.md)
+ [스트리밍을 사용하여 데이터 처리](UseCase_Streaming.md)
+ [사용자 지정 JAR로 데이터 처리](UseCase_CustomJar.md)

# Amazon EMR을 사용하여 바이너리 빌드
<a name="emr-build-binaries"></a>

Amazon EMR을 빌드 환경으로 사용하여 클러스터에서 사용할 수 있도록 프로그램을 컴파일할 수 있습니다. Amazon EMR에서 사용하는 프로그램은 Amazon EMR에 사용되는 것과 동일한 Linux 버전을 실행하는 시스템에서 컴파일해야 합니다. 32비트 버전의 경우 32비트 시스템에서 컴파일하거나 32비트 교차 컴파일 옵션이 활성화된 상태로 컴파일해야 합니다. 64비트 버전의 경우 64비트 시스템에서 컴파일하거나 64비트 교차 컴파일 옵션이 활성화된 상태로 컴파일해야 합니다. EC2 인스턴스 버전에 대한 자세한 내용은 *Amazon EMR 관리 안내서*에서 [EC2 인스턴스 계획 및 구성](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-ec2-instances.html)을 참조하세요. 지원되는 프로그래밍 언어로는 C\$1\$1, Python 및 C\$1이 있습니다.

다음 테이블에는 Amazon EMR을 사용한 애플리케이션 빌드 및 테스트 관련 단계가 요약되어 있습니다.


**모듈 빌드 프로세스**  

|  |  | 
| --- |--- |
|  1 |  클러스터의 마스터 노드에 연결합니다. | 
|  2  |  소스 파일을 마스터 노드로 복사합니다. | 
|  3  |  필요한 최적화를 사용하여 바이너리를 빌드합니다. | 
|  4 |  프라이머리 노드에서 Amazon S3으로 바이너리를 복사합니다. | 

이러한 각각의 단계에 대한 자세한 내용은 다음 섹션에서 설명합니다.

**클러스터의 마스터 노드에 연결하려면**
+ *Amazon EMR 관리 안내서*에서 [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)의 지침을 따릅니다.

**소스 파일을 마스터 노드로 복사하려면**

1. Amazon S3 버킷에 소스 파일을 배치합니다. 버킷을 생성하는 방법과 Amazon S3로 데이터를 이동하는 방법을 알아보려면 [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)를 참조하세요.

1. 다음과 비슷한 명령을 입력하여 하둡 클러스터에 소스 파일용 폴더를 생성합니다.

   ```
   mkdir SourceFiles
   ```

1. 다음과 비슷한 명령을 입력하여 Amazon S3에서 프라이머리 노드로 소스 파일을 복사합니다.

   ```
   hadoop fs -get s3://amzn-s3-demo-bucket/SourceFiles SourceFiles
   ```

**필요한 최적화를 사용하여 바이너리 빌드**  
바이너리 빌드 방식은 여러 요인에 따라 달라집니다. 특정 빌드 도구에 대한 지침에 따라 환경을 설정하고 구성합니다. 빌드 환경을 설치하는 방법을 알아보기 위해 하둡 시스템 사양 명령을 사용하여 클러스터 정보를 가져올 수 있습니다.

**시스템 사양을 식별하려면**
+ 다음 명령을 사용하여 바이너리를 빌드하는 데 사용하려는 아키텍처를 확인합니다.

  1. Debian 버전을 보려면 다음 명령을 입력합니다.

     ```
     master$ cat /etc/issue
     ```

     출력 결과는 다음과 비슷합니다.

     ```
     Debian GNU/Linux 5.0
     ```

  1. 퍼블릭 DNS 이름 및 프로세서 크기를 보려면 다음 명령을 입력합니다.

     ```
     master$ uname -a
     ```

     출력 결과는 다음과 비슷합니다.

     ```
     Linux domU-12-31-39-17-29-39.compute-1.internal 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:34:28 EST 2008 x86_64 GNU/Linux
     ```

  1. 프로세서 속도를 보려면 다음 명령을 입력합니다.

     ```
     master$ cat /proc/cpuinfo
     ```

     출력 결과는 다음과 비슷합니다.

     ```
     processor : 0
     vendor_id : GenuineIntel
     model name : Intel(R) Xeon(R) CPU E5430 @ 2.66GHz
     flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr cda lahf_lm
     ...
     ```

바이너리가 빌드되면 파일을 Amazon S3로 복사할 수 있습니다.

**프라이머리 노드에서 Amazon S3로 바이너리를 복사하는 방법**
+ 다음 명령을 입력하여 바이너리를 Amazon S3 버킷으로 복사합니다.

  ```
  hadoop fs -put BinaryFiles s3://amzn-s3-demo-bucket/BinaryDestination
  ```

# 스트리밍을 사용하여 데이터 처리
<a name="UseCase_Streaming"></a>

Hadoop Streaming은 Hadoop과 함께 제공되는 유틸리티로, 사용자는 이 유틸리티를 이용해 Java 이외의 언어로 MapReduce 실행 파일을 개발할 수 있습니다. 스트리밍은 JAR 파일 형식으로 구현되므로 Amazon EMR API 또는 명령줄에서 표준 JAR 파일과 같이 스트리밍을 실행할 수 있습니다.

이 섹션에서는 Amazon EMR에서 스트리밍을 사용하는 방법을 설명합니다.

**참고**  
Apache Hadoop 스트리밍은 독립적인 도구입니다. 따라서 모든 기능 및 파라미터는 여기에 설명되어 있지 않습니다. Hadoop 스트리밍에 대한 자세한 내용은 [http://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html](http://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html)을 참조하세요.

## Hadoop 스트리밍 유틸리티 사용
<a name="HadoopStreamCommands"></a>

이 섹션에서는 Hadoop의 스트리밍 유틸리티를 사용하는 방법을 설명합니다.


**Hadoop 프로세스**  

|  |  | 
| --- |--- |
| 1 |  원하는 프로그래밍 언어로 mapper 및 reducer 실행 파일을 작성하세요. Hadoop 설명서의 지침에 따라 스트리밍 실행 파일을 작성하세요. 프로그램은 표준 출력을 통해 표준 입력 및 출력 데이터에서 입력을 읽어야 합니다. 기본적으로 각 입력/출력 행은 레코드를 나타내며 각 행의 첫 번째 탭은 키와 값 사이의 구분 기호로 사용됩니다.  | 
| 2 |  실행 파일을 로컬에서 테스트하여 Amazon S3에 업로드합니다.  | 
| 3 |  Amazon EMR 명령줄 인터페이스 또는 Amazon EMR 콘솔을 사용하여 애플리케이션을 실행합니다.  | 

각 mapper 스크립트는 클러스터에서 별도의 프로세스로 실행됩니다. 각 reducer 실행 파일은 mapper 실행 파일의 출력을 작업 흐름에 의해 데이터 출력으로 변환합니다.

대부분의 스트리밍 애플리케이션에는 `input`, `output`, `mapper` 및 `reducer` 파라미터가 필요합니다. 다음 표에서는 이 파라미터와 다른 선택적 파라미터를 설명합니다.


| 파라미터 | 설명 | 필수 | 
| --- | --- | --- | 
| -입력 |  Amazon S3에서 입력 데이터의 위치. 유형: 문자열 기본값: None 제약 조건: URI 프로토콜을 지정하지 않으면 클러스터의 기본 파일 시스템을 사용합니다.  | 예 | 
| -출력 |  Amazon EMR이 처리된 데이터를 업로드하는 Amazon S3의 위치. 유형: 문자열 기본값: None 제약 조건: URI 기본값: 위치를 지정하지 않으면 Amazon EMR이 `input`에서 지정하는 위치로 데이터를 업로드합니다.  | 예 | 
| -mapper |  mapper 실행 파일의 이름. 유형: 문자열 기본값: None  | 예 | 
| -reducer |  reducer 실행 파일의 이름. 유형: 문자열 기본값: None  | 예 | 
| -cacheFile |  주로 성능 향상을 위해 Hadoop이 로컬 작업 디렉터리에 복사할 파일이 들어있는 Amazon S3의 위치. 유형: 문자열 기본값: None 제약 조건: [URI]\$1[작업 디렉터리에 생성할 symlink 이름]   | 아니요 | 
| -cacheArchive |  작업 디렉터리에 추출할 JAR 파일 유형: 문자열 기본값: None 제약 조건: [URI]\$1[작업 디렉터리에 생성할 symlink 디렉터리 이름]   | 아니요 | 
| -combiner |  결과를 결합 유형: 문자열 기본값: None 제약 조건: Java 클래스 이름  | 아니요 | 

다음 코드 샘플은 Python으로 작성된 mapper 실행 파일입니다. 이 스크립트는 WordCount 샘플 애플리케이션의 일부입니다.

```
 1. #!/usr/bin/python
 2. import sys
 3. 
 4. def main(argv):
 5.   line = sys.stdin.readline()
 6.   try:
 7.     while line:
 8.       line = line.rstrip()
 9.       words = line.split()
10.       for word in words:
11.         print "LongValueSum:" + word + "\t" + "1"
12.       line = sys.stdin.readline()
13.   except "end of file":
14.     return None
15. if __name__ == "__main__":
16.   main(sys.argv)
```

# 스트리밍 단계 제출
<a name="CLI_CreateStreaming"></a>

이 섹션에서는 클러스터에 스트리밍 단계를 제출하는 기본 사항을 설명합니다. 스트리밍 애플리케이션은 표준 입력에서 입력을 읽은 다음 각 입력에 대해 스크립트 또는 실행 파일(매퍼라고 함)을 실행합니다. 각 입력의 결과는 일반적으로 하둡 분산 파일 시스템(HDFS) 파티션에 로컬로 저장됩니다. 모든 입력이 mapper에 의해 처리된 후 두 번째 스크립트 또는 실행 파일(reducer라고 함)이 mapper 결과를 처리합니다. reducer의 결과는 표준 출력으로 전송됩니다. 한 단계의 출력이 다른 단계의 입력이 되는 일련의 스트리밍 단계를 함께 연결할 수 있습니다.

mapper와 reducer는 각각 파일로 참조되거나 사용자가 Java 클래스를 제공할 수 있습니다. Ruby, Perl, Python, PHP 또는 Bash를 비롯한 지원되는 언어로 mapper 및 reducer를 구현할 수 있습니다.

## 콘솔을 사용하여 스트리밍 단계 제출
<a name="emr-dev-create-stream-console"></a>

이 예제는 Amazon EMR 콘솔을 사용하여 스트리밍 단계를 실행 중인 클러스터에 제출하는 방법을 설명합니다.

**스트리밍 단계를 제출하는 방법**

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) Amazon EMR 콘솔을 엽니다.

1. **클러스터 목록**에서 클러스터의 이름을 선택합니다.

1. **단계** 섹션으로 스크롤하여 섹션을 확장한 후 **단계 추가**를 선택합니다.

1. **단계 추가** 대화 상자에서 다음을 수행합니다.
   + **Step type(단계 유형)**에서 **Streaming program(스트리밍 프로그램)**을 선택합니다.
   + **Name(이름)**에서 기본 이름(Streaming program)을 수락하거나 새 이름을 입력합니다.
   + **Mapper(매퍼)**에서 하둡의 매퍼 클래스 위치 또는 매퍼 실행 파일(예: Python 프로그램)이 있는 S3 버킷을 입력하거나 찾습니다. 경로 값은 *BucketName*/*path*/*MapperExecutable* 형식이어야 합니다.
   + **Reducer**에서 하둡의 reducer 클래스 위치 또는 reducer 실행 파일(예: Python 프로그램)이 있는 S3 버킷을 입력하거나 찾습니다. 경로 값은 *BucketName*/*path*/*MapperExecutable* 형식이어야 합니다. Amazon EMR은 특수 *aggregate* 키워드를 지원합니다. 자세한 내용은 Hadoop에서 제공하는 Aggregate 라이브러리를 참조하세요.
   + **Input S3 location(입력 S3 위치)**에서 입력 데이터의 위치를 입력하거나 찾아봅니다.
   + **출력 S3 위치**에서 Amazon S3 출력 버킷의 이름을 입력하거나 찾아봅니다.
   + **인수**에서 필드를 비워 둡니다.
   + **실패 시 작업**에서 기본 옵션(**계속**)을 그대로 사용합니다.

1. **추가**를 선택합니다. 단계가 콘솔에 [Pending] 상태로 나타납니다.

1. 단계의 상태는 단계가 실행됨에 따라 대기 중에서 실행 중을 거쳐 완료됨으로 바뀝니다. 상태를 업데이트하려면 Actions(작업) 열 위의 **Refresh(새로 고침)** 아이콘을 선택합니다.

## AWS CLI
<a name="emr-dev-create-stream-cli"></a>

이 예제에서는를 사용하여 클러스터 AWS CLI 를 생성하고 스트리밍 단계를 제출하는 방법을 보여줍니다.

**를 사용하여 클러스터를 생성하고 스트리밍 단계를 제출하려면 AWS CLI**
+ 를 사용하여 클러스터를 생성하고 스트리밍 단계를 제출하려면 다음 명령을 AWS CLI입력하고 *myKey*를 EC2 키 페어의 이름으로 바꿉니다. `--files`에 대한 인수는 스크립트 위치에 대한 Amazon S3 경로여야 하고, `-mapper` 및 `-reducer`에 대한 인수는 해당 스크립트 파일의 이름이어야 합니다.

  ```
  aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 --applications Name=Hue Name=Hive Name=Pig --use-default-roles \
  --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \
  --steps Type=STREAMING,Name="Streaming Program",ActionOnFailure=CONTINUE,Args=[--files,pathtoscripts,-mapper,mapperscript,-reducer,reducerscript,aggregate,-input,pathtoinputdata,-output,pathtooutputbucket]
  ```
**참고**  
가독성을 위해 Linux 줄 연속 문자(\$1)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

  `--instance-groups` 파라미터를 사용하지 않고 인스턴스 수를 지정하면 단일 마스터 노드가 시작되고 나머지 인스턴스는 코어 노드로 시작됩니다. 모든 노드에는 이 명령에 지정된 인스턴스 유형이 사용됩니다.
**참고**  
Amazon EMR 서비스 역할과 EC2 인스턴스 프로파일을 아직 생성하지 않았다면 `emr create-default-roles` 하위 명령을 입력하기 전에 aws `create-cluster`를 입력하여 생성합니다.

  에서 Amazon EMR 명령을 사용하는 방법에 대한 자세한 내용은 섹션을 AWS CLI참조하세요[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr).

# 사용자 지정 JAR로 데이터 처리
<a name="UseCase_CustomJar"></a>

사용자 지정 JAR은 Amazon S3에 업로드할 수 있는 컴파일된 Java 프로그램을 실행합니다. 시작하려는 Hadoop의 버전에 맞게 프로그램을 컴파일하고 Amazon EMR `CUSTOM_JAR` 단계를 제출해야 합니다. JAR 파일 컴파일에 대한 자세한 내용은 [Amazon EMR을 사용하여 바이너리 빌드](emr-build-binaries.md) 섹션을 참조하세요.

Hadoop MapReduce 애플리케이션 빌드 방법에 대한 자세한 내용은 Apache Hadoop 설명서에서 [MapReduce Tutorial](http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)을 참조하세요.

**Topics**
+ [사용자 지정 JAR 단계 제출](emr-launch-custom-jar-cli.md)

# 사용자 지정 JAR 단계 제출
<a name="emr-launch-custom-jar-cli"></a>

사용자 지정 JAR은 Amazon S3에 업로드할 수 있는 컴파일된 Java 프로그램을 실행합니다. 시작하려는 Hadoop의 버전에 맞게 프로그램을 컴파일하고 Amazon EMR `CUSTOM_JAR` 단계를 제출해야 합니다. JAR 파일 컴파일에 대한 자세한 내용은 [Amazon EMR을 사용하여 바이너리 빌드](emr-build-binaries.md) 섹션을 참조하세요.

Hadoop MapReduce 애플리케이션 빌드 방법에 대한 자세한 내용은 Apache Hadoop 설명서에서 [MapReduce Tutorial](http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)을 참조하세요.

이 섹션에서는 Amazon EMR에서 사용자 지정 JAR 단계 제출의 기본 사항을 다룹니다. 사용자 지정 JAR 단계를 제출하면 Java 프로그래밍 언어를 사용하여 데이터를 처리하기 위한 스크립트를 작성할 수 있습니다.

## 콘솔을 사용하여 사용자 지정 JAR 단계 제출
<a name="ConsoleCreatingaCustomJARJob"></a>

이 예제는 Amazon EMR 콘솔을 사용하여 사용자 지정 JAR 단계를 실행 중인 클러스터에 제출하는 방법을 설명합니다.

**콘솔을 사용하여 사용자 지정 JAR 단계를 제출하는 방법**

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) Amazon EMR 콘솔을 엽니다.

1. **클러스터 목록**에서 클러스터의 이름을 선택합니다.

1. **단계** 섹션으로 스크롤하여 섹션을 확장한 후 **단계 추가**를 선택합니다.

1. **단계 추가** 대화 상자에서 다음을 수행합니다.
   + **Step type(단계 유형)**에서 **Custom JAR(사용자 지정 JAR)**을 선택합니다.
   + **Name(이름)**에서 기본 이름(Custom JAR)을 수락하거나 새 이름을 입력합니다.
   + **JAR S3 location(JAR S3 위치)**에서 JAR 파일의 위치를 입력하거나 찾아봅니다. JAR 위치는 S3에 대한 경로 또는 클래스 경로의 정규화된 Java 클래스일 수 있습니다.
   + **Arguments(인수)**에 필수 인수를 공백으로 구분된 문자열로 입력하거나 필드를 비워 둡니다.
   + **실패 시 작업**에서 기본 옵션(**계속**)을 그대로 사용합니다.

1. **추가**를 선택합니다. 단계가 콘솔에 [Pending] 상태로 나타납니다.

1. 단계의 상태는 단계가 실행됨에 따라 대기 중에서 실행 중을 거쳐 완료됨으로 바뀝니다. 상태를 업데이트하려면 Actions(작업) 열 위의 **Refresh(새로 고침)** 아이콘을 선택합니다.

## 를 사용하여 클러스터 시작 및 사용자 지정 JAR 단계 제출 AWS CLI
<a name="emr-dev-create-jar-cli"></a>

**클러스터를 시작하고를 사용하여 사용자 지정 JAR 단계를 제출하려면 AWS CLI**

클러스터를 시작하고를 사용하여 사용자 지정 JAR 단계를 제출하려면 `--steps` 파라미터와 함께 `create-cluster` 하위 명령을 AWS CLI입력합니다.
+ 클러스터를 시작하고 사용자 지정 JAR 단계를 제출하려면 다음 명령을 입력하고 *myKey*를 EC2 키 페어의 이름으로 바꾸며 *amzn-s3-demo-bucket*을 버킷 이름으로 바꿉니다.

  ```
  aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 \
  --applications Name=Hue Name=Hive Name=Pig --use-default-roles \
  --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \
  --steps Type=CUSTOM_JAR,Name="Custom JAR Step",ActionOnFailure=CONTINUE,Jar=pathtojarfile,Args=["pathtoinputdata","pathtooutputbucket","arg1","arg2"]
  ```
**참고**  
가독성을 위해 Linux 줄 연속 문자(\$1)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

  `--instance-groups` 파라미터를 사용하지 않고 인스턴스 수를 지정하면 단일 프라이머리 노드가 시작되고 나머지 인스턴스는 코어 노드로 시작됩니다. 모든 노드에서 이 명령에 지정한 인스턴스 유형을 사용합니다.
**참고**  
Amazon EMR 서비스 역할과 EC2 인스턴스 프로파일을 아직 생성하지 않았다면 `aws emr create-default-roles` 하위 명령을 입력하기 전에 `create-cluster`를 입력하여 생성합니다.

  에서 Amazon EMR 명령을 사용하는 방법에 대한 자세한 내용은 섹션을 AWS CLI참조하세요[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr).

## 타사 종속성
<a name="emr-custom-jar-dependency"></a>

때로는 프로그램과 함께 사용하기 위해 MapReduce 클래스 경로 JAR에 포함할 필요가 있을 수 있습니다. 이 작업에는 두 가지 옵션이 있습니다.
+ [를 사용하여 클러스터 시작 및 사용자 지정 JAR 단계 제출 AWS CLI](#emr-dev-create-jar-cli)의 절차의 경우 `--libjars s3://URI_to_JAR`을 단계 옵션에 포함합니다.
+ `mapred-site.xml`에서 수정된 `mapreduce.application.classpath` 설정을 사용하여 클러스터를 시작합니다. `mapred-site` 구성 분류를 사용하세요. 를 사용하는 단계를 사용하여 클러스터를 생성하려면 다음과 AWS CLI같습니다.

  ```
  aws emr create-cluster --release-label emr-7.12.0 \
  --applications Name=Hue Name=Hive Name=Pig --use-default-roles \
  --instance-type m5.xlarge --instance-count 2  --ec2-attributes KeyName=myKey \
  --steps Type=CUSTOM_JAR,Name="Custom JAR Step",ActionOnFailure=CONTINUE,Jar=pathtojarfile,Args=["pathtoinputdata","pathtooutputbucket","arg1","arg2"] \
  --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json
  ```

  `myConfig.json`:

  ```
  [
      {
        "Classification": "mapred-site",
        "Properties": {
          "mapreduce.application.classpath": "path1,path2"
        }
      }
    ]
  ```

  쉼표로 구분된 경로 목록을 각 작업의 JVM 클래스 경로에 추가해야 합니다.