1. 소개
이 Codelab에서는 Spanner Data Boost를 사용하여 제로 ETL 페더레이션 쿼리를 통해 BigQuery에서 Spanner 데이터를 쿼리하고 Spanner 데이터베이스에 영향을 주지 않는 방법을 알아봅니다.

Spanner Data Boost는 지원되는 Spanner 워크로드에 독립적인 컴퓨팅 리소스를 제공하는 완전 관리형 서버리스 서비스입니다. Data Boost를 사용하면 서버리스 주문형 사용 모델을 통해 프로비저닝된 Spanner 인스턴스의 기존 워크로드에 거의 영향을 주지 않고 분석 쿼리 및 데이터 내보내기를 실행할 수 있습니다.
BigQuery 외부 연결과 함께 사용하면 Data Boost를 통해 복잡한 ETL 데이터 이동 없이 Spanner의 데이터를 데이터 분석 플랫폼으로 쉽게 쿼리할 수 있습니다.
기본 요건
- Google Cloud 콘솔에 관한 기본적인 이해
- 명령줄 인터페이스 및 Google Shell의 기본 기술
학습할 내용
- 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에 있는 파일을 사용하여 데이터 흐름 가져오기 작업을 시작하여 데이터를 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} 값을 프로젝트 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 스튜디오로 돌아가 시스템 통계로 이동합니다.

여기에서 CPU 측정항목을 확인할 수 있습니다. Data Boost 없이 실행되는 쿼리는 'executesql_select_withpartitiontoken' 작업에 CPU를 사용합니다. 쿼리는 동일하지만 데이터 부스트 실행은 인스턴스 CPU 사용률에 표시되지 않습니다.

Data Boost를 사용하면 분석 쿼리의 성능이 향상되는 경우가 많습니다. 이 튜토리얼의 데이터 세트는 작고 리소스를 두고 경쟁하는 다른 워크로드가 없습니다. 따라서 이 튜토리얼에서는 성능 개선을 보여주지 않습니다.
쿼리 및 워크로드를 자유롭게 사용해 보면서 Data Boost가 어떻게 작동하는지 확인해 보세요. 완료되면 다음 섹션으로 진행하여 환경을 정리합니다.
8. 환경 정리
이 Codelab을 위해 특별히 프로젝트를 만든 경우 프로젝트를 삭제하여 정리하면 됩니다. 프로젝트를 유지하고 개별 구성요소를 정리하려면 다음 단계를 따르세요.
BigQuery 연결 삭제
두 연결을 모두 삭제하려면 연결 이름 옆에 있는 점 3개를 클릭합니다. '삭제'를 선택한 다음 안내에 따라 연결을 삭제합니다.

Cloud Storage 버킷 삭제
gcloud storage rm --recursive gs://$GCS_BUCKET
Spanner 인스턴스 삭제
정리하려면 Cloud Console의 Cloud Spanner 섹션으로 이동하고 Codelab에서 만든 'codelab-demo' 인스턴스를 삭제하면 됩니다.

9. 축하합니다
축하합니다. Codelab을 완료했습니다.
학습한 내용
- Spanner 인스턴스를 배포하는 방법
- Dataflow를 사용하여 Spanner에 데이터를 로드하는 방법
- BigQuery에서 Spanner 데이터에 액세스하는 방법
- Spanner Data Boost를 사용하여 BigQuery의 분석 쿼리가 Spanner 인스턴스에 미치는 영향을 방지하는 방법
10. 설문조사
결과: