1. 소개
이 Codelab에서는 Spanner 데이터베이스에 영향을 주지 않고 Spanner Data Boost를 사용하여 제로 ETL 통합 쿼리를 사용하여 BigQuery에서 Spanner 데이터를 쿼리하는 방법을 알아봅니다.
Spanner Data Boost는 지원되는 Spanner 워크로드에 독립적인 컴퓨팅 리소스를 제공하는 완전 관리형 서버리스 서비스입니다. Data Boost를 사용하면 서버리스 주문형 사용 모델을 사용하여 프로비저닝된 Spanner 인스턴스의 기존 워크로드에 거의 영향을 주지 않으면서 분석 쿼리 및 데이터 내보내기를 실행할 수 있습니다.
Data Boost를 BigQuery 외부 연결과 함께 사용하면 복잡한 ETL 데이터 이동 없이 Spanner에서 데이터 분석 플랫폼으로 데이터를 쉽게 쿼리할 수 있습니다.
기본 요건
- Google Cloud, 콘솔에 관한 기본적인 이해
- 명령줄 인터페이스 및 Google 셸의 기본 기술
학습할 내용
- Spanner 인스턴스 배포 방법
- 데이터를 로드하여 Spanner 데이터베이스를 만드는 방법
- Data Boost 없이 BigQuery에서 Spanner 데이터에 액세스하는 방법
- Data Boost를 사용하여 BigQuery에서 Spanner 데이터에 액세스하는 방법
필요한 항목
- Google Cloud 계정 및 Google Cloud 프로젝트
- 웹브라우저(예: Chrome)
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달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. Spanner 인스턴스 및 데이터베이스 만들기
Spanner API 사용 설정
Cloud Shell 내에 프로젝트 ID가 설정되어 있는지 확인합니다.
gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
기본 리전을 us-central1
(으)로 구성합니다. Spanner 리전 구성이 지원하는 다른 리전으로 자유롭게 변경하세요.
gcloud config set compute/region us-central1
Spanner API를 사용 설정합니다.
gcloud services enable spanner.googleapis.com
Spanner 인스턴스 만들기
이 단계에서는 Codelab을 위한 Spanner 인스턴스를 설정합니다. 이렇게 하려면 Cloud Shell을 열고 다음 명령어를 실행합니다.
export SPANNER_INSTANCE_ID=codelab-demo
export SPANNER_REGION=regional-us-central1
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1
명령어 결과:
$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1
Creating instance...done.
데이터베이스 만들기
인스턴스가 실행되면 데이터베이스를 만들 수 있습니다. Spanner는 단일 인스턴스에서 여러 데이터베이스를 허용합니다.
데이터베이스는 스키마를 정의하는 곳입니다. 또한 데이터베이스에 액세스할 수 있는 사용자를 제어하고, 커스텀 암호화를 설정하고, 최적화 도구를 구성하고, 보관 기간을 설정할 수 있습니다.
데이터베이스를 만들려면 다시 gcloud 명령줄 도구를 사용합니다.
export SPANNER_DATABASE=codelab-db
gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
명령어 결과:
$ gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
Creating database...done.
4. 데이터 로드
Data Boost를 사용하려면 데이터베이스에 데이터가 있어야 합니다. 이렇게 하려면 Cloud Storage 버킷을 만들고 버킷에 avro 가져오기를 업로드한 다음 Dataflow 가져오기 작업을 시작하여 Avro 데이터를 Spanner에 로드합니다.
API 사용 설정
이렇게 하려면 이전 프롬프트가 닫혀 있다면 Cloud Shell 프롬프트를 엽니다.
Compute, Cloud Storage, Dataflow API를 사용 설정해야 합니다.
gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com
예상되는 콘솔 출력:
$ gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com
Operation "operations/acat.*snip*" finished successfully.
Cloud Storage에서 가져오기 파일 준비
이제 avro 파일을 저장할 버킷을 만듭니다.
export GCS_BUCKET=spanner-codelab-import_$(date '+%Y-%m-%d_%H_%M_%S')
gcloud storage buckets create gs://$GCS_BUCKET
예상되는 콘솔 출력:
$ gcloud storage buckets create gs://$GCS_BUCKET
Creating gs://spanner-codelab-import/...
그런 다음 GitHub에서 tar 파일을 다운로드하고 압축을 풉니다.
wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
tar -xzvf spanner-chat-db.tar.gz
예상되는 콘솔 출력:
$ wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
*snip*
*snip*(123 MB/s) - ‘spanner-chat-db.tar.gz' saved [46941709/46941709]
$
$ tar -xzvf spanner-chat-db.tar.gz
spanner-chat-db/
spanner-chat-db/users.avro-00000-of-00002
spanner-chat-db/user_notifications-manifest.json
spanner-chat-db/interests-manifest.json
spanner-chat-db/users-manifest.json
spanner-chat-db/users.avro-00001-of-00002
spanner-chat-db/topics-manifest.json
spanner-chat-db/topics.avro-00000-of-00002
spanner-chat-db/topics.avro-00001-of-00002
spanner-chat-db/user_interests-manifest.json
spanner-chat-db/spanner-export.json
spanner-chat-db/interests.avro-00000-of-00001
spanner-chat-db/user_notifications.avro-00000-of-00001
spanner-chat-db/user_interests.avro-00000-of-00001
이제 만든 버킷에 파일을 업로드합니다.
gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive
예상되는 콘솔 출력:
$ gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive
Copying file://spanner-chat-db/users.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00000-of-00002
Copying file://spanner-chat-db/user_notifications-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_notifications-manifest.json
Copying file://spanner-chat-db/interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/interests-manifest.json
Copying file://spanner-chat-db/users-manifest.json to gs://spanner-codelab-import/spanner-chat-db/users-manifest.json
Copying file://spanner-chat-db/users.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00001-of-00002
Copying file://spanner-chat-db/topics-manifest.json to gs://spanner-codelab-import/spanner-chat-db/topics-manifest.json
Copying file://spanner-chat-db/topics.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00000-of-00002
Copying file://spanner-chat-db/topics.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00001-of-00002
Copying file://spanner-chat-db/user_interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_interests-manifest.json
Copying file://spanner-chat-db/spanner-export.json to gs://spanner-codelab-import/spanner-chat-db/spanner-export.json
Copying file://spanner-chat-db/interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/interests.avro-00000-of-00001
Copying file://spanner-chat-db/user_notifications.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_notifications.avro-00000-of-00001
Copying file://spanner-chat-db/user_interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_interests.avro-00000-of-00001
Completed files 13/13 | 54.6MiB/54.6MiB
Average throughput: 46.4MiB/s
데이터 가져오기
Cloud Storage의 파일로 Dataflow 가져오기 작업을 시작하여 데이터를 Spanner에 로드할 수 있습니다.
gcloud dataflow jobs run import_chatdb \
--gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
--region us-central1 \
--staging-location gs://$GCS_BUCKET/tmp \
--parameters \
instanceId=$SPANNER_INSTANCE_ID,\
databaseId=$SPANNER_DATABASE,\
inputDir=gs://$GCS_BUCKET/spanner-chat-db
예상되는 콘솔 출력:
$ gcloud dataflow jobs run import_chatdb \
> --gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
> --region us-central1 \
> --staging-location gs://$GCS_BUCKET/tmp \
> --parameters \
> instanceId=$SPANNER_INSTANCE_ID,\
> databaseId=$SPANNER_DATABASE,\
> inputDir=gs://$GCS_BUCKET/spanner-chat-db
createTime: '*snip*'
currentStateTime: '*snip*'
id: *snip*
location: us-central1
name: import_chatdb
projectId: *snip*
startTime: '*snip*'
type: JOB_TYPE_BATCH
다음 명령어로 가져오기 작업의 상태를 확인할 수 있습니다.
gcloud dataflow jobs list --filter="name=import_chatdb" --region us-central1
예상되는 콘솔 출력:
$ gcloud dataflow jobs list --filter="name=import_chatdb"
`--region` not set; getting jobs from all available regions. Some jobs may be missing in the event of an outage. https://cloud.google.com/dataflow/docs/concepts/regional-endpoints
JOB_ID NAME TYPE CREATION_TIME STATE REGION
*snip* import_chatdb Batch 2024-04-*snip* Done us-central1
Spanner에서 데이터 확인
이제 Spanner Studio로 이동하여 데이터가 있는지 확인합니다. 먼저 주제 표를 펼쳐 열을 확인합니다.
이제 다음 쿼리를 실행하여 데이터를 사용할 수 있는지 확인합니다.
SELECT COUNT(*) FROM topics;
예상 출력:
5. BigQuery에서 데이터 읽기
이제 Spanner에 데이터가 있으므로 BigQuery 내에서 데이터에 액세스할 차례입니다. 이렇게 하려면 BigQuery에서 Spanner에 대한 외부 연결을 설정합니다.
적절한 권한이 있다고 가정하고 다음 단계에 따라 Spanner에 대한 외부 연결을 만듭니다.
'추가'를 클릭합니다. BigQuery 콘솔 상단에 있는 '영구 데이터 소스 연결'을 선택합니다. 옵션을 선택합니다.
이제 쿼리를 실행하여 Spanner에서 데이터를 읽을 수 있습니다. BigQuery 콘솔에서 다음 쿼리를 실행하고 ${PROJECT_ID} 값을 대체해야 합니다.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
출력 예시:
'작업 정보'에서 실행에 걸린 시간 및 처리된 데이터의 양과 같은 작업에 대한 정보를 확인할 수 있습니다. 탭
다음으로 Spanner에 Data Boost 연결을 추가하고 결과를 비교합니다.
6. Data Boost를 사용하여 데이터 읽기
Spanner Data Boost를 사용하려면 BigQuery에서 Spanner로의 새로운 외부 연결을 만들어야 합니다. '추가'를 클릭합니다. BigQuery 콘솔에서 ‘Connections from external data sources
’을(를) 선택합니다. 다시 시도합니다.
Spanner에 대한 동일한 연결 URI로 세부정보를 입력합니다. '연결 ID'를 변경합니다. '데이터 부스트 사용' 체크박스를 선택합니다.
Data Boost 연결이 생성되면 동일한 쿼리를 새 연결 이름으로 실행할 수 있습니다. 다시 쿼리에서 project_id로 대체합니다.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
이전과 동일한 결과 집합이 표시됩니다. 시기가 변경되었나요?
7. Data Boost 이해
Spanner Data Boost를 사용하면 Spanner 인스턴스 리소스와 관련 없는 리소스를 사용할 수 있습니다. 이를 통해 주로 분석 워크로드가 운영 워크로드에 미치는 영향을 줄일 수 있습니다.
2~3분 동안 Data Boost를 몇 번 사용하지 않도록 쿼리를 실행하면 이 사실을 알 수 있습니다. ${PROJECT_ID}
를 대체해야 합니다.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
그런 다음 몇 분 더 기다렸다가 쿼리를 실행하여 Data Boost를 몇 번 더 사용합니다. ${PROJECT_ID}
를 대체해야 합니다.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
이제 Cloud 콘솔에서 Spanner Studio로 돌아가서 시스템 통계로 이동합니다.
여기에서 CPU 측정항목을 확인할 수 있습니다. Data Boost 없이 실행된 쿼리는 'executesql_select_withpartitiontoken'에 CPU를 사용하고 있습니다. 작업을 수행할 수 있습니다 쿼리는 동일하더라도 인스턴스 CPU 사용률에 Data Boost 실행이 표시되지 않습니다.
대부분의 경우 Data Boost를 사용하면 분석 쿼리의 성능이 향상됩니다. 이 가이드의 데이터 세트는 작고 리소스를 두고 경쟁하는 다른 워크로드가 없습니다. 따라서 이 튜토리얼에서는 성능 개선사항을 보여주지 않습니다.
쿼리와 워크로드를 자유롭게 살펴보고 Data Boost의 작동 방식을 확인해 보세요. 작업을 완료하면 다음 섹션으로 이동하여 환경을 삭제합니다.
8. 환경 정리
이 Codelab을 위해 특별히 프로젝트를 만든 경우 프로젝트를 삭제하기만 하면 됩니다. 프로젝트를 유지하고 개별 구성요소를 삭제하려면 다음 단계를 진행합니다.
BigQuery 연결 삭제
두 연결을 모두 제거하려면 연결 이름 옆에 있는 세 개의 점을 클릭합니다. '삭제'를 선택한 후 안내에 따라 연결을 삭제합니다.
Cloud Storage 버킷 삭제
gcloud storage rm --recursive gs://$GCS_BUCKET
Spanner 인스턴스 삭제
삭제하려면 Cloud 콘솔의 Cloud Spanner 섹션으로 이동한 후 ‘codelab-demo
’ 파일을 삭제하면 됩니다. 인스턴스를 만들겠습니다
9. 축하합니다
축하합니다. Codelab을 완료했습니다.
학습한 내용
- Spanner 인스턴스 배포 방법
- Dataflow를 사용하여 Spanner에 데이터를 로드하는 방법
- BigQuery에서 Spanner 데이터에 액세스하는 방법
- Spanner Data Boost를 사용하여 BigQuery의 분석 쿼리에 대한 Spanner 인스턴스가 영향을 받지 않도록 하는 방법
10. 설문조사
결과: