BigQuery에서 ClickHouse로 데이터 로드하기

BigQuery에서 ClickHouse로 데이터 로드하기 (Loading data from BigQuery to ClickHouse)

BigQuery에서 ClickHouse로 데이터를 마이그레이션하는 방법을 보여주는 가이드예요. 먼저 테이블을 Google의 객체 스토어(GCS)로 내보낸 다음, 그 데이터를 ClickHouse Cloud로 가져옵니다.

출처: 문서

본문

이 가이드는 ClickHouse Cloud 및 자체 호스팅 ClickHouse v23.5+와 호환됩니다.

이 가이드는 BigQuery에서 ClickHouse로 데이터를 마이그레이션하는 방법을 보여줍니다.

먼저 테이블을 Google의 객체 스토어(GCS)로 내보낸 다음, 그 데이터를 ClickHouse Cloud로 가져옵니다. 이 단계는 BigQuery에서 ClickHouse로 내보내려는 각 테이블마다 반복해야 합니다.

ClickHouse로 데이터 내보내는 데 얼마나 걸릴까요? (How long will exporting data to ClickHouse take?)

BigQuery에서 ClickHouse로 데이터를 내보내는 시간은 데이터셋 크기에 따라 달라집니다. 비교를 위해, 이 가이드를 사용해 BigQuery에서 ClickHouse로 4TB 공개 이더리움 데이터셋을 내보내는 데 약 1시간이 걸립니다.

테이블 행 수 내보낸 파일 수 데이터 크기 BigQuery 내보내기 슬롯 시간 ClickHouse 가져오기
blocks 16,569,489 73 14.53GB 23 secs 37 min 15.4 secs
transactions 1,864,514,414 5169 957GB 1 min 38 sec 1 day 8hrs 18 mins 5 secs
traces 6,325,819,306 17,985 2.896TB 5 min 46 sec 5 days 19 hr 34 mins 55 secs
contracts 57,225,837 350 45.35GB 16 sec 1 hr 51 min 39.4 secs
합계 82.6억 23,577 3.982TB 8 min 3 sec > 6일 5시간 53 mins 45 secs

1

테이블 데이터를 GCS로 내보내기

이 단계에서는 BigQuery SQL 워크스페이스를 사용해 SQL 명령을 실행합니다. 아래에서 mytable이라는 BigQuery 테이블을 EXPORT DATA 문을 사용해 GCS 버킷으로 내보냅니다.

DECLARE export_path STRING;
DECLARE n INT64;
DECLARE i INT64;
SET i = 0;

-- We recommend setting n to correspond to x billion rows. So 5 billion rows, n = 5
SET n = 100;

WHILE i < n DO
  SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet');
  EXPORT DATA
    OPTIONS (
      uri = export_path,
      format = 'PARQUET',
      overwrite = true
    )
  AS (
    SELECT * FROM mytable WHERE export_id = i
  );
  SET i = i + 1;
END WHILE;

위 쿼리에서 우리는 BigQuery 테이블을 Parquet 데이터 형식으로 내보냅니다. 그리고 uri 파라미터에 * 문자가 있습니다. 이는 내보내기가 1GB를 초과할 때 출력이 숫자가 증가하는 접미사가 붙은 여러 파일로 분할되도록 보장합니다. 이 접근 방식은 여러 장점이 있습니다:

  • Google은 하루 최대 50TB를 GCS로 무료 내보낼 수 있게 허용합니다. 사용자는 GCS 스토리지에 대해서만 비용을 지불합니다.
  • 내보내기는 여러 파일을 자동으로 생성하며, 각각 최대 1GB의 테이블 데이터로 제한합니다. 이는 가져오기를 병렬화할 수 있게 해 주므로 ClickHouse에 유리합니다.
  • 컬럼 지향 형식인 Parquet는 본질적으로 압축되어 있고 BigQuery가 내보내고 ClickHouse가 쿼리하기에 더 빠르므로 더 나은 교환 형식입니다.

2

GCS에서 ClickHouse로 데이터 가져오기

내보내기가 완료되면 이 데이터를 ClickHouse 테이블로 가져올 수 있습니다. ClickHouse SQL 콘솔 또는 clickhouse-client를 사용해 아래 명령을 실행할 수 있습니다. 먼저 ClickHouse에 테이블을 만들어야 합니다:

-- If your BigQuery table contains a column of type STRUCT, you must enable this setting
-- to map that column to a ClickHouse column of type Nested
SET input_format_parquet_import_nested = 1;

CREATE TABLE default.mytable
(
        `timestamp` DateTime64(6),
        `some_text` String
)
ENGINE = MergeTree
ORDER BY (timestamp);

테이블을 만든 후, 클러스터에 여러 ClickHouse 복제본이 있다면 내보내기를 가속화하기 위해 설정 parallel_distributed_insert_select를 활성화하세요. ClickHouse 노드가 하나뿐이라면 이 단계를 건너뛸 수 있습니다:

SET parallel_distributed_insert_select = 1;

마지막으로, INSERT INTO SELECT 명령을 사용해 GCS의 데이터를 ClickHouse 테이블에 삽입할 수 있습니다. 이는 SELECT 쿼리 결과를 기반으로 테이블에 데이터를 삽입합니다. INSERT할 데이터를 검색하기 위해 s3Cluster 함수를 사용할 수 있습니다. GCS는 Amazon S3와 상호 운용되기 때문입니다. ClickHouse 노드가 하나뿐이라면 s3Cluster 함수 대신 s3 테이블 함수를 사용할 수 있습니다.

INSERT INTO mytable
SELECT
    timestamp,
    ifNull(some_text, '') AS some_text
FROM s3Cluster(
    'default',
    'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz',
    '<ACCESS_ID>',
    '<SECRET>'
);

위 쿼리에서 사용된 ACCESS_IDSECRET은 GCS 버킷과 연결된 HMAC 키입니다.

Nullable 컬럼을 내보낼 때는 ifNull을 사용하세요 위 쿼리에서 우리는 some_text 컬럼에 ifNull 함수를 사용해 기본값과 함께 데이터를 ClickHouse 테이블에 삽입합니다. ClickHouse의 컬럼을 Nullable로 만들 수도 있지만, 이는 성능에 부정적 영향을 줄 수 있어 권장되지 않습니다.

대안으로 SET input_format_null_as_default=1을 설정하면 누락되거나 NULL인 값이 해당 컬럼의 기본값(기본값이 지정된 경우)으로 대체됩니다.

3

성공적인 데이터 내보내기 테스트하기

데이터가 올바르게 삽입되었는지 테스트하려면 새 테이블에서 SELECT 쿼리를 실행하기만 하면 됩니다:

SELECT * FROM mytable LIMIT 10;

더 많은 BigQuery 테이블을 내보내려면 추가 테이블마다 위 단계를 다시 수행하면 됩니다.

추가 읽기 및 지원 (Further reading and support)

이 가이드 외에도, ClickHouse로 BigQuery를 가속화하고 증분 가져오기를 처리하는 방법을 보여주는 블로그 게시물을 읽는 것을 권장합니다.

BigQuery에서 ClickHouse로 데이터를 전송하는 데 문제가 있다면 [email protected]으로 연락해 주세요.

더 알아보기 (Learn more)