728x90
1. NullPointerException
문제 : NullPointerException은 null 값이 포함된 데이터를 처리할 때 발생할 수 있는 오류입니다. 이 오류는 데이터가 예상과 다를 때 발생합니다.
원인:
- 컬럼에
null값이 포함된 상태에서 연산을 시도할 때 발생 null값을 처리하지 않고 연산을 진행했을 때 발생
해결 방법:
na.fill()이나na.drop()을 사용하여null값을 처리- SQL에서
IS NULL또는COALESCE함수를 사용하여null값에 대해 처리
예시 코드:
# null 값을 처리하지 않고 계산을 시도할 때 오류 발생
df = spark.createDataFrame([(1, None), (2, 3)], ["a", "b"])
try:
df.select(df.a + df.b).show() # 오류 발생
except Exception as e:
print(f"Error: {str(e)}")
# null 값 처리 후 계산
df = df.na.fill({"b": 0}) # b 컬럼의 null 값을 0으로 채움
df.select(df.a + df.b).show()
2. org.apache.spark.SparkException: Task failed while writing rows.
문제 : 데이터를 파일로 저장하려고 할 때 오류가 발생하는 경우
원인:
- 저장할 때 파일 경로에 쓰기 권한이 없거나, 경로가 잘못 지정된 경우
- 데이터가 너무 커서 디스크 공간이 부족한 경우
해결 방법:
- 쓰기 권한이 있는 경로를 지정
- 디스크 공간을 확인하고, 필요 시 분산 파일 시스템(HDFS 등)을 사용
3. FileNotFoundException
문제 : Spark SQL에서 데이터를 읽으려고 할 때 파일이 존재하지 않는 경우 발생하는 오류
원인:
- 지정한 파일 경로가 잘못되었거나, 해당 파일 존재하지 않는 경우
해결 방법:
os.path.exists()와 같은 방법으로 파일 경로가 올바른지 확인- 경로를 절대 경로로 지정하거나, 올바른 경로를 사용
예시 코드:
# 메모리 설정 변경
import os
file_path = "non_existing_file.csv"
if not os.path.exists(file_path):
print(f"File {file_path} does not exist.")
else:
df = spark.read.csv(file_path)
df.show()
4. SparkException: Job aborted due to stage failure: Task not serializable
문제 : 직렬화할 수 없는 객체를 Spark 작업에 전달하려 할 때 발생
원인:
- Spark RDD 연산에서 직렬화할 수 없는 객체를 참조할 때 발생
- Spark는 클러스터의 각 노드에서 작업을 실행하므로, 그 객체가 직렬화되어 네트워크를 통해 전달 될 수 있어야 합니다.
해결 방법:
- 직렬화할 수 없는 객체를 제거하거나,
Seriaizable인터페이스를 구현 @transient애노테이션을 사용하여 작렬화하지 않을 객체를 지정
예시 코드:
class MyClass:
def __init__(self, value):
self.value = value
my_object = MyClass(10)
# 직렬화할 수 없는 객체를 RDD 작업에서 사용
try:
rdd = spark.sparkContext.parallelize([1, 2, 3]).map(lambda x: x + my_object.value) # 오류 발생
except Exception as e:
print(f"Error: {str(e)}")
# 직렬화 가능한 방식으로 수정
rdd = spark.sparkContext.parallelize([1, 2, 3]).map(lambda x: x + 10) # 수정 후 정상 실행
rdd.collect()
5. UnsupportedOperationException: Delta Lake operation not allowed
문제 : Data Lake 관련 작업을 시도했을 때 발생하는 오류
원인:
- Delta Lake를 사용하려면 Delta Lake 라이브러리를 추가
- Delta Lake 관련 작업을 수행할 때 적절한 구성 설정이 되어 있지 않은 경우
해결 방법:
- Delta Lake 라이브러리를 Spark 세션에 추가
- 적절한 설정을 사용하여 Delta Lake 테이블을 읽거나 쓸 수 있도록 합니다.
예시 코드:
from delta.tables import *
# Delta Lake 라이브러리 추가
spark = SparkSession.builder \
.appName("DeltaExample") \
.config("spark.jars.packages", "io.delta:delta-core_2.12:1.0.0") \
.getOrCreate()
# Delta Lake 테이블을 읽거나 작성
delta_table = DeltaTable.forPath(spark, "path_to_delta_table")
delta_table.toDF().show()
6. Column not found: <column_name>
문제 : 쿼리에서 참조하는 컬럼이 DataFrame에 존재하지 않을 때 발생하는 오류
원인:
- 쿼리에서 잘못된 컬럼 이름을 사용한 경우
- DataFrame의 스키마가 예상과 다를 때
해결 방법:
df.printSchema()를 사용하여 DataFrame의 스키마를 확인하고, 컬럼 이름을 정확히 지정alias를 사용하여 컬럼 이름을 변경하거나, 컬럼을 선택적으로 조회
예시 코드:
df = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])
# 잘못된 컬럼 이름으로 쿼리 시도
try:
df.select("age").show() # 오류 발생
except Exception as e:
print(f"Error: {str(e)}")
# 정확한 컬럼 이름 사용
df.select("name").show()
7. IllegalStateException: Cannot find the leader of the Spark SQL cluster
문제 : Spark SQL 클러스터에서 리더를 찾을 수 없다는 오류입니다. 주로 클러스터 설정에 문제가 있을 때 발생
원인:
- Spark 클러스터의 노드 간 통신 문제가 발생했을 때
- Spark 설정에 문제가 있거나, 클러스터에서 특정 노드가 다운된 경우
해결 방법:
- 클러스터 상태를 점검하고, 필요한 노드들이 모두 실행되고 있는지 확인
- 클러스터의
spark.master설정을 재검토
예시 코드:
spark = SparkSession.builder \
.appName("ClusterExample") \
.master("spark://<master_url>:7077") \
.getOrCreate()
# 클러스터 설정 확인
print(spark.version)
실무에서는 여기에 기재하지 않은 에러가 굉장히 많습니다.
그렇기에 오류가 발생했을 때 원인을 파악하고 적절한 에러 핸들링 및 수정을 하는 것이 중요합니다.
감사합니다.
728x90
반응형
'Data Engineer' 카테고리의 다른 글
| Apache Spark vs Apace Flink (0) | 2025.03.26 |
|---|---|
| Redshift vs BigQuery vs Snowflake (0) | 2025.03.25 |
| Spark SQL에서 자주 발생하는 오류 (0) | 2025.03.20 |
| Spark SQL과 데이터 처리 (0) | 2025.03.20 |
| Oracle VM VirtualBox를 활용해서 Linux OS 설치방법 (0) | 2023.11.02 |