BigQuery 커넥터

BigQuery 커넥터 (BigQuery connector)

BigQuery 커넥터는 BigQuery에 저장된 데이터를 질의할 수 있게 해 줘요. BigQuery와 Hive 같은 서로 다른 시스템 간의 데이터를 조인할 때 쓸 수 있어요. 이 커넥터는 테이블에서 데이터를 읽기 위해 BigQuery Storage API를 사용해요.

출처: 문서

본문

BigQuery Storage API

Storage API는 Google Cloud Storage를 중간 매개체로 사용하지 않고, gRPC를 통해 BigQuery에서 직접 데이터를 병렬로 스트리밍해요. 이전의 export 기반 읽기 흐름보다 여러 장점이 있어 일반적으로 더 나은 읽기 성능을 제공해요:

  • 직접 스트리밍(Direct Streaming): Google Cloud Storage에 임시 파일을 남기지 않아요. 행은 Avro 와이어 형식을 사용해 BigQuery 서버에서 직접 읽어요.
  • 컬럼 필터링(Column Filtering): 새 API는 관심 있는 데이터만 읽도록 컬럼 필터링을 허용해요. 컬럼형 데이터스토어에 기반해 모든 컬럼을 읽지 않고도 데이터를 효율적으로 스트리밍할 수 있어요.
  • 동적 샤딩(Dynamic Sharding): API는 모든 리더가 완료될 때까지 레코드를 리더 사이에서 재균형화해요. 즉 모든 Map 단계가 거의 동시에 끝나는 것이죠. 동적 샤딩이 Google Cloud Dataflow에서 비슷하게 사용되는 방법에 대한 블로그 글을 참고하세요.

요구사항 (Requirements)

BigQuery에 연결하려면 다음이 필요해요:

  • BigQuery Storage Read API를 활성화하세요.
  • Trino 코디네이터와 워커에서 Google Cloud API 서비스 엔드포인트로 네트워크 접근이 가능해야 해요. 이 엔드포인트는 HTTPS 또는 포트 443을 사용해요.
  • Trino 코디네이터와 워커가 BigQuery에서 권한을 갖도록 BigQuery를 구성하세요.
  • 인증을 설정하세요. Dataproc/Google Compute Engine(GCE)을 쓰는지 여부에 따라 인증 옵션이 달라져요.

Dataproc/GCE에서 인증은 머신의 역할(role)에서 수행돼요.

Dataproc/GCE 밖에서는 3가지 옵션이 있어요:

  • 서비스 계정 JSON 키와 GOOGLE_APPLICATION_CREDENTIALS를 Google Cloud 인증 시작 가이드에 나온 대로 사용하세요.
  • 카탈로그 속성 파일에서 bigquery.credentials-key를 설정하세요. JSON 파일의 내용을 base64로 인코딩해서 담아야 해요.
  • 카탈로그 속성 파일에서 bigquery.credentials-file을 설정하세요. JSON 파일의 위치를 가리켜야 해요.

설정 (Configuration)

BigQuery 커넥터를 구성하려면 etc/catalogexample.properties라는 카탈로그 속성 파일을 만들어 BigQuery 커넥터를 example 카탈로그로 마운트하세요. 다음 내용으로 파일을 만들고, 연결 속성은 환경에 맞게 바꾸세요:

connector.name=bigquery
bigquery.project-id=

이 커넥터는 몇 가지 JVM 옵션을 권장할 수 있어요:

--add-opens=java.base/java.nio=ALL-UNNAMED
--sun-misc-unsafe-memory-access=allow

파티션 컬럼 접근:

SELECT *, "$partition_date", "$partition_time"
FROM example.web.page_views;

파티션 필터링:

SELECT *
FROM example.web.page_views
WHERE "$partition_date" = date '2022-04-07';

와일드카드 테이블 접근:

SELECT *
FROM example.web."page_views_*";

SQL로 BigQuery 명령 실행:

USE example.example_schema;
CALL system.execute(query => 'ALTER TABLE your_table ALTER COLUMN your_column DROP DEFAULT');

또는 테이블 함수로 결과를 받아올 수도 있어요:

SELECT
  *
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        manager_id, STRING_AGG(employee_id)
      FROM
        company.employees
      GROUP BY
        manager_id'
    )
  );

더 알아보기 (Learn more)

다른 데이터 웨어하우스 커넥터가 궁금하다면 Snowflake 커넥터 문서를 이어서 읽어 보세요.