使用 Cloud Run functions 加载 BigQuery
实验
45 分钟
universal_currency_alt
5 个积分
show_chart
入门级
info
此实验可能会提供 AI 工具来支持您学习。
概览
Cloud Run 函数是为了响应事件(如 HTTP 请求、通讯服务消息或文件上传)而运行的代码段。云端事件是指在云端环境中发生的事件,这些事件可能包括更改数据库中的数据,将文件添加到存储系统,或正在创建新的虚拟机实例等。
Cloud Run 函数由事件驱动,因而在事件发生时才会运行。这类函数非常适合执行需要快速完成或不需要一直运行的任务。
本实操实验将向您介绍如何使用 Google Cloud SDK 创建、部署和测试将会加载 BigQuery 表的 Cloud Run 函数。
您将执行的操作
- 创建 Cloud Run 函数
- 部署和测试该 Cloud Run 函数
- 查看 BigQuery 中的数据和 Cloud Run 函数日志
设置和要求
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Google Cloud Shell
Google Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。
Google Cloud Shell 提供了可用于访问您的 Google Cloud 资源的命令行工具。
-
在 Cloud 控制台右上角的工具栏中,点击“打开 Cloud Shell”按钮。

-
点击继续。
预配并连接到环境需要一些时间。如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 PROJECT_ID。例如:

gcloud 是 Google Cloud 的命令行工具。它会预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
gcloud auth list
输出:
Credentialed accounts:
- @.com (active)
输出示例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
gcloud config list project
输出:
[core]
project =
输出示例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注意:有关 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
任务 1. 启用 API
在此任务中,您需要先启用相关 API,然后再创建 Cloud Run 函数。
- 在 Cloud Shell 中运行以下命令,以设置项目 ID 变量:
export PROJECT_ID=$(gcloud config get-value project)
- 运行以下命令来设置区域变量:
export REGION={{{project_0.default_region | "REGION"}}}
gcloud config set compute/region $REGION
- 运行以下命令来设置配置变量:
gcloud config set run/region $REGION
gcloud config set run/platform managed
gcloud config set eventarc/location $REGION
- 运行以下命令来启用所有必要的服务:
gcloud services enable \
artifactregistry.googleapis.com \
cloudfunctions.googleapis.com \
cloudbuild.googleapis.com \
eventarc.googleapis.com \
run.googleapis.com \
logging.googleapis.com \
pubsub.googleapis.com
注意:对于 Eventarc,可能需要几分钟才能将所有权限传播到服务代理
任务 2. 设置所需权限
在此任务中,您将向默认 Compute Engine 服务账号授予接收 Eventarc 事件的权限,并向 Cloud Storage 服务代理授予向 Pub/Sub 主题发布消息的权限,从而启用事件驱动型工作流和存储触发的操作。
- 在 Cloud Shell 中运行以下命令,以设置 PROJECT_NUMBER 变量:
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
- 运行以下命令,为项目内的默认 Compute Engine 服务账号授予接收 Eventarc 事件的必要权限:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/eventarc.eventReceiver"
- 运行以下命令,以检索项目的 Cloud Storage 服务代理,并向其授予将消息发布到 Pub/Sub 主题的权限:
SERVICE_ACCOUNT="$(gcloud storage service-agent --project=$PROJECT_ID)"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role='roles/pubsub.publisher'
任务 3. 创建函数
在此任务中,您将创建一个名为 loadBigQueryFromAvro 的简单函数。该函数会读取上传到 Cloud Storage 的 Avro 文件,然后在 BigQuery 中创建并加载表。
- 在 Cloud Shell 中运行以下命令,创建并打开名为
index.js
的文件:
nano index.js
- 将以下 Cloud Functions 函数代码复制到
index.js
文件中:
/**
* index.js Cloud Function - Avro on GCS to BQ
*/
const {Storage} = require('@google-cloud/storage');
const {BigQuery} = require('@google-cloud/bigquery');
const storage = new Storage();
const bigquery = new BigQuery();
exports.loadBigQueryFromAvro = async (event, context) => {
try {
// Check for valid event data and extract bucket name
if (!event || !event.bucket) {
throw new Error('Invalid event data. Missing bucket information.');
}
const bucketName = event.bucket;
const fileName = event.name;
// BigQuery configuration
const datasetId = 'loadavro';
const tableId = fileName.replace('.avro', '');
const options = {
sourceFormat: 'AVRO',
autodetect: true,
createDisposition: 'CREATE_IF_NEEDED',
writeDisposition: 'WRITE_TRUNCATE',
};
// Load job configuration
const loadJob = bigquery
.dataset(datasetId)
.table(tableId)
.load(storage.bucket(bucketName).file(fileName), options);
await loadJob;
console.log(`Job ${loadJob.id} completed. Created table ${tableId}.`);
} catch (error) {
console.error('Error loading data into BigQuery:', error);
throw error;
}
};
- 在 nano 中,按 (Ctrl+x),然后按 (Y),再按 Enter 保存文件。
创建函数。
任务 4. 创建 Cloud Storage 存储桶和 BigQuery 数据集
在此任务中,您将设置后台基础设施来存储用于调用 Cloud Run 函数的资产(Cloud Storage 存储桶),并在完成后将输出存储在 BigQuery 中。
- 在 Cloud Shell 中运行以下命令,创建一个新的 Cloud Storage 存储桶作为暂存位置:
gcloud storage buckets create gs://$PROJECT_ID --location=$REGION
- 运行以下命令,创建 BQ 数据集以存储数据:
bq mk -d loadavro
创建 Cloud Storage 存储桶和 BigQuery 数据集。
任务 5. 部署函数
在此任务中,您将部署新的 Cloud Run 函数并触发该函数,以便将数据加载到 BigQuery 中。
- 在 Cloud Shell 中运行以下命令,安装两个 JavaScript 库,以便从 Cloud Storage 读取数据并将输出存储在 BigQuery 中:
npm install @google-cloud/storage @google-cloud/bigquery
- 运行以下命令以部署函数:
gcloud functions deploy loadBigQueryFromAvro \
--gen2 \
--runtime nodejs20 \
--source . \
--region $REGION \
--trigger-resource gs://$PROJECT_ID \
--trigger-event google.storage.object.finalize \
--memory=512Mi \
--timeout=540s \
--service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
注意:如果您看到与 Eventarc 服务代理传播相关的错误消息,请等待几分钟,然后再次尝试运行该命令。
- 运行以下命令以确认触发器是否已成功创建。输出将如下所示:
gcloud eventarc triggers list --location=$REGION
NAME: loadbigqueryfromavro-177311
TYPE: google.cloud.storage.object.v1.finalized
DESTINATION: Cloud Functions: loadBigQueryFromAvro
ACTIVE: Yes
LOCATION: europe-west1
- 运行以下命令,下载 Avro 文件。该文件将由 Cloud Run 函数处理,以便存储在 BigQuery 中:
wget https://storage.googleapis.com/cloud-training/dataengineering/lab_assets/idegc/campaigns.avro
- 运行以下命令,将 Avro 文件移动到之前创建的用于暂存的 Cloud Storage 存储桶中。此操作将触发 Cloud Run 函数:
gcloud storage cp campaigns.avro gs://{{{project_0.project_id |PROJECT_ID}}}
部署函数。
任务 6. 确认数据已加载到 BigQuery 中
在此任务中,您将使用 bq
命令查询 loadavro.campaigns
表,确认由 Cloud Run 函数处理的数据已成功加载到 BigQuery 中
- 在 Cloud Shell 中运行以下命令,使用 bq 命令查看 BigQuery 新表中的数据:
bq query \
--use_legacy_sql=false \
'SELECT * FROM `loadavro.campaigns`;'
注意:Cloud Run 函数通常很快就会运行完毕,但针对 BigQuery 运行的查询有可能不会返回结果。如果发生这种情况,请稍等片刻,然后再次运行查询。
查询应该会返回类似下面这样的结果:
输出示例:
+------------+--------+---------------------+--------+---------------------+----------+-----+
| created_at | period | campaign_name | amount | advertising_channel | bid_type | id |
+------------+--------+---------------------+--------+---------------------+----------+-----+
| 2020-09-17 | 90 | NA - Video - Other | 41 | Video | CPC | 81 |
| 2021-01-19 | 30 | NA - Video - Promo | 325 | Video | CPC | 137 |
| 2021-06-28 | 30 | NA - Video - Promo | 78 | Video | CPC | 214 |
| 2021-03-15 | 30 | EU - Search - Brand | 465 | Search | CPC | 170 |
| 2022-01-01 | 30 | EU - Search - Brand | 83 | Search | CPC | 276 |
| 2020-02-18 | 30 | EU - Search - Brand | 30 | Search | CPC | 25 |
| 2021-06-08 | 30 | EU - Search - Brand | 172 | Search | CPC | 201 |
| 2020-11-29 | 60 | EU - Search - Other | 83 | Search | CPC | 115 |
| 2021-09-11 | 30 | EU - Search - Other | 86 | Search | CPC | 237 |
| 2022-02-17 | 30 | EU - Search - Other | 64 | Search | CPC | 296 |
+------------+--------+---------------------+--------+---------------------+----------+-----+
任务 7. 查看日志
在此任务中,您将检索与名为 loadBigQueryFromAvro 的服务关联的所有日志条目。
- 在 Cloud Shell 中运行以下命令,检查您的 Cloud Run 函数的日志:
gcloud logging read "resource.labels.service_name=loadBigQueryFromAvro"
日志中的消息类似于如下内容:
resource:
labels:
configuration_name: loadbigqueryfromavro
location: europe-west1
project_id: qwiklabs-gcp-04-16fde64676e4
revision_name: loadbigqueryfromavro-00001-wim
service_name: loadbigqueryfromavro
type: cloud_run_revision
spanId: '5804952652695382607'
textPayload: |
Job undefined completed. Created table campaigns.
timestamp: '2025-03-10T17:24:43.560594Z'
恭喜!
您已使用 Google Cloud SDK 创建、部署和测试了用于创建并加载 BigQuery 表的 Cloud Run 函数。
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名称和产品名称可能是其各自相关公司的商标。