개발/AWS EMR on EKS

[EMR on EKS] spark timezone 설정

무아몽중 2024. 2. 1. 01:37
728x90

안녕하세요?

 

EMR on EKS에서 spark job을 제출하다보면 timezone이 기본적으로 UTC로 설정되어 있는 것을 확인할 수 있습니다. timezone이 UTC로 되어 있더라도 python, scala 등의 코딩 시 timezone을 KST로 설정해도 충분하지만, 일일히 모든 datetime에 다 설정을 하는 것이 여간 귀찮은 것이 아닙니다. 

 

그렇기 때문에, 여기서는 os level에서 기본 timezone을 변경하여 코드의 수정 없이 timezone을 바꿀 수 있는 방법에 대해서 알아보겠습니다. 

 

EMR one EKS 

 

우선, 여기서는 EMR on EKS에 대한 기본 설명 및 설치과정에 대해서는 생략하도록 하겠습니다.

 

EMR on EKS spark custom image

 

spark conf에 아래 설정을 추가하여 timezone을 설정하는 것은 spark sql에서의 timezone 변경은 가능합니다.

 

"spark.sql.session.timeZone": "Asia/Seoul",

 

다만, spark sql이 아닌 spark application 코드 레벨에서는 적용이 되지 않습니다.

(위 설정에서도 명시적으로 'spark.sql' prefix가 붙어져 있네요..)

 

os level 까지 기본 timezone을 변경하기 위해서는, 말 그대로 os level에서의 수정이 필요하며 이것을 수행하기 위해서는 spark image를 custom 하게 만들어야만 합니다. 

 

EMR on EKS에서 spark image를 custom 하게 사용하기 위한 절차로는 아래 AWS Document에 설명이 되어 있습니다

 

https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html

.

위 문서에서 모든 부분을 볼 필요는 없이, 아래 Dockerfile을 빌드해서 이미지를 제작하시면 됩니다.

 

# 원하는 버전 및 region 으로 수정하면 됩니다.
# 아래 사이트에서 region에 맞는 base image를 선택하시면 됩니다.
# https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html
FROM 996579266876.dkr.ecr.ap-northeast-2.amazonaws.com/spark/emr-6.6.0:latest
USER root
### Add customization commands here ####
# timezone을 설정하는 부분은 아래 부분 입니다.
RUN yum reinstall -y tzdata
ENV TZ=Asia/Seoul
RUN rm /etc/localtime
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
###
USER hadoop:hadoop

 

위 Dockerfile을 이미지로 제작하고 ECR 등 원하는 레지스트리에 이미지를 푸쉬하시면 됩니다.

 

EMR on EKS spark image 설정

 

이제, 위에서 푸쉬한 이미지를 EMR on EKS에서 spark image로 설정을 하면 됩니다. 저는 spark를 EKS의 spark CRD(Custom Resource Definition)으로 배포하는 것이 아니라, JEG(Jupyter Enterprise Gateway)를 사용하기 때문에 JEG에서 spark image를 바꾸는 설정은 아래와 같습니다. 

 

....
# jeg 설정 중 발췌

"classification": "jupyter-kernel-overrides",
"configurations": [
    {
        "classification": "spark-python-kubernetes",
        "properties": {
            "container-image": "<앞서 푸쉬된 spark image tag>"
        }
    },
    
....

 

위 설정을 적용하여 JEG를 다시 배포 후 spark job을 제출해서 datetime을 출력하면 정상적으로 KST로 표시가 되는 것을 확인할 수 있습니다. 

 

오늘은, EMR on EKS에서 spark job의 timezone 바꾸는 방법에 대해서 알아봤는데요. 다뤄야 하는 내용이 너무나도 방대하다 보니, 대부분의 내용은 알고 있다는 가정하에 생략하고 timezone 설정과 관련된 부분만 다뤘는데요. 

 

좀 더 자세히 설명을 해주기를 원하시는 부분이 있을 시에는 댓글로 남겨주시면 추가적으로 내용을 작성하도록 하겠습니다. 

 

다음에는 EMR on EKS에 대한 기본 소개를 하는 내용도 다뤄보도록 하겠습니다.