BigQuery에서 가끔씩 Error: 80324028이 발생하면서 실행이 실패하는 경우가 있습니다. 이러한 현상을 구글링 해봤으나 별다른 성과가 없었으며, Slack overflow에서만 몇몇 답글이 달렸지만 해결방법은 없고 대부분이 "아마도 그럴 것이다?"라는 추측이었습니다.
무슨 작업을 했을 때 발생 하였는가?
그래서 몇 가지 의심 가는 정황을 포착해서 여러 가지 테스트를 해보았는데, 현재는 발생하지 않고 있습니다. 제가 하려던 작업은 ETL 작업이었고 Python Operator를 이용해서 작업을 부르고 그 안쪽에 BigQuery의 Query를 수행하는 작업이 몇 개 있었습니다.
대략 이러한 작업이었습니다. 이러한 여러 번의 Query를 수행하는 작업이 순차적으로 수행됩니다.
굉장히 단순하고 별다른 작업은 아니지만 이러한 DROP , CREATE , INSERT 등의 작업이 단계에 걸쳐서 수행되고 있습니다. 문제는 이 부분에 있습니다. 이러한 작업이 즉시즉시 바로 일어나는 것입니다.
아래와 같이 테이블을 생성하고 그 테이블에 값을 넣고 기존의 테이블과 Merge를 합니다. 이러한 형태의 프로세스는 데이터를 다루는 분들이라면 많이 경험을 해봤을 것이라고 생각됩니다. CDC 또는 지속적으로 UPDATE, INSERT 되는 테이블의 경우 다음과 같이 테이블을 임시로 만들어서 Merge 하는 구조가 많습니다.
그런데, 문제는 이 과정에서 CREATE -> INSERT 과정에서 다음과 같이 Error: 80324028이 발생했습니다. 지금 프로세스의 경우 1시간에 한번씩 데이터를 동기화 하는데, 20개의 테이블 기준으로 빈도가 일 3~5회정도로 굉장히 많이 발생 했습니다. 오류 내용의 전문을 보면 다음과 같습니다.
google.api_core.exceptions.InternalServerError: 500 An internal error occurred and the request could not be completed.
This is usually caused by a transient issue. Retrying the job with back-off as described in the BigQuery SLA should solve the problem: https://cloud.google.com/bigquery/sla.
위의 내용을 번역기(영어를 못해서..)로 돌려보면 일시적인 문제로 나옵니다. 그래서 가끔 뭐 발생할 수 있지라고 생각하고 그냥 넘겼는데 그 발생 빈도가 너무 많아서, 구글링 해봤으나 위에서 언급한 것과 같이 해결법은 없습니다.
해결방법
해결 방법은 굉장히 단순합니다. 단순하게 중간에 Delay를 주면 됩니다. CREATE 후에 3~5초 정도 후에 데이터를 INSERT 하고 MERGE 전에 잠깐 3~5초 정도 Delay를 주면 됩니다. 이렇게 하고 기존에 1일 5회 정도 발생하는 오류가 단 1건도 발생하고 있지 않습니다.
제 추측으로는 BigQuery에 Lock이라는 개념은 없지만 어느 정도 생성 또는 무언가 작업 이후에 바로 하는 경우 지연이 발생하는 것으로 보입니다. (아무래도 애도 컴퓨터로 하는 작업이니 만들고 바로 쓰려면 없지 않을까? 싶은...)