2024. 3. 18. 22:57ㆍData Engineering/Apache Spark
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
'Data Engineering > Apache Spark' 카테고리의 다른 글
[Spark] Apache Spark에 대해 알아보자 🙋♂️ (0) | 2024.03.15 |
---|---|
[Spark] Ubuntu 컨테이너에서 PySpark로 Amazon S3 데이터 읽어오기 (0) | 2024.02.02 |
[Spark] Apache Spark의 Execution Plan에 대해 알아보자 🙋♂️ (0) | 2023.11.10 |
[Spark] Docker Ubuntu 컨테이너에 Apache Spark를 설치해보자 (0) | 2023.09.06 |