1. 소개
워크플로는 사용자가 정의한 순서대로 Google Cloud 또는 외부 서비스를 실행하는 완전 관리형 조정 서비스입니다.
BigQuery는 머신러닝, 지리정보 분석, 비즈니스 인텔리전스와 같은 기본 제공 기능을 통해 테라바이트 단위의 데이터를 관리하고 분석하는 데 도움이 되는 완전 관리형 엔터프라이즈 데이터 웨어하우스입니다.
이 Codelab에서는 공개 Wikipedia 데이터 세트를 대상으로 BigQuery 쿼리를 실행합니다. 그런 다음 Workflows 조정의 일환으로 여러 BigQuery 쿼리를 순차적으로 차례로 실행하는 방법을 살펴봅니다. 마지막으로 Workflows의 병렬 반복 기능을 사용하여 쿼리를 병렬 처리하여 속도를 최대 5배 향상시킵니다.
학습할 내용
- Wikipedia 데이터 세트에 대해 BigQuery 쿼리를 실행하는 방법을 알아봅니다.
- Workflows 조정의 일부로 여러 쿼리를 순차적으로 실행하는 방법
- Workflows 병렬 반복을 사용하여 쿼리를 병렬화하여 속도를 최대 5배 향상시키는 방법입니다.
2. 설정 및 요구사항
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. Wikipedia 데이터 세트 살펴보기
먼저 BigQuery에서 Wikipedia 데이터 세트를 살펴봅니다.
Google Cloud 콘솔의 BigQuery 섹션으로 이동합니다.
bigquery-samples
아래에 일부 Wikipedia 관련 데이터 세트를 포함하여 다양한 공개 데이터 세트가 표시됩니다.
wikipedia_pageviews
데이터 세트에서 연도별 페이지 조회수에 대한 다양한 테이블을 볼 수 있습니다.
표 중 하나를 선택할 수 있습니다 (예: 201207
)하고 데이터를 미리 봅니다.
테이블에 대해 쿼리를 실행할 수도 있습니다. 예를 들어 다음 쿼리는 조회수가 가장 많은 상위 100개 타이틀을 선택합니다.
SELECT TITLE, SUM(views) FROM bigquery-samples.wikipedia_pageviews.201207h GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100
쿼리를 실행한 후 데이터를 로드하는 데 약 20초가 소요됩니다.
4. 여러 쿼리를 실행하는 워크플로 정의
단일 테이블에 대해 쿼리를 실행하는 것은 간단합니다. 하지만 여러 테이블에 대해 여러 쿼리를 실행하고 결과를 취합하는 작업은 상당히 지루할 수 있습니다. 이를 위해 Workflows에서 반복 문법을 활용할 수 있습니다.
Cloud Shell 내에서 workflow-serial.yaml
파일을 만들어 여러 테이블에 대해 여러 쿼리를 실행하는 워크플로를 빌드합니다.
touch workflow-serial.yaml
그런 다음 Cloud Shell의 편집기를 사용하여 파일을 수정할 수 있습니다.
workflow-serial.yaml
파일 내의 첫 번째 init
단계에서 테이블 이름으로 키가 지정된 각 반복을 추적하는 results
맵을 만듭니다. 또한 쿼리를 실행할 테이블 목록으로 tables
배열을 정의합니다. 이 경우 테이블 5개를 선택합니다.
main: steps: - init: assign: - results : {} - tables: - 201201h - 201202h - 201203h - 201204h - 201205h
다음으로 runQueries
단계를 정의합니다. 이 단계는 각 테이블을 반복하고 Workflows의 각 테이블에서 페이지 조회수가 가장 많은 상위 100개 도서를 찾는 쿼리를 실행하는 BigQuery 커넥터 그런 다음 각 테이블의 상위 제목과 뷰를 결과 맵에 저장합니다.
- runQueries: for: value: table in: ${tables} steps: - runQuery: call: googleapis.bigquery.v2.jobs.query args: projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")} body: useLegacySql: false useQueryCache: false timeoutMs: 30000 # Find the top 100 titles with most views on Wikipedia query: ${ "SELECT TITLE, SUM(views) FROM `bigquery-samples.wikipedia_pageviews." + table + "` WHERE LENGTH(TITLE) > 10 GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100" } result: queryResult - returnResult: assign: # Return the top title from each table - results[table]: {} - results[table].title: ${queryResult.rows[0].f[0].v} - results[table].views: ${queryResult.rows[0].f[1].v}
마지막 단계에서 results
맵을 반환합니다.
- returnResults: return: ${results}
5. Workflows로 여러 쿼리 실행
워크플로를 배포하고 실행하려면 먼저 Workflows API가 사용 설정되어 있는지 확인해야 합니다. Google Cloud 콘솔에서 또는 Cloud Shell의 gcloud
를 사용하여 사용 설정할 수 있습니다.
gcloud services enable workflows.googleapis.com
Workflows의 서비스 계정을 만듭니다.
SERVICE_ACCOUNT=workflows-bigquery-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Workflows BigQuery service account"
서비스 계정에 BigQuery 작업을 로깅하고 실행하는 역할이 있는지 확인합니다.
PROJECT_ID=your-project-id gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/logging.logWriter \ --role roles/bigquery.jobUser \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
서비스 계정으로 워크플로를 배포합니다.
gcloud workflows deploy bigquery-serial \ --source=workflow-serial.yaml \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
마지막으로 워크플로를 실행할 준비가 되었습니다.
Cloud 콘솔의 Workflows 섹션에서 bigquery-serial
워크플로를 찾아 Execute
버튼을 누릅니다.
또는 Cloud Shell에서 gcloud
를 사용하여 워크플로를 실행할 수도 있습니다.
gcloud workflows run bigquery-serial
워크플로 실행은 약 1분 (테이블 5개 각각 20초) 동안 지속됩니다.
마지막에는 인기 제목과 뷰가 포함된 각 표의 출력이 표시됩니다.
6. 병렬 단계로 여러 쿼리 병렬화
이전 단계의 워크플로는 각각 20초가 소요된 쿼리 5개를 실행했으므로 약 1분이 걸렸습니다. 이러한 쿼리는 독립적인 쿼리이므로 Workflows의 병렬 반복 기능을 사용하여 병렬로 실행할 수 있습니다.
workflow-serial.yaml
파일을 새 workflow-parallel.yaml
파일에 복사합니다. 새 파일에서는 직렬 단계를 병렬 단계로 변환하기 위해 몇 가지 변경사항을 적용합니다.
workflow-parallel.yaml
파일에서 runQueries
단계를 변경합니다. 먼저 parallel
키워드를 추가합니다. 이렇게 하면 for 루프의 각 반복을 병렬로 실행할 수 있습니다. 둘째, results
변수를 shared
변수로 선언합니다. 이렇게 하면 브랜치에서 변수를 쓸 수 있습니다. 각 결과를 이 변수에 추가합니다.
- runQueries: parallel: shared: [results] for: value: table in: ${tables}
병렬 워크플로를 배포합니다.
gcloud workflows deploy bigquery-parallel \ --source=workflow-parallel.yaml \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
워크플로를 실행합니다.
gcloud workflows run bigquery-parallel
워크플로 실행은 약 20초 동안 지속됩니다. 이는 5개의 쿼리가 모두 동시에 실행되기 때문입니다. 코드 몇 줄만 변경하면 속도가 최대 5배 향상됩니다.
최종적으로 각 표의 출력에는 인기 제목과 뷰가 포함되어 있지만 실행 시간은 훨씬 짧습니다.
7. 축하합니다
축하합니다. Codelab을 완료했습니다. 자세한 내용은 동시 단계에 대한 Workflows 문서를 참고하세요.
학습한 내용
- Wikipedia 데이터 세트에 대해 BigQuery 쿼리를 실행하는 방법을 알아봅니다.
- Workflows 조정의 일부로 여러 쿼리를 순차적으로 실행하는 방법
- Workflows 병렬 반복을 사용하여 쿼리를 병렬화하여 속도를 최대 5배 향상시키는 방법입니다.