Software Development/Data Engineering

[Spark] Spark JDBC와 하이브 연동 이슈들.

루ㅌ 2023. 5. 5. 11:53

Spark JDBC로 RDB의 데이터를 가져올 수 있음.

이때 성능 이슈가 있을 수 있음.

 

fetchsize 옵션 추가해서 사이즈를 키워볼 것.

partition 옵션을 사용하여 병렬로 가져올 수 있도록 쿼리 짤 것.

 

Spark JDBC로 데이터 가져올 때, Action 한 번만 호출하도록 신경쓸 것. Cache가 좋은 대안.

 

 Spark JDBC로 가져온 데이터를 Hive metastore와 연동하는 경우가 많음. 이때 스키마 이슈가 발생할 수 있음.

saveAsTable로 Overwrite하면, table drop 후 create 함. 이때 기존 스키마 전부 날라감.

스키마 날라가도, 데이터는 잘 저장될 수 있음. spark.sql로 읽는다면 큰 문제없음.

그러나 여기에 하이브가 붙는다면, 하이브가 읽을 수 있는 스키마가 없기 때문에, 데이터를 읽는게 불안정해짐.

예를 들어, HQL로 데이터를 읽는데, 컬럼의 값이 전부 null로 입력된 현상을 발견할 수 있음.

해당 문제를 해결하기 위해 아래의 옵션을 줘서 해결 가능.

 

set orc.force.positional.evolution=true;

 

그러나 만병통치약이 아님.

메타스토어를 쓰든 아니든 결국 데이터는 파일로 저장됨. 제대로된 스키마가 없다면, 저장되는 데이터의 특정 값에 따라 데이터를 오염시킬 수 있음.

대안은 스키마를 잃어버리지 않는 방법을 찾는 것.

saveAsTable -> insertInto로 변경.