오픈소스/Spark
Spark numPartitions
pastime
2024. 5. 11. 03:23
728x90
Spark 에서 Query를 날릴때 한번에 많은 양을 가져오면 OOM 이나 시간등을 체크해야하는데
설정시, query에 where 절로 나눠서 호출을 한다
라는 내용만 있고 구체적으로 어떻게 동작하는지 확인하기 위함.
테스트를 위해 약 100GB의 데이터 셋을 준비
val dbProperties = new java.util.Properties()
dbProperties.setProperty("user", "root")
dbProperties.setProperty("password", "mysql")
dbProperties.setProperty("driver", "com.mysql.cj.jdbc.Driver") // Specify the JDBC driver
dbProperties.setProperty("partitionColumn", "idx")
dbProperties.setProperty("lowerBound", "1")
dbProperties.setProperty("upperBound", "1000000")
dbProperties.setProperty("numPartitions", "10")
추가된 값들의 경우 where절의 ID값을 위한 partitionColumn
해당 ID값의 범위를 의미하는 lowerBound, upperBound 이는 실제 업무 환경에서 할려면
select min(id), max(id) from table_name
where 날짜 범위
이런식으로 하여 변수에 할당한뒤 사용하면 좋을것같다
추가적으로 해당 Bound range를 몇개의 task 로 작업할지 설정을 위한 numPartitions다
이또한 위의 min, max 값을 통해 20만개 등으로 나누어서 적절한 task로 분리하면 좋을것같다
이게 실제로 동작하는지 확인하기 위해 2가지를 확인했다
1. 로그 레벨을 DEBUG 로 출력하여 확인
2. 실제 DB에 쿼리를 보기위한 query history 확인
그리고 이게 실질적으로 퍼포먼스 확인을 위한 실행 시간
디버그를 통해 확인을 해보면 이러한 메시지가 나온다
Number of partitions: 10, WHERE clauses of these partitions: `idx` < 100001 or `idx` is null, `idx` >= 100001 AND `idx` < 200001, `idx` >= 200001 AND `idx` < 300001, `idx` >= 300001 AND `idx` < 400001, `idx` >= 400001 AND `idx` < 500001, `idx` >= 500001 AND `idx` < 600001, `idx` >= 600001 AND `idx` < 700001, `idx` >= 700001 AND `idx` < 800001, `idx` >= 800001 AND `idx` < 900001, `idx` >= 900001
idx를 위의 numPartiotions를 통해 where절에 idx값을 구분해서 호출
실제 쿼리 히스토리를 통해 Query를 나눠서 호출하는 것을 확인
실행에 걸리는 시간
numPartitions를 1과 10으로 했을때 약 17초의 차이를 확인할 수 있다.
728x90