본문 바로가기

MyEnt

BigQuery Demo

Managing BigQuery Jobs 

@ 3줄요약

1. BQ jobs은 load/stream, query, export(extract), copy 작업을 webUI, CLI(bq), P/G으로 실행할 수 있다. (비동기 task로)

2. 각 jobs에는 다양한 제약사항이 있지만 연락해서 조정할 수 있다. (table load 작업은 제외)

3. Unique JobID로 job을 관리할(run, view job metadata, cancel) 수 있으며 cancel은 eventually한 작업이다.


@ 개요 (비동기, query cache, 월단위 table 설계)

1. BQ jobs은 다음의 작업들을 지원

- load, export(extract), query, copy

- 모든 job은 비동기로 처리, 간단한 작업(list res, get metadata)은 job으로 관리 안됨

2. Interface

- web ui, CLI(bq): 실행시 자동으로 create, schedule, run 됨

- p/g(by REST, client lib): create(POST, job.inserts)하면 BQ가 schedule, run 됨

- query의 cache유무와 자원사용량: web UI에서 확인 가능


3. 필요 permissions 

- https://cloud.google.com/bigquery/docs/access-control#predefined_roles_comparison_matrix

- IAM roles로 적용하는게 편함

- tip: web UI에서 실행해보면 필요 permissions 확인가능

4. Quota

1) Load 

- 하루에 한 table당 1,000개 jobs (failure 포함) => 제한증가 불가

- 하루에 한 project당 50,000개 jobs (failure 포함)

- Row/Cell size: CSV(10MB), JSON(10MB), Avro(16MB)

- 한 table당 columns는 10,000개까지

- 한 파일의 최대크기: CSV/JSON(4G/5T), Avro(file은 미지원, 압축 data block은 DEFLATE와 Snappy codec지원 / 5T, file header 1M)

- 한 job당 최대크기: 15TB(CSV, JSON, Avro 혼합 파일)

- 한 job당 최대 uris 수: 10,000 uris

- 한 job당 최대 파일수: 1,000만개(10million), uris 파일수도 포함

- 한 job 최대 수행시간: 6시간

2) Copy

- 하루에 한 table당 1,000개 jobs (failure 포함)

- 하루에 한 project당 10,000개 jobs (failure 포함)

3) Export(extract)

- 하루에 한 project당 1,000개 jobs, 10TB

- job당 500 wildcard URIs

- ​GCS에만 저장 가능


※ Wildcard URIs

single: ['gs://[YOUR_BUCKET]/file-name-*.json'], ['gs://[YOUR_BUCKET]/path-component-*/file-name.json']

multi: ['gs://my-bucket/file-name-1-*.json', 'gs://my-bucket/file-name-2-*.json', 'gs://my-bucket/file-name-3-*.json']

4) Query

- query 결과는 우선적으로 query cache(이후 세미나)에서 반환됨

- 50 concurrent queries, dryRun/--dry_run(query test)은 limit에 포함안됨

- 6 concurrent queries w/ UDFs(user-defined functions)

- 일별 query size는 무제한, custom quotas(이후 세미나에서 상세)로 설정가능

- 일별 한 table당 1,000 updates

- 한 job 최대 수행시간: 6시간

- 한 query에 1,000개 table 참조가능

- 최대 응답 크기:

 * 128MB(압축된, 압축방식에 따라 포함될수 있는 데이터량은 다양함) 

 * Large query result 옵션(이후 세미나 custom quata)을 지정하면 무제한

 * 최대 row 크기: 100MB, query job 수행시 내부적으로 처리되는 data의 크기 => 대략적인 크기임

 * project당 최대 concurrent slots 2000(on-demand price)

 * slots shard되어 있어서 보통 100GB이하의 query 처리는 문제없음

 * stackdriver monitoring(이후 세미나)으로 slots 사용 확인 가능

 * slots를 늘리고싶으면 연락해서 정액제(flat-rate)로 전환 가능

5. Price

- 저장, streaming insert, query만 과금(GB단위), load/export/copy는 무료, 매월 10GB는 무료

- 저장: 월 $0.02/GB

- 장기저장: 월 $0.01/GB (50% 할인), 90일간 table을 변경하지(추가, 덮어쓰기, 스트리밍) 않으면 적용 => 월단위 table 설계 필요

- 스트리밍: 월 $0.05/GB

- 쿼리: 월 $5/TB, 매월 1TB는 무료, query 결과는 query cache에서 반환됨

- 나머지 모든작업은 무료

@ Job w/ PG (JobID, status.errorResult/errors, timestamp)

1. 실행

- jobs.insert(or REST) w/ job ID로 작업을 실행하고, 실행상태를 주기적으로 확인가능하며, 정상적으로 완료되었는지 확인가능

- client: https://cloud.google.com/bigquery/docs/running-queries#bigquery-query-nodejs

- REST: https://cloud.google.com/bigquery/docs/reference/rest/v2/#Jobs

- job ID를 지정하지 않으면 자동으로 생성

- job resource: https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#resource-representations


※ demo: https://code.google.com/oauthplayground/

1) https://www.googleapis.com/bigquery/v2/projects/ct-log-197412/jobs

2) https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/insert#try-it

2. 조회

- jobs.get w/ job ID

- status.state를 확인(job resource에서), DONE => 작업이 현재 수행되고 있지 않음, 성공했다는 의미는 아님

- status.errorResult가 있으면, 작업은 완료했지만 실패

- status.errorResult가 없으면, 작업성공

- 성공이라도, status.errors에 non-fatal errors이 있을 수 있음

3. Job ID 생성하기

- id 구성: [a-z, A-Z], [0-9], [ _ , - ] 1024 chars

- unique in project

- common approach: my_job_{timestamp}

@ Job 관리 (JobID, Job resource, Eventually cancel)

1. 개요

- job의 상태는 pending, running, done(success / failure <= completed w/ fatal-error)

- bigquery.admin: 모든 job 확인가능, bigquery.user / jobUser: 자신의 job만 확인가능

- job을 실행하면 다음 작업들을 할 수 있음

* view job data, list jobs, cancel, rerun

2. view job data

- web ui: job history

- bq show -j {prj_id}:{job_id} => 요약결과: job type, state, start time, duration, owner

- bq show --format=prettyjson -j {prj_id}:{job_id} => job resource

- jobs.get w/ job_id, prj_id => job resource

- https://cloud.google.com/bigquery/docs/managing-jobs#viewing_jobs

3. list jobs

- web ui: job history

- bq ls -j {prj_id} => job lists

- bq ls -j -n {int} {prj_id}, ex) bq ls -j  -n 10 myprj-1234

- jobs.list w/ pro_id

4. cancel a job

- RUNNING / PENDING job만 cancel 할 수 있음

- 모든 type의 job을 cancel 할 수 없음, cancel 할 수 없는 type의 job은 error 반환

- cancel 요청이 되어도 cancel을 보장할 수 없음 => eventually cancel

- web ui: job history

- bq cancel {job_id}: sync, bq --nosync cancel {job_id}

- jobs.cancel w/ job_id, prj_id

5. rerun a job

- web ui: query history => open query => run query

- jobs를 다시 실행 w/ job_id