-
[BigQuery] EXECUTE IMMEDIATE가 이상해요개발 끄적 2022. 4. 6. 21:38

문제 상황
동료분이 Hue에서 사용하던 쿼리를 python api로 날리던 중 참으로 이상한 일이 있었다.
바로 EXECUTE IMMEDIATE 문법을 사용한 구문들이 400 에러를 발생시키는 것이었다. (Access denied)
정확히는 Hue에서는 잘 동작하고 Superset, python api에서는 잘 동작하지 않았다.
EXECUTE IMMEDIATE?
이 문법을 안써본 사람도 아래 예시를 보면 이해가 바로 될 것이다.
쉽게 설명하자면 String형태로 정의된 쿼리를 넘겨주면 실행시켜주는 것이다.
자세한 용법은 구글 문서가 잘 정리되어있으니 고고
이게 외않되?
아래 세 개의 예시를 보자.
1. 단순한 SELECT문을 EXECUTE IMMEDIATE에 넘겼을 뿐이다.
동작하지 않는다. (Access denied)
DECLARE TEST_SQL STRING DEFAULT "SELECT * FROM my-project.my_dataset.my_table"; EXECUTE IMMEDIATE TEST_SQL;2. 쌍따옴표 세개로 감싸보았다.
동작하지 않는다. (Access denied)
DECLARE TEST_SQL STRING DEFAULT """SELECT * FROM my-project.my_dataset.my_table"""; EXECUTE IMMEDIATE TEST_SQL;3. 개행을 넣어봤다.
동작한다.
DECLARE TEST_SQL STRING DEFAULT """ SELECT * FROM my-project.my_dataset.my_table; """; EXECUTE IMMEDIATE TEST_SQL;아니 이게 규칙이 있다고..?
머리가 지끈지끈해졌다.
에러도 다르다
위에도 언급했지만 Hue에서는 잘 동작했다.
문제는 Superset과 python api의 에러메시지가 달랐다.
Superset - Access denied
python api - Not found in location US
결론부터
결론은 데이터를 찾는 location이 핑핑 돌아서 그랬다.
무슨 말인고 하면..
BigQuery는 GCP에 있고 GCP에서는 데이터가 저장되는 지역이 여러 개 있다.
BigQuery는 기본적으로 Auto-select 모드를 사용해서 데이터 위치를 찾는다.
갓구글이니 당연히 잘 만들었겠지만,
EXECUTE IMMEDIATE문은 쿼리가 String으로 쿼리가 아닌 척하고 숨어있다보니 고장나는 경우가 있다.
다시 문제로 되돌아가보자
내가 쓰던 데이터는 서울(asia-northeast3)에 위치하고 있다.
HUE에서는 왜 잘 동작했을까?
소스코드를 살펴보니 쿼리의 location이 asia-northeast3를 가장 먼저 찾도록 되어있다.
Superset에서는 왜 고장났을까?
그간 안보였는데 run버튼 옆에 location 버튼이 있었다.
살펴보니 기본값이 auto로 되었고, asia-northeast3으로 변경하니 잘 동작한다.
그럼 왜 Access denied가 떴을까?
아마도 다른 region에도 같은 데이터를 백업해뒀을 것 같은데 백업 데이터에는 내가 권한이 없어서 그런 것 같다.
python api에서는 왜 고장났을까?
python api는 location이 US로 설정된 composer에서 실행해서 일단 not found in location US가 뜬 것 같다.
location을 asia-northeast3으로 고정해주니 잘 동작한다.
Superset과는 다르게 다른 지역에 데이터가 있는지 사실조차 모르는 권한이라서 Access denied는 안떴을 것 같다.
후기
알고나면 별 것 아닌데 한 2~3일 뻘테스트를 하면서 삽질했다.
동료분이 이전에 다른 조직에 해당 쿼리를 스케줄링해달라고 요청했었는데
Airflow 버전 문제인 것 같다고 declare문이 문제인 것 같다며 반려했다고 한다.
99% 확률로 아마 이 문제였을 것이다. 보람있네.
'개발 끄적' 카테고리의 다른 글
[GCP] Cloud NAT (0) 2022.08.22 [Airflow] Composer에서 worker 숫자가 늘지 않았던 일 (0) 2022.04.12 [pandas] ==와 is는 같지 않으니 주의하자 (0) 2022.04.12 [BigQuery] Backtick 사용에 대한 고찰 (0) 2022.04.05 GCP에 Jupyter Notebook 셋팅 (0) 2021.04.19