데이터 라이프 사이클 관리를 위해 실제 데이터가 사용이 되는 지를 추적하고자 spark history server 에서 /applications/[app-id]/sql 방식으로 정리된 데이터를 바탕으로 실제 데이터 사용 여부를 추적하고 있었다.
emr on eks를 적용한 이후로 spark history server 도 일회성으로 사라지고 있어서 자체 spark history server를 띄워서 사용하고 있었는데, 이렇게 사용할 경우 위의 api를 사용하면 event log가 클 경우에 서버에 과부하가 가게 되면서 추출에 어려움이 생겼다.
그래서 해결 방안으로 적재된 event log에서 직접 데이터를 추출해보는 것을 목표로 하였다.
실제 사용된 이벤트에 대해 정리
event log 구조는 여러 json 형식의 나열로 되어있고 공통적으로 Event 키에 각 이벤트 이름이 값으로 주어지는 데, 이 값에 따라 파싱 로직을 가져가면 분석이 가능하다.
1. org.apache.spark.sql.execution.ui.SparkListenerSQLExecutionStart
spark 쿼리가 실제로 시작됐을 때의 데이터로 실행 계획에 대한 주요 정보들이 담겨 있다. 실제 사용한 class명, 실행 계획, 시작 시간, 노드 정보를 추출할 수 있다.
여기서 노드 정보가 어떤 일을 했는 지에 대한 정보가 매우 깊에 nested하게 담겨 있어서 이걸 쉽게 사용하려면 flatten 처리를 할 필요가 있다.
2. org.apache.spark.sql.execution.ui.SparkListenerSQLExecutionEnd
주요한 데이터는 별로 없고 종료 시각과 성공여부를 알 수 있어서 실제 해당 쿼리가 얼마나 걸렸는 지 용으로만 사용했다.
3. org.apache.spark.sql.execution.ui.SparkListenerDriverAccumUpdates
SparkListenerSQLExecutionStart 에서 추출한 노드 정보에서는 각 노드에서 어떤 일을 했는 지에 대한 정보가 담겨있는 실질적인 수치는 담겨있지 않아서 여기서 각 노드 id 및 accumulator_id 를 기준으로 결합을 해서 수치 추출이 가능하다.
이런 형식으로 데이터를 추출 정제하여 스캔 데이터 및 스캔양을 확인하고자 하였다.
(완벽하지 않고 틀린 부분이 있을 순 있음)
'Programming > Tip&Informaion' 카테고리의 다른 글
[go/gin] log에 request, response 출력하기 (0) | 2025.03.26 |
---|---|
[log4j2] log4j2 설정법 및 spark operator 연동 (feat. datahub 로깅) (0) | 2024.10.18 |
[Spark] spark history server 띄울 때, iam 권한으로 s3 읽기 (0) | 2024.05.31 |
[실수노트] aws에서 여러 eks cluster에서 karpenter 운영 시 실수 (0) | 2024.04.18 |
knative/istio activator 종료 및 재실행 현상 (0) | 2024.02.19 |