현재 프로젝트에서 직면한 문제에 대해 조금 정리를 하고자한다. 현재 Synapse Dedicated Pool에서 데이터를 가져오고 쓰기를 수행할 때
com.microsoft.spark.sqlanalytics.Constants
라는 라이브러리를 사용하고 있다.
참조 : https://learn.microsoft.com/ko-kr/azure/synapse-analytics/spark/synapse-spark-sql-pool-import-export?tabs=scala%2Cpython1%2Cpython2%2Cpython3%2Cpython4%2Cscala5
그러나 spark.mode('Overwrite')를 사용할 시 Target 테이블이 비어버리는 시간이 존재한다 그래서 내부적으로 해당 write가 어떻게 수행한는지 query history를 조회하여 확인해보니
(왼쪽 위에서 오른쪽 아래로 시간 순)
이런식으로 storage account (s3)에 parquet파일을 먼저 떨구고 (partition갯수만큼) external 테이블을 만들어 기존 테이블을 지우고 copy into로 수행하게 된다. 그러나 현재 문제가 저 익스터널 테이블을 copy into할때 만약 spark write가 7분정도 걸린다면 1분 가량 조회가 되지 않는다.
실제로 Synapse Dedicated Pool에서 그냥 다른 Parquet 파일 External 테이블을 만드는데 100만건 정도 되는 parquet파일을 select하는데 1분 30초 정도 걸린다.
해결 방법은 간단하다. 중간에 temp table을 쓰고 dw to dw 로 append를 사용하면 된다. 그러나! 현재로서는 이게 ACID을 보장하지 못한다는 것 아닐까? 즉 ISOLATION이 보장되지 않는다는 생각이든다.
사용하면 할 수록.. 아직까지 spark는 아닌것같다... synapse에서...