코알못

[AWS] EMR(hadoop) - Step Function 이용해보자! 본문

BIG DATA

[AWS] EMR(hadoop) - Step Function 이용해보자!

코린이s 2022. 4. 27. 17:55
728x90

EMR Step Function 은 내가 원하는 스크립트를 제출할 수 있는 기능이며 서버리스 서비스이다.

클러스터 생성시점 또는 생성후 단계탭에서 제출 가능하며, 쉽게 이용 가능하다.

기존에 배치의 경우 oozie 를 사용하였으나 step Function 으로도 배치 제출이 가능하여 이용해 보았으며 그 내용은 아래와 같다.

- 소요시간 : oozie, step 동일

- 한글 처리 : 온프레미스 환경에서 설치한 hadoop의 oozie 의 경우 한글 이슈가 없었으나 EMR oozie 이용시 한글 사용에 대한 이슈가 있었다. (hue 에서 정상적으로 저장, 읽기 가능하나 배치 실행 시키면 한글을 인식하지 못했다.)

그러나 step 사용시에는 한글에 대한 이슈가 발생하지 않았다.

- 관리 측면 : step 이 oozie보다 관리 측면에서 더 좋다고 판단했다. 그이유는 아래와 같다.

  • oozie 사용시 oozie 서비스에 대한 관리 + 스케쥴링 정보를 DB 로 관리하고 있어 DB 를 추가로 관리 해야함, 그러나 step 사용시에는 serverless 이므로 관리해야 할 부분이 없음
  • oozie 사용시 클러스터 기동도 사실상 배치이므로 (일정한 시간에 기동/중단) oozie 배치까지 두벌로 관리해야함, 그러나 step 사용시에는 클러스터 기동 시점이 곧 배치 시작 시점이므로 클러스터 배치만 관리하면 된다.

위와 같은 내용으로 step 을 사용하려고 했으며, 이는 저자의 판단이니 참고만 하고 각자 상황과 서비스에 맞게 더 나은 서비스를 선택하면 된다.

이제 step 을 이용하기 위한 두가지 기본 입력값에 대해 알아본다.

1. JAR 위치

- EMR 기본 jar 파일로 클러스터 내 명령 수행시 사용 : command-runner.jar (경로 안적어도 된다.)

- 클러스터 아닌 외부에서 명령 수행시 사용 : s3://<region>.elasticmapreduce/libs/script-runner/script-runner.jar

command-runner.jar 에서 제공하는 도구중 'hive-script' 는 하이브 쿼리 제출시 사용하는 도구이며 그 외 도구는 아래 공식 페이지에서 확인 하여 사용하면 된다.

- https://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/emr-commandrunner.html

2. 인수

인수의 경우 command-runner 이라면 제공하는 도구를 사용하여 아래와 같은 명령어를 입력하면 된다.

ex) hive-script --run-hive-script --hive-versions 3.1.2 --args -f s3://.../test.hql --hivevar DT=20220427

만약 script-runner.jar 이라면 스크립트 위치를 입력하면 된다.

ex) s3://...  or localfile Path

위에 정리한 글만 보면 대충 이해는 되나 예시를 보지 않으면 사실 정확하게 알기 어려우므로 실습을 통해 알아보자!

실행할 하이브 쿼리는 아래와 같다.

insert overwrite directory 's3a://test/user_favority_db_${DT}'
row format delimited
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
select 
*
from test;

이제 두가지 유형별로 실습 해본다!

1. command-runner.jar

단계 추가를 눌러 추가한다.

- JAR 위치 (명칭만 적으면 된다.) : command-runner.jar

- 인수 (실행할 도구 사용하여 명령어 제출) : hive-script --run-hive-script --hive-versions 3.1.2 --args -f s3://.../test.hql --hivevar DT=20220427

추가 되었음을 확인 할 수 있으며

완료시 로그 확인 및 경과 시간 확인 가능하다.

이제 정상적으로 만들어졌는지 확인 해보면 정상적으로 만들어졌으며

2. script-runner.jar

단계 제출하기를 눌러 아래와 같이 입력한다.

- JAR 위치 (서울 리전) : s3://ap-northeast-2.elasticmapreduce/libs/script-runner/script-runner.jar

- 인수 (실행할 스크립트) :  s3://emr-hong-script/hive/test/test.sh

제출할 스크립트(test.sh)는 아래와 같다.

date2=`date -d '1 days ago' +%Y%m%d`
echo $date2
hive-script --run-hive-script --hive-versions 3.1.2 --args -f s3://.../test.hql --hivevar DT=$date2

스크립트 안에 사용된 hive 쿼리(test.hql)는 아래와 같다.

insert overwrite directory 's3a://test/user_favority_db_${DT}'
row format delimited
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
select 
*
from test;

위와 같이 입력시 실제로 서버에서 실행되는 명령어는 아래와 같다.

1. s3 > 로컬에 script-runner.jar 이동
2. hadoop jar /mnt/var/lib/hadoop/steps/../script-runner.jar s3://../test.sh

제출 완료시 step 제출된 부분은 아래와 같이 확인 가능하다.

제출하고 스크립트 실행이 완료되면 아래와 같이 소요시간과 로그가 남는다. 실패해도 로그는 남으니 오류시 쉽게 트러블 슈팅이 가능하다.

실제로 s3 에 'user_favority_db_어제날짜' 로 파일 생성되었는지 확인 한다.

정상적으로 생성 되었으며

데이터도 정상적으로 만들어졌다.

728x90
Comments