이 포스팅은 ⟪러닝 스파크(2판)⟫(제이펍, 2022년)을 공부하면서 정리한 내용입니다.
*Spark 설정 세팅 방법
1. 파일 수정 방법
우선 기본적으로 설정파일은 spark가 다운되어 있는 폴더의 conf안에 .template형식으로 저장되어 있다. 이 파일을 수정하고 .template부분을 지우고 저장하면 spark가 새로운 값을 인식한다.
2. 프로그래밍 방법
>>>spark.conf.isModifiable("spark.sql.shuffle.partitison") #수정가능한 설정필드인지 확인
>>>spark.conf.get("spark.sql.shuffle.partitions") #현재필드 값 확인
>>>spark.conf.set("spark.sql.shuffle.partitions", 5) # 필드값 변경
설정값을 변경하기 위해서 먼저 .isModifiale()을 사용하여 true라는 출력값을 얻어야 변경가능한 필드이다. 다른 설정값도 변경하고 싶다면 예시에서 spark.sql.shuffle.partitions 부분만 수정하여 사용하면 된다.
*SQL설정 확인 방법
spark.sql("SET -v").select("key", "value").show()
sql에 대한 설정을 확인하기 위해서는 위의 코드를 사용하면 된다. 여기서 spark는 이전에 만든 SparkSession이다.
*정적 vs 동적 자원 할당
- 정적 할당 : spark-submit을 할때 자원량을 지정 (자원의 제한을 두고 싶을 때 사용)
- 동적 할당 : 워크로드가 급격하게 증가하거나 줄더라도 효율적으로 관리할 수 있음. (주로 스트리밍 데이터를 처리할 때 사용)
동적 할당 드라이버 옵션 | 설명 |
spark.dynamicAllocation.enabled | true/false 로 동적 할당을 사용할지 말지 설정하는 옵션 |
spark.dynamicAllocation.minExecutors | 이그제큐터 최소 개수 설정 옵션 |
spark.dynamicAllocation.schedulerBacklogTimeout | 백로그가 늘어나면 설정 시간이 될 때마다 새로운 이그제큐터 요청 |
spark.dynamicAllocation.maxExecutors | 이그제큐터 최대 개수 설정 옵션 |
spark.dynamicAllocation.executorIdleTimeout | 이그제큐터가 설정 시간동안 휴식 상태이면 중지 |
*이그제큐터 메모리와 셔플 서비스 설정
*이그제큐터 메모리 설정 방법
이그제큐터의 사용 가능 메모리는 spark.executor.memory을 사용하여 설정 할 수 있고 이그제큐터 메모리 구성은 기본 비율은 실행 메모리(60%), 저장 메모리(40%) , 예비 메모리 300MB로 구성된다.
*맵, 셔플 작업 최적화 추천치
맵, 셔플 작업시 스파크는 큰 I/O작업이 발생할 수 있는데 기본 설정은 이 경우 병목현상이 발생할 수 있다. 그렇기 때문에 최적화 추천치를 정리해보려고 한다.
설정 이름 | 설명 |
spark.driver.memory | 기본값은 1g, collect()와 같은 함수를 사용하게 되면 메모리가 부족할 수 있으므로 적절하게 조정해야 한다. |
spark.shuffle.file.buffer | 기본값은 32KB, 1MB 추천, 맵 결과를 디스크에 쓰기 전 버퍼링 조정 |
spark.file.transferTo | 기본값은 true, false를 설정하면 디스크에 쓰기 전 파일 버퍼를 사용하여 I/O횟수를 줄일 수 있다. |
spark.shuffle.unsafe.file.output.buffer | 기본값은 32KB, 셔플 작업 중 파일을 병합할 때 사용 일반적으로 큰 대용량 워크로드에는 1MB가 적당하다. 작은 워크로드에는 기본값도 잘 동작 |
spark.io.compression.lz4.blockSize | 기본값은 32KB, 512KB로 올리기를 권장. 압축하는 블록 단위 크게 함으로써 셔플 파일 크기 줄일 수 있음. |
spark.shuffle.service.index.cache.size | 기본값 100mb, 캐시되는 엔트리들 개수는 지정 메모리 용량에 따라 제한 |
spark.shuffle.registration.timeout | 기본값은 5000ms, 120000ms이 좋다. 셔플 서비스 등록을 위한 최대 대기 시간이다. |
spark.shuffle.registration.maxAttempts | 기본값은 3, 필요하면 5 정도로 올릴것. 셔플 서비스 등록 실패 재시도 횟수를 설정 |
*spark 파티션 설정
*한개의 파티션의 크기 설정
- spark.conf.set("spark.sql.files.maxPartitionBytes",bytes) 을 사용하여 파티션 크기를 변경 가능 (기본값 128MB)
- 파일 크기가 128MB보다 작으면 파일 자체가 파티션 1개가 된다.
*coalesce(), repartition()
- 기존에 설정한 파티션의 개수가 적합하지 않을때 사용하여 파티션의 수를 늘리거나 줄임
- coalesce()는 파티션을 줄일때 repartition()은 파티션을 늘릴때 주로 사용
'프로그래밍 > Spark' 카테고리의 다른 글
[Spark] Spark 스트리밍 쿼리 (0) | 2022.11.28 |
---|---|
[spark] 캐싱, 영속화, 조인 (0) | 2022.11.23 |
pyspark mysql 연동 (feat.docker) (0) | 2022.11.21 |
[Spark] sql + 데이터프레임 읽고 쓰기 (0) | 2022.11.17 |
Spark 정형화 api (0) | 2022.11.15 |