PySpark 로 파이프라인을 짤 때 같은 DataFrame 을 여러 번 쓰거나 긴 변환 사슬을 끊어야 하는 상황이 자주 생긴다. 중간 결과를 재활용하는 네 가지 방법(cache/persist, TempView, 파일 저장, checkpoint)을 용도별로 정리하고, CDP 환경에서 Impala 로 만든 Kudu 테이블을 Spark 로 읽는 방법을 덧붙인다.
같은 DataFrame 을 두 번 이상 쓰면 중복 연산을 막기 위해 캐싱한다. cache() 는 MEMORY_AND_DISK 로 저장하고, persist() 는 저장 위치를 직접 고른다. 둘 다 지연 평가라 첫 Action(예: count()) 시점에 실제로 캐싱된다.
from pyspark import StorageLevel
df = spark.read.parquet("large_data.parquet")
df.persist(StorageLevel.MEMORY_AND_DISK) # 권장: 메모리 부족 시 디스크로
df.count() # 이 시점에 캐싱 수행
# ... 반복 사용 ...
df.unpersist() # 다 쓰면 해제
StorageLevel 은 MEMORY_ONLY(가장 빠르나 OOM 위험), MEMORY_AND_DISK(권장), DISK_ONLY, MEMORY_ONLY_2(복제) 등이 있다.
DataFrame 을 임시 뷰로 등록하면 spark.sql() 로 질의할 수 있다. createOrReplaceTempView 는 현재 세션에서만, createOrReplaceGlobalTempView 는 앱 내 모든 세션에서 global_temp 스키마로 접근된다. 세션·앱 종료 시 자동 삭제된다.
df.createOrReplaceTempView("user_data")
spark.sql("SELECT city, COUNT(*) FROM user_data WHERE age > 30 GROUP BY city").show()
대용량 중간 결과는 Parquet·Delta 로 써 두고 다시 읽는다. 세션을 넘겨 보존되고 용량 제한이 없다.
df_processed.write.mode("overwrite").parquet("/tmp/processed_data")
df_reload = spark.read.parquet("/tmp/processed_data")
변환 사슬(lineage)이 너무 길어 스택 오버플로 위험이 있으면 checkpoint() 로 lineage 를 끊는다.
spark.sparkContext.setCheckpointDir("/tmp/checkpoints")
df_checkpointed = df_complex.checkpoint()
| 방법 | SQL | 세션 유지 | 용도 |
|---|---|---|---|
| cache / persist | 불가 | 불가 | 반복 재사용하는 DataFrame |
| TempView | 가능 | 불가 | SQL 로 다루고 싶을 때 |
| 파일 저장 | 가능 | 가능 | 중간 결과 보존 |
| checkpoint | 불가 | 가능 | 긴 lineage 끊기 |
핵심 원칙은 같은 DataFrame 을 두 번 이상 쓰면 반드시 cache()·persist() 를 걸어 중복 연산을 막는 것이다.
Kudu 는 기본적으로 Hive Metastore 에 등록되지 않아 순수 Spark 의 spark.sql() 로는 바로 읽히지 않는다. CDP 는 Impala 로 만든 Kudu 테이블을 HMS 에 등록해 주므로 조건이 맞으면 SQL 이 통한다.
가장 범용적인 방법은 kudu-spark 커넥터로 읽어 TempView 로 등록하는 것이다. CDP 에서 Kudu 테이블명은 impala::데이터베이스.테이블 형식을 쓴다.
df = (spark.read.format("kudu")
.option("kudu.master", "<kudu-master-host>:7051")
.option("kudu.table", "impala::database_name.table_name")
.load())
df.createOrReplaceTempView("my_table")
spark.sql("SELECT * FROM my_table LIMIT 10").show()
Impala 로 만든 Kudu 테이블이 HMS 에 등록돼 있으면 enableHiveSupport() 만으로도 인식될 수 있고, CDP 공식 권장 방식은 HiveWarehouseConnector(HWC)다. Kudu Master 주소는 Cloudera Manager 의 Kudu 서비스에서 확인하거나 호스트의 /etc/kudu/conf/master.addresses 를 본다. 테이블을 못 찾으면 HMS 연동·Ranger 권한·kudu-spark jar 를 점검한다.