스파크에서 분산 병렬처리를 위해서
Partition에 대한 이해는 필수
스파크 작업의 가장작은 단위는 task다 그리고 task는 1개의partition이다
1 task == 1 partition
task는 core에 할당되고 이 core들의 집합은 1개의 executor가 담당한다
(보통 spark에서는 1~5개를 1개의 executor에 할당한다 그 이상은 경험적으로 spark성능에 좋지 않은 영향을 준다.)
※ 단 core != task 명심해라.
spark.task.cpus 설정 옵션을 보면
Number of cores to allocate for each task.라고 설명 되어있다. 즉 task한개에 여러개의 core가 붙을 수 도 있다.
하지만 기본값은 1이다 즉 1개의 task에 기본적으로 1개의 core가 사용된다.
파티션은 스파크의 데이터프레임의 물리적으로 분산되는 방식을 나타낸다.
만약 수백개의 executor가 있다 하더라도 partition이 1개면 병렬처리가 진행이 안된다.
task가 1개씩 진행되며 여기저기 executor를 돌아 다니며 작업이 진행될수도 있고, 그냥 1개의 executor 1개의 core에서 모든 task를 다 처리 할수도 있다.
중요한 것은 병렬처리가 아니라 1개의 작업 1개의 프로세스로 돌아간다는 것.
Input partition
input partion이란 file의 i/o 에 쓰이는 파티션이다
df = spark.read.load("examples/src/main/resources/users.parquet")
df.select("name", "favorite_color").write.save("namesAndFavColors.parquet")
다음과 같이 파케이 혹은 csv등 파일을 읽어올때 사용된다.
spark.sql.files.maxpartitionBytes
위 옵션을 이용해 지정할수 있으며 기본 값은 128MB이다.
Suffle partition
spark에서 가장중요한 partition이다.
이 파티션은 join, groupBy같은 spark의 핵심 작업에 사용된다. 보통 셔플링이 일어난다고 하는 작업에 사용되는 파티션이다.
spark.default.parallelism
spark.sql.shuffle.partitions
위의 옵션을 이용해 지정할 수 있다.
Out partition
완성된 spark결과를 file및 다른 방법으로 저장할 때 사용되는 partition이다.
repartition()
coalesce()
두가지 Dataframe의 instance 함수로 사용되며 repartition의 경우 partition을 늘리거나 줄일 수 있지만 셔플이 일어난다.
반대로 coalesce의 경우 셔플이 안일어나지만 partition을 줄일 수 만 있다.
Reference
'spark' 카테고리의 다른 글
spark 와 db연동 하기 (0) | 2025.01.22 |
---|---|
spark memory 관리 (0) | 2024.02.27 |
Repartiotion 방법 (0) | 2024.02.16 |
자주사용되는 spark config (0) | 2024.02.13 |
Spark 설치하기 in Linux - ubuntu (0) | 2023.12.22 |