스트리밍을 사용하여 데이터 처리 - Amazon EMR

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

스트리밍을 사용하여 데이터 처리

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을 참조하세요.

Hadoop 스트리밍 유틸리티 사용

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

Hadoop 프로세스
1

원하는 프로그래밍 언어로 mapper 및 reducer 실행 파일을 작성하십시오.

Hadoop 설명서의 지침에 따라 스트리밍 실행 파일을 작성하십시오. 프로그램은 표준 출력을 통해 표준 입력 및 출력 데이터에서 입력을 읽어야 합니다. 기본적으로 각 입력/출력 행은 레코드를 나타내며 각 행의 첫 번째 탭은 키와 값 사이의 구분 기호로 사용됩니다.

2

실행 파일을 로컬에서 테스트하여 Amazon S3에 업로드합니다.

3

Amazon EMR 명령줄 인터페이스 또는 Amazon EMR 콘솔을 사용하여 애플리케이션을 실행합니다.

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

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

파라미터 설명 필수
-입력

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]#[작업 디렉터리에 생성할 symlink 이름]

아니요
-cacheArchive

작업 디렉터리에 추출할 JAR 파일

유형: 문자열

기본값: None

제약 조건: [URI]#[작업 디렉터리에 생성할 symlink 디렉터리 이름]

아니요
-combiner

결과를 결합

유형: 문자열

기본값: None

제약 조건: Java 클래스 이름

아니요

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

#!/usr/bin/python import sys def main(argv): line = sys.stdin.readline() try: while line: line = line.rstrip() words = line.split() for word in words: print "LongValueSum:" + word + "\t" + "1" line = sys.stdin.readline() except "end of file": return None if __name__ == "__main__": main(sys.argv)