▩ 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