내가 보려고 만든 블로그
AWS Glue를 이용해 손쉽게 ETL 하기 본문
회사에서 사용하고 있는 앰플리튜드의 일부 로그데이터를 적재해야 하는 일을 맡게 되었다. 앰플리튜드에서 제공하는 기능 덕분에 데이터를 적재하는 것은 어렵지 않았으나, 데이터가 다음과 같이 1. 압축된 형태로 들어왔으며 2. complete이라는 파일이 같이 적재가 되어 Glue 크롤러를 통해 읽어올 수가 없었다.
ETL을 위해 새로 코드를 짜야 할 만큼 큰 작업은 아니기에 glue studio를 통해 간단하게 처리를 해보기로 하였다.
스파크 기반이며 클릭기반으로 ETL을 할 수 있도록 UI를 제공한다.
하지만 아직 베타서비스인지 ETL을 하며 2가지 버그를 발견하였다.
사용법은 매우 간단해서 Extract 해 올 디렉토리 , 저장할 공간 , 파일 타입등을 지정만 해주면 된다.
만일 추가적으로 코드를 손보고 싶으면 스크립트에 들어가서 직접 고칠 수 있다. 이 경우에는 대신 스파크에 대한 지식이 조금 필요하며 AWS 자체적으로 스파크를 변형시킨 GlueContext 에 대한 이해가 필요하다. 필자의 경우에는 두가지를 손을 보았다.
1. 데이터 타입오류 해결
# Script generated for node Custom transform
def MyTransform(glueContext, dfc) -> DynamicFrameCollection:
key = list(dfc.keys())[0]
dyf = dfc[key]
dyf = dyf.resolveChoice(specs=[("session_id", "cast:long")])
dyf = dyf.resolveChoice(specs=[("amplitude_id", "cast:long")])
dyf = dyf.resolveChoice(specs=[("event_properties", "cast:string")])
dyf = dyf.resolveChoice(specs=[("user_properties", "cast:string")])
return DynamicFrameCollection({"CustomTransform0": dyf}, glueContext)
데이터 타입을 추론하는데 버그가 존재한다. 앰플리튜드에서 데이터를 적재해올때 session_id라는 컬럼에 null 이 있을 경우 -1 이라는 값을 받아오는데 원래 세션아이디 값인 1234123432 와 -1 이 동시에 있을 경우 다른 데이터 타입으로 인식을 하는 오류가 있었다. 이를 해결 하기위해 강제적으로 데이터타입을 long으로 잡아줄수 있게 하였다. 방법은 aws의 api 문서를 참조하였다.
2. 파티션 설정.
def MyTransform2(glueContext, dyf) -> DynamicFrameCollection:
df = dyf.select(list(dyf.keys())[0]).toDF()
df_filtered = df.withColumn("p_ymd", F.date_format("client_event_time", "yyyyMMdd"))
dyf_filtered = DynamicFrame.fromDF(df_filtered, glueContext, "filter_votes")
return DynamicFrameCollection({"CustomTransform0": dyf_filtered}, glueContext)
파티션 기능을 제공하지만 회사에서 사용하는 포맷인 '20210101' 형태로 파티션을 설정하기 위하여 다음과 같이 코드를 추가하였다.
마지막으로 1,2를 거치게 되면 collection 형태로 타입이 변경되기 때문에 한번더 데이터타입을 변경해주는 부분이 필요하다.
# Script generated for node Select From Collection
SelectFromCollection_node1638532421943 = SelectFromCollection.apply(
dfc=Customtransform_node1638532098472,
key=list(Customtransform_node1638532098472.keys())[0],
transformation_ctx="SelectFromCollection_node1638532421943",
)
마지막으로 잡을 생성해주기만 하면 되고 과금 압박을 피하기 위해 작업하는 노드의 수를 제한해주면된다. 적절하게
작업을 생성하고 run 해보며 발견한 두번째 버그는 Glue 스튜디오에서 save를 하면 스크립트 전체가 바껴버리는 버그가 있다.
이를 피하기 위해 Glue Studio 대신 작업을 통해 아까 만들어논 스크립트를 복붙해주면 오류없이 잘 동작한다.
'Data Engineering > AWS' 카테고리의 다른 글
AWS Boto3 를 이용해 S3 내 파일 카피하기 (0) | 2021.12.26 |
---|