ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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% 확률로 아마 이 문제였을 것이다. 보람있네. 

     

     

     

    참고: https://stackoverflow.com/questions/67599930/bigquery-why-when-i-try-execute-query-give-me-the-error-not-found-dataset-was

     

     

     

    댓글

Designed by Tistory.