쿼리 결과 내보내기

쿼리 결과 내보내기 (Export query results)

Apache Druid® SQL의 EXTERN 함수를 사용해 데이터를 내보내는(export) 방법을 보여 드릴게요. 이 튜토리얼에서는 로컬 파일 시스템과 클라우드 스토리지 두 가지 대상으로 쿼리 결과를 내보내는 방법을 살펴봐요.

출처: 문서

본문

사전 준비 (Prerequisites)

이 튜토리얼의 단계를 따라가기 전에, Local quickstart에 설명된 대로 Druid를 다운로드해 주세요. Druid는 아직 시작하지 마세요 — 튜토리얼 과정에서 시작하게 돼요.

Druid에서 데이터 수집과 쿼리에 익숙해야 해요. 아직 안 하셨다면 먼저 Query data 튜토리얼을 진행해 주세요.

쿼리 결과를 로컬 파일 시스템으로 내보내기 (Export query results to the local file system)

이 예시는 Druid가 로컬 파일 시스템으로 데이터를 내보내도록 구성하는 방법을 보여 줘요. 데이터 내보내기를 위한 EXTERN 구문을 익히는 데는 이 방법을 쓸 수 있지만, 운영(production) 시나리오에는 적합하지 않아요.

Druid 로컬 내보내기 디렉터리 구성하기 (Configure Druid local export directory)

다음 명령은 Druid 내보내기의 기본 경로를 /tmp/druid/ 로 설정해요. Druid를 실행하는 계정이 /tmp/druid/ 에 접근할 수 없다면 경로를 바꿔 주세요. 예를 들어 /Users/Example/druid 처럼요. 이 단계에서 경로를 바꿨다면 이후 모든 단계에서 바꾼 경로를 사용해 주세요.

Druid 배포판의 루트에서 다음을 실행해 주세요:

export export_path="/tmp/druid"
sed -i -e $'$a\\\n\\\n\\\n#\\\n###Local export\\\n#\\\ndruid.export.storage.baseDir='$export_path' conf/druid/auto/_common/common.runtime.properties

이 명령은 conf/druid/auto/_common 에 있는 Druid common.runtime.properties 설정 파일에 다음 섹션을 추가해요:

###
#Local export
#
druid.export.storage.baseDir=/tmp/druid/

Druid 시작하고 샘플 데이터 로드하기 (Start Druid and load sample data)

  • Druid 배포판의 루트에서 ./bin/start-druid 로 Druid를 실행해 주세요.
  • Druid가 시작되면 브라우저에서 http://localhost:8888/ 를 열어 웹 콘솔에 접근해 주세요.
  • Query 뷰에서 다음 명령을 실행해 Wikipedia 예제 데이터셋을 로드해 주세요:
REPLACE INTO "wikipedia" OVERWRITE ALL WITH "ext" AS ( SELECT * FROM TABLE ( EXTERN ( '{"type":"http","uris":["https://druid.apache.org/data/wikipedia.json.gz"]}' , '{"type":"json"}' ) ) EXTEND ( "isRobot" VARCHAR , "channel" VARCHAR , "timestamp" VARCHAR , "flags" VARCHAR , "isUnpatrolled" VARCHAR , "page" VARCHAR , "diffUrl" VARCHAR , "added" BIGINT , "comment" VARCHAR , "commentLength" BIGINT , "isNew" VARCHAR , "isMinor" VARCHAR , "delta" BIGINT , "isAnonymous" VARCHAR , "user" VARCHAR , "deltaBucket" BIGINT , "deleted" BIGINT , "namespace" VARCHAR , "cityName" VARCHAR , "countryName" VARCHAR , "regionIsoCode" VARCHAR , "metroCode" BIGINT , "countryIsoCode" VARCHAR , "regionName" VARCHAR ) ) SELECT TIME_PARSE ( "timestamp" ) AS "__time" , "isRobot" , "channel" , "flags" , "isUnpatrolled" , "page" , "diffUrl" , "added" , "comment" , "commentLength" , "isNew" , "isMinor" , "delta" , "isAnonymous" , "user" , "deltaBucket" , "deleted" , "namespace" , "cityName" , "countryName" , "regionIsoCode" , "metroCode" , "countryIsoCode" , "regionName" FROM "ext" PARTITIONED BY DAY

데이터를 내보내는 쿼리 (Query to export data)

새 탭을 열고 다음 쿼리를 실행해 쿼리 결과를 /tmp/druid/wiki_example 경로로 내보내 주세요. 이 경로는 druid.export.storage.baseDir 의 하위 디렉터리여야 해요.

INSERT INTO  EXTERN(
    local(exportPath => '/tmp/druid/wiki_example')
    )
AS CSV
SELECT "channel",
  SUM("delta") AS "changes"
FROM "wikipedia"
GROUP BY 1
LIMIT 10

Druid는 쿼리 결과를 /tmp/druid/wiki_example 디렉터리로 내보내요. 다음 명령을 실행해 내용을 나열해 보세요:

ls /tmp/druid/wiki_example

결과는 데이터의 CSV 파일 내보내기와 디렉터리로 구성돼요.

쿼리 결과를 클라우드 스토리지로 내보내기 (Export query results to cloud storage)

클라우드 스토리지로 내보내는 단계는 로컬 파일 시스템으로 내보내는 것과 비슷해요. Druid는 Amazon S3 또는 Google Cloud Storage (GCS) 를 클라우드 스토리지 대상으로 지원해요.

  • 클라우드 스토리지 대상에 맞는 확장 프로그램을 활성화해 주세요. Loading core extensions을 참고해 주세요:

    • Amazon S3: druid-s3-extensions
    • GCS: google-extensions

    더 자세한 내용은 Loading core extensions을 참고해 주세요.

  • 클라우드 스토리지 대상에 필요한 추가 속성을 구성해 주세요. {CLOUD} 를 s3 또는 google 로 바꿔 주세요:

    • druid.export.storage.{CLOUD}.tempLocalDir : 쿼리 엔진이 내보낼 파일을 스테이징하는 로컬 임시 디렉터리.
    • druid.export.storage.{CLOUD}.allowedExportPaths : Druid 내보내기 위치로 허용되는 S3 또는 GS 접두사. 예: ["s3://bucket1/export/","s3://bucket2/export/"] 또는 ["gs://bucket1/export/", "gs://bucket2/export/"].
    • druid.export.storage.{CLOUD}.maxRetry : 일시적인 오류로 인한 실패를 피하려고 클라우드 API 호출을 시도하는 최대 횟수.
    • druid.export.storage.s3.chunkSize : 임시 디렉터리에 저장할 개별 데이터 청크의 최대 크기.
  • 인스턴스 역할이 버킷과 폴더에 대해 읽기, 쓰기, 만들기, 삭제의 올바른 권한을 가지고 있는지 확인해 주세요. Permissions for durable storage을 참고해 주세요.

  • 클라우드 스토리지 유형에 맞는 쿼리 구문을 사용해 주세요. 예를 들어:

    S3:

    INSERT INTO EXTERN ( s3 ( bucket = > 'your_bucket' , prefix = > 'prefix/to/files' ) ) AS CSV SELECT "channel" , SUM ( "delta" ) AS "changes" FROM "wikipedia" GROUP BY 1 LIMIT 10
    

    GCS:

    INSERT INTO EXTERN google ( bucket = > 'your_bucket' , prefix = > 'prefix/to/files' ) AS CSV SELECT "channel" , SUM ( "delta" ) AS "changes" FROM "wikipedia" GROUP BY 1 LIMIT 10
    
  • 쿼리할 때 rowsPerPage 쿼리 컨텍스트 파라미터를 사용해 출력 파일 크기를 제한해 주세요. 쿼리 끝에 아주 큰 LIMIT 을 추가해 Druid가 단일 파일을 만들도록 강제하는 것도 가능하지만, 이 기법은 권장하지 않아요.

더 알아보기 (Learn more)

자세한 내용은 다음 주제를 참고해 주세요: