본문 바로가기

Data Engineering/Apache Spark

[Spark] Apache Spark의 Hint에 대해서 알아보자 (Partitioning Hint 편) 🙋‍♂️

1. Spark의 Partition

RDD나 Dataset를 구성하고 있는 최소 단위. 각 파티션은 클러스터의 여러 노드에 분산되어 저장될 수 있으며, 익스큐터에 의해 병렬로 처리된다. 너무 작은 파티션은 네트워크 오버헤드를 증가시키고 너무 큰 파티션은 작업 효율성에 문제가 있기 때문에 주의해야한다.

 

Partition Key 란?

데이터를 파티션으로 분할하는 데 사용되는 열. 파티션 키를 지정할 때에는 고객 ID, 번호와 같이 카디널리티가 높은(중복도가 낮은) 값을 사용하지 않는 것이 좋다. 대신 데이터를 균일하게 나눌 수 있거나 필터 및 그룹화, 조인 작업에 주로 사용되는 값을 사용하는 것이 좋다.

 

 

2. Spark의 Hint

Spark SQL이 특정한 방식으로 실행 계획을 만들도록 사용자가 제안하는 것. 강제성을 가지지는 않는다.

 

✔ Partitioning Hint 의 종류

Type Comment  Parameter
COALESCE 전체 파티션의 수를 주어진 수로 줄이는 제안 시 사용 partition number
REPARTITION 파티션의 수를 주어진 수로 재파티셔닝 하는 제안 시 사용 partition number, column names (or both)
REPARTITION_BY_RANGE 파티션의 수를 주어진 수로 재파티셔닝 하는 제안 시 사용 column names, (optional) partition number

 

✔ Partitioning Hint 의 예시

-- dataframe을 5 파티션으로 나누고 파티션키는 attr 컬럼으로 설정한다.
SELECT /*+ REPARTITION(5, attr) */ * FROM t1

 

 

 

 REPARTITION과 REPARTITION_BY_RANGE의 차이

아래 스택오버플로우의 답변에 있는 예시를 가져와보았다. 값의 범위는 0부터 1000000까지이다.

 

- REPARTITION

df.repartition(4, col("value"))
+---------+------+---------+---------+
|partition|count |min_value|max_value|
+---------+------+---------+---------+
|0        |249911|12       |1000000  |
|1        |250076|6        |999994   |
|2        |250334|2        |999999   |
|3        |249680|0        |999998   |
+---------+------+---------+---------+

 

 

- REPARTITION_BY_RANGE

df.repartitionByRange(4, col("value"))
+---------+------+---------+---------+
|partition|count |min_value|max_value|
+---------+------+---------+---------+
|0        |244803|0        |244802   |
|1        |255376|244803   |500178   |
|2        |249777|500179   |749955   |
|3        |250045|749956   |1000000  |
+---------+------+---------+---------+

 

repartitionByRange 사용 시 파티션 내의 키 값 범위를 거의 균일하게 분산시킨다는 것을 알 수 있다.

 

 

 


참고 자료

 

Hints - Spark 3.5.1 Documentation

 

spark.apache.org

 

Spark: What is the difference between repartition and repartitionByRange?

I went through the documentation here: https://spark.apache.org/docs/latest/api/python/pyspark.sql.html It says: for repartition: resulting DataFrame is hash partitioned. for repartitionByRange:

stackoverflow.com

 

 

Everything you need to understand Data Partitioning in Spark

Cloud Native Technology Services & Consulting

statusneo.com