快速上手使用AI DataLake查询数据
操作场景
AI DataLake是华为云提供的全托管的湖仓一体大数据分析服务,提供端到端的数据管理与分析能力,支持多种引擎的作业开发,满足多样化的大数据处理需求。
本文以通过创建计算资源池、配置Aura类型的端点、连接数据、在DataArts Studio提交作业为例,演示通过AI DataLake和DataArts Studio分析数据的操作指导。
操作流程
开始使用如下样例前,请务必按准备工作指导完成必要操作。
- 规划并创建OBS并行文件系统:创建一个用于存储LakeFormation Catalog和数据库的OBS并行文件系统。
- 规划并创建LakeFormation实例、Catalog、数据库:创建一个LakeFormation实例,并在该实例中创建Catalog及数据库。
- 创建工作空间:创建一个工作空间并绑定LakeFormation实例。
- 创建计算资源池:创建运行作业的计算资源。
- 创建运行作业的Aura端点:创建运行作业的Aura端点,并关联资源空间以获得运行作业的资源。
- 使用DataArts Studio运行作业:在DataArts Studio作业开发页面提交一个单任务Shell或Pipeline类型的AI DataLake作业至Aura端点运行,本入门以提交单任务Shell的AI DataLake作业为例进行演示。
准备工作
- 已注册账号并实名认证,且账号不能处于欠费或冻结状态。
- 已开通AI DataLake服务并授权使用云服务资源。
- 已开通LakeFormation、OBS权限并进行了委托确认。
- 已开通DataArts Studio服务,并创建了DataArts Studio实例及工作空间。
- 已构建镜像并上传至SWR中。构建镜像时需同时加入处理数据的Python脚本文件,例如“data_processer.py”,用于读取OBS上的CSV文件,并对每行数字求和,将结果写入新文件并保存到OBS中,内容为:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import csv import io from obs import ObsClient, PutObjectHeader import os class ObsCsvProcessor: def __init__(self, ak: str, sk: str, endpoint: str, bucket_name: str): """ 初始化OBS客户端 :param ak: Access Key ID :param sk: Secret Access Key :param endpoint: OBS终端节点 :param bucket_name: 存储桶名称 """ self.obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=endpoint) self.bucket_name = bucket_name def read_csv_from_obs(self, object_key: str) -> list: """ 从OBS读取CSV文件 :param object_key: 对象键,即文件在OBS中的路径 :return: 二维列表,每行是一个列表 """ resp = self.obs_client.getObject(bucketName=self.bucket_name, objectKey=object_key, loadStreamInMemory=True) if resp.status < 300: content = resp.body.buffer.decode('utf-8') # 使用csv模块解析 reader = csv.reader(io.StringIO(content)) data = [] for row in reader: # 将每行转换为int类型 int_row = [int(x) for x in row] data.append(int_row) return data else: raise Exception(f"读取OBS文件失败: {resp.errorCode}, {resp.errorMessage}") def write_csv_to_obs(self, object_key: str, data: list): """ 将数据写入OBS的CSV文件 :param object_key: 对象键,即文件在OBS中的路径 :param data: 二维列表 """ # 将数据转换为CSV格式 output = io.StringIO() writer = csv.writer(output) for row in data: writer.writerow(row) content = output.getvalue() # 上传到OBS # 1. Define the headers and set the content type correctly headers = PutObjectHeader() headers.contentType = 'text/csv' # 2. Call the method with the correct argument names resp = self.obs_client.putContent( bucketName=self.bucket_name, objectKey=object_key, content=content, headers=headers # Pass the header object here ) if resp.status >= 300: raise Exception(f"写入OBS文件失败: {resp.errorCode}, {resp.errorMessage}") def process_csv(self, input_key: str, output_key: str): """ 处理CSV文件:对每行求和 :param input_key: 输入文件的对象键 :param output_key: 输出文件的对象键 """ # 读取CSV data = self.read_csv_from_obs(input_key) print(f"读取到 {len(data)} 行数据") # 对每行求和 row_sums = [] for row in data: row_sum = sum(row) row_sums.append(row_sum) print(f"行 {row} 的和为: {row_sum}") # 将结果写入新文件(每行一个求和结果) self.write_csv_to_obs(output_key, [[s] for s in row_sums]) print(f"结果已写入: {output_key}") if __name__ == "__main__": # 配置参数 AK = os.environ.get("AK") SK = os.environ.get("SK") ENDPOINT = os.environ.get("OBS_ENDPOINT", "obs.xxx.xxx.xxx.com") # 根据实际区域选择 BUCKET_NAME = os.environ.get("BUCKET_NAME") INPUT_FILE = os.environ.get("INPUT_FILE") # 输入文件路径 input/data.csv OUTPUT_FILE = os.environ.get("OUTPUT_FILE") # 输出文件路径 output/sum_result.csv # 创建处理器并执行 processor = ObsCsvProcessor(AK, SK, ENDPOINT, BUCKET_NAME) processor.process_csv(INPUT_FILE, OUTPUT_FILE) - 已在本地准备数据文件,例如名称为“daata.csv”,内容如下:
1,2,3 4,5,6 7,8,9
- 已获取提交作业用户的AK、SK信息。
- 在管理控制台页面,鼠标移动至右上方的用户名,在下拉列表中选择“我的凭证”。
- 单击“访问密钥”页签,单击“新增访问密钥”,输入验证码或密码。单击“确定”,生成并下载访问密钥。在.csv文件中获取用户的AK、SK信息。
步骤一:规划并创建OBS并行文件系统
AI DataLake Aura通过OBS服务实现数据存储,需要先在OBS控制台进行桶及文件夹创建,并导入样例数据。
- 登录管理控制台。
- 在页面左上角单击
图标,选择“存储 > 对象存储服务”,进入对象存储服务页面。 - 以并行文件系统为例:
- 在并行文件系统页面,单击已创建的文件系统名称,例如“aura-job”。
- 在左侧导航栏选择“概览”,查看并记录“Endpoint(终端节点)”参数值。
- 在左侧导航栏选择“文件”,单击“新建文件夹”,填写待创建的文件夹名称,单击“确定”。继续单击该新创建的文件夹名称,单击“新建文件夹”,可以创建其子文件夹。
- 参考该步骤,依次创建用于存放CSV数据文件和结果文件、及LakeFormation元数据的路径,例如:
- 数据文件
- CSV数据文件存储路径:aura-job/input
- 数据处理结果文件存储路径:aura-job/output
- 元数据存储路径
- Catalog存储路径:aura-job/catalog1
- 数据库存储路径:aura-job/catalog1/database1
- 数据文件
- 将本地数据文件(例如“daata.csv””)上传至“input”路径下。
步骤二:规划并创建LakeFormation实例、Catalog、数据库
AI DataLake Aura通过LakeFormation服务管理数据源,需要在LakeFormation购买实例,并配置该实例的Catalog、数据库信息。
- 登录管理控制台。
- 在页面左上角单击,选择“大数据 > 湖仓构建 LakeFormation”,进入LakeFormation页面。
- 在“总览”页面右上角单击“购买实例”,配置相关参数购买LakeFormation实例。
- 在页面左上角选择切换到该实例。
图1 切换目标实例
- 创建Catalog。
- 在左侧导航栏选择“元数据 > Catalog”。
- 单击“创建Catalog”,配置以下参数后,单击“提交”。
- Catalog名称:输入Catalog名称,例如“catalog1”。
- 选择位置:单击“
”,选择存储位置,例如选择“obs://aura-serverless/catalog1”,单击“确定”。 - Catalog类型:选择“DEFAULT”。
- 其他参数保持默认。
- 创建完成后,即可在“Catalog”页面查看相关信息。
- 创建数据库。
步骤三:创建工作空间
- 登录AI DataLake管理控制台。
- 在左侧导航栏中,单击工作空间区域。
- 在下拉列表中选择“创建工作空间”。
- 配置工作空间的相关参数:
表1 创建工作空间参数说明 类型
参数
配置样例
说明
基础信息
工作空间名称
workspace_auratest
工作空间的具体名称。
- 名称只能包含字母、中文、数字、中划线、下划线。
- 输入长度为4~32个字符。
工作空间名称不区分大小写,系统会自动转换为小写。
描述
智能驾驶数据分析
对工作空间的简要描述。
企业项目
default
如果所建工作空间属于企业项目,可选择对应的企业项目。
企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。
关于如何设置企业项目请参考《企业管理用户指南》。
说明:只有开通了企业管理服务的用户才显示该参数。
多模数据管理
LakeFormation实例
lakeformation_for_auratest
选择当前工作空间关联的LakeFormation实例,即3创建的LakeFormation实例。
每个工作空间需关联1个LakeFormation实例,空间创建后已关联的实例不支持修改。
- 确认所有配置信息无误。
工作空间创建成功后,您可以在工作空间管理的列表中查看新创建的工作空间。
步骤四:创建计算资源池
- 在AI DataLake管理控制台页面,切换页面右上角的工作空间为步骤三:创建工作空间新创建的空间。
- 单击左侧导航栏的“新建”,在下拉框中选择“计算资源池”进入购买计算资源池页面。
- 在“购买计算资源池”界面,填写具体参数,参数填写参考表2。
表2 购买计算资源池参数说明 参数
配置样例
说明
计费模式
按需计费
选择“按需计费”。
按需计费即后付费模式,按实际使用量计费,在购买周期内资源独享,空闲时资源不被释放。
资源池名称
resource_pool_for_auratest
计算资源池的具体名称。
- 名称只能包含数字、小写英文字母和中划线,且只能以字母开头、以字母或数字结尾。
- 输入长度不能超过63个字符。
CPU 资源
本例配置8个通用计算标准型实例。
CPU是通用型计算资源,适用于各种类型的计算任务。
- CPU资源的特点:通用性强,适合各种类型的计算任务。相比于GPU和NPU的成本更低。擅长处理顺序执行的任务。
- CPU资源的适用场景:ETL 数据抽取、转换、加载;轻量计算场景,例如小规模数据处理、脚本运行,日志分析场景,例如日志采集、解析、统计分析。
- CPU资源的具体规格请参考产品规格
GPU 资源
本例不购买GPU实例
GPU是图形处理器适用于图形渲染和大规模并行计算场景,适合深度学习训练和科学计算。GPU拥有成百上千个计算核心,可以同时处理大量简单计算任务。
- GPU资源的特点:支持并行计算,适用于批处理作业场景,数千个核心同时计算,处理效率高。天然适合深度学习、神经网络、AI计算场景。
- GPU资源的适用场景:深度学习,例如神经网络训练、模型调优场景;图形处理场景,例如图像识别、目标检测;视频处理场景,例如视频分析、转码、视频渲染场景,等其他AI科学计算场景。
- GPU资源的具体规格请参考产品规格
NPU 资源
本例购买1个昇腾AI加速型(B3)1卡
NPU适用于AI计算场景。NPU资源采用架构优化和指令集,专门加速AI推理任务,具有高能效比的特点。
- NPU资源的特点:AI计算场景专用,具备高性能、低延迟、推理成本更优的特点。
- NPU资源的适用场景:AI计算场景、图像识别场景,推荐系统等AI计算设计场景。
- NPU资源的具体规格请参考产品规格
AI DataLake 网络
自定义
选择AI DataLake资源池所属网络,该网络基于虚拟私有云(VPC)进行封装。如果不存在可使用的网络,也可单击“创建网络”进行创建。
一个工作空间仅支持创建一个网络。
- 参数填写完成后,单击“立即购买”,在界面上确认当前配置是否正确。
- 单击“提交”完成创建。等待资源池状态变成“可使用”表示当前资源池创建成功。
步骤五:创建运行作业的Aura端点
- 在AI DataLake管理控制台页面,切换页面右上角的工作空间为步骤三:创建工作空间新创建的空间。
- 在左侧导航栏选择“引擎管理 > 多模数据引擎Aura”进入Aura引擎端点列表页面。
- 单击页面右上角的“创建端点”,配置以下参数并单击“立即创建”。
表3 创建Aura引擎端点 参数
配置样例
参数说明
端点类型
Job端点
选择端点类型。
- Job 端点:用于执行定时调度任务,保障大规模数据稳定处理。
端点名称
aura_endpoint_test001
输入端点名称。
- 名称只能包含小写字母、数字、中划线,且只能以字母开头,以字母或数字结尾。
- 输入长度不能超过63个字符。
资源使用模式
混合模式
选择资源使用模式。
- 预留模式:预留模式通过预留专属计算资源,确保业务所需的计算资源的稳定性,同时获得最优的单价成本。详细介绍请参见资源使用模式:预留模式。
- 混合模式:混合模式结合了预留资源和弹性资源,优先消耗预留资源,高峰期预留资源不足时调度弹性资源组合使用。预留资源保证了业务基线的稳定性,弹性资源的自动调度又具备应对突发负载的弹性能力。详细介绍请参见资源使用模式:混合模式。
选择资源池
resource_pool_for_auratest
在下拉框中选择步骤四:创建计算资源池已创建的资源池。
CPU资源
8
配置对应CPU的保障配额及最大配额。
- 静态余量:资源池中此规格资源尚未被“保障分配”的剩余容量。
- 保障配额 (Min):资源池分配给当前端点的最低可用资源,确保核心业务有资源可用。
- 最大配额 (Max):资源池分配给当前端点的资源上限,防止资源池资源被完全占用。
- 预留模式:参数取值范围为0~静态余量值,且需与保障配额值相同。
- 混合模式:参数取值可根据实际业务进行配置,即预估业务需使用的最大CPU配额。参数值需大于0。
CPU为通用计算处理器,适合数据处理、ETL、批处理等任务。
GPU资源
不涉及
配置对应GPU的保障配额及最大配额。
- 静态余量:资源池中此规格资源尚未被“保障分配”的剩余容量。
- 保障配额 (Min):资源池分配给当前端点的最低可用资源,确保核心业务有资源可用。
- 最大配额 (Max):资源池分配给当前端点的资源上限,防止资源池资源被完全占用。
- 预留模式:参数取值范围为0~静态余量值,且需与保障配额值相同。
- 混合模式:参数取值可根据实际业务进行配置,即预估业务需使用的最大CPU配额。参数值需大于0。
GPU为图形处理器,具有强大的并行计算能力。
NPU资源
24
配置对应NPU的保障配额及最大配额。
- 静态余量:资源池中此规格资源尚未被“保障分配”的剩余容量。
- 保障配额 (Min):资源池分配给当前端点的最低可用资源,确保核心业务有资源可用。
- 最大配额 (Max):资源池分配给当前端点的资源上限,防止资源池资源被完全占用。
- 预留模式:参数取值范围为0~静态余量值,且需与保障配额值相同。
- 混合模式:参数取值可根据实际业务进行配置,即预估业务需使用的最大CPU配额。参数值需大于0。
NPU为神经网络处理器,擅长AI推理任务。
日志对接LTS
勾选“日志对接LTD”
是否对接LTS。对接LTS后日志会投递到云日志服务(Log Tank Service,简称LTS)进行管理。可以使用LTS对云服务日志进行关键词搜索、运营数据统计分析、运行状况监控告警等多种操作。
勾选该参数后,还需配置“日志组”和“日志流”参数。
日志组
container_aurajob_test
在下拉框中选择日志组,如果下拉框中没有可选的日志组,可以单击“创建日志组”进行创建。
日志组(LogGroup)是云日志服务进行日志管理的基本单位,用于对日志流进行分类,一个日志组下面可以创建多个日志流。日志组本身不存储任何日志数据,仅方便管理日志流,每个账号下可以创建100个日志组。
日志流
container_job_log
在下拉框中选择日志流,如果下拉框中没有可选的日志流,可以单击“创建日志流”进行创建。
云日志服务是以日志流(LogStream)作为日志管理维度。日志采集后,以日志流为单位,将不同类型的日志分类存储在不同的日志流上,方便对日志进一步分类管理。
- 端点创建后,可在列表中查看相关信息,端点状态变为“已就绪”后即可提交作业到该端点中运行。
步骤六:使用DataArts Studio运行作业
- 在AI DataLake管理控制台页面,单击导航栏下方“DataArts Studio”右侧的按钮进入DataArts Studio作业开发界面。
- 选择左侧导航栏的“配置管理 > 配置”,单击“敏感参数”,在敏感参数配置页面单击“新增敏感参数”,配置以下参数并单击“确定”:
- 参数名:输入自定的参数名称,例如“SK”。
- 参数值:已获取的用户SK信息。
- 配置类型:选择“加密”。
- 在左侧导航栏选择“数据开发 > 作业开发”,在作业目录中,右键单击目录名称,选择“新建作业”。
- 在弹出的“新建作业”页面,配置如表4所示的参数。
表4 作业参数 参数
说明
作业名称
自定义作业的名称,只能包含英文字母、数字、中文、“-”、“_”、“.”,且长度为1~128个字符。
作业类型
选择作业的类型,选择“批处理作业”。
批处理作业:按调度计划定期处理批量数据,主要用于实时性要求低的场景。批作业是由一个或多个节点组成的流水线,以流水线作为一个整体被调度。被调度触发后,任务执行一段时间必须结束,即任务不能无限时间持续运行。
批处理作业可以配置作业级别的调度任务,即以作业为一整体进行调度,具体请参见配置作业调度任务(批处理作业)。
模式
选择作业模式。
选择目录
选择作业所属的目录,默认为根目录。
责任人
填写该作业的责任人。
作业优先级
选择作业的优先级,提供高、中、低三个等级。
说明:作业优先级是作业的一个标签属性,不影响作业的实际调度执行的先后顺序。
委托配置
配置委托后,作业执行过程中,以委托的身份与其他服务交互。如果该工作空间已配置过委托,参见配置公共委托,则新建的作业默认使用该工作空间级委托。您也可参见配置作业委托,修改为作业级委托。
说明:作业级委托优先于工作空间级委托。
日志路径
选择作业日志的OBS存储路径。日志默认存储在以dlf-log-{Projectid}命名的桶中。
说明:- 若您想自定义存储路径,请参见(可选)修改作业日志存储路径选择您已在OBS服务侧创建的桶。
- 请确保您已具备该参数所指定的OBS路径的读、写权限,否则系统将无法正常写日志或显示日志。
企业项目
单击右侧下拉框,选择当前用户已创建的企业项目。
作业描述
作业的描述信息。
- 单击“确定”,创建作业。
- 进入作业开发页面。
- 在SQL编辑器右侧,单击“基本信息”,可以配置作业的相关参数:
- 单任务SHELL作业:可以配置作业的基本信息、属性和高级信息等
- Pipeline作业:可以配置作业的基本信息,作业的属性和高级信息需双击Shell图标进行配置。
基本信息如表5所示,属性如表6所示,高级信息如表7所示。表5 作业基本信息 参数
说明
责任人
自动匹配创建作业时配置的作业责任人,此处支持修改。
执行用户
当“作业调度身份是否可配置”设置为“是”,该参数可见。设置“作业调度身份是否可配置”请参考配置调度身份。
执行作业的用户。如果输入了执行用户,则作业以执行用户身份执行;如果没有输入执行用户,则以提交作业启动的用户身份执行。
作业委托
当“作业调度身份是否可配置”设置为“是”,该参数可见。设置“作业调度身份是否可配置”请参考配置调度身份。
配置委托后,作业执行过程中,以委托的身份与其他服务交互。
作业优先级
自动匹配创建作业时配置的作业优先级,此处支持修改。
实例超时时间
配置作业实例的超时时间,设置为0或不配置时,该配置项不生效。如果您为作业设置了异常通知,当作业实例执行时间超过超时时间,将触发异常通知,发送消息给用户,作业不会中断,继续运行。
实例超时是否忽略等待时间
配置实例超时是否忽略等待时间。
- 如果勾选上,表示实例运行时等待时间不会被计入超时时间。
- 如果未选上,表示实例运行时等待时间会被计入超时时间。
自定义字段
配置自定义字段的参数名称和参数值。
作业标签
配置作业的标签,用以分类管理作业。
单击“新增”,可给作业重新添加一个标签。
作业描述
作业的描述信息。
表6 SQL作业属性信息 属性
说明
节点名称
仅Pipeline作业支持配置,表示SHELL节点名称。节点名称只能包含英文字母、数字、中文字符、中划线、下划线、/、<>和点号,且长度小于等于128个字符。
默认情况下,节点名称会和作业名称保持同步。
Shell或脚本
仅Pipeline作业支持配置,选择作业运行的方式,包括:
- Shell语句:需在“Shell语句”框中输入具体的Shell命令。
- Shell脚本:需在“Shell脚本”脚本中添加已准备好的Shell脚本,也可以单击
新建。
运行环境
选择“AI DataLake”。
镜像
选择镜像名称以及版本。
服务公测期间,需要您参考SWR的镜像操作指导自行准备镜像上传SWR。
端点
运行作业的Aura端点名称,单击
进入端点列表页面,选择步骤五:创建运行作业的Aura端点新创建的端点名称。资源配置
运行资源的配置信息。根据实际需求配置资源类型、规格、用量。
容器环境变量
容器运行时的环境变量配置,容器的环境变量要支持可传入空间变量/常量。
支持单个添加和批量添加。
批量添加时,通过文本模式,可以批量添加多个资源配置,最多添加100条。
运行本入门的示例需新增以下环境变量:
表7 高级参数 参数
是否必选
说明
节点状态轮询时间(秒)
是
设置轮询时间(1~60秒),每隔x秒查询一次节点是否执行完成。
节点运行过程中,根据设置的节点状态轮询时间查询节点是否执行完成。
节点执行的最长时间
是
设置节点执行的超时时间,如果节点配置了重试,在超时时间内未执行完成,该节点将会再次重试。
失败重试
是
节点执行失败后,是否重新执行节点。
- 是:重新执行节点,请配置以下参数。
- 超时重试
- 最大重试次数
- 重试间隔时间(秒)
- 否:默认值,不重新执行节点。
说明:- 如果作业节点配置了重试,并且配置了超时时间,该节点执行超时后,系统支持再重试。
- 当节点运行超时导致的失败不会重试时,您可前往“默认项设置”修改此策略。
- 当“失败重试”配置为“是”才显示“超时重试”。
当前节点失败后,后续节点处理策略
是
当前节点执行失败后,后续节点的处理策略:
- 终止当前作业执行计划:终止当前作业运行,当前作业实例状态显示为“失败”。如果是周期调度作业,后续周期调度会正常运行。
- 忽略失败,作业结果设为成功:忽略当前节点失败,当前作业实例状态显示为“忽略是失败”。如果是周期调度作业,后续周期调度会正常运行。
- 如果运行单任务SHELL作业,需在SQL编辑器中输入SQL语句,支持输入多条SQL语句。例如:
python3 /opt/cloud/data_processer.py
- SQL语句之间以“;”分隔。如果其它地方使用“;”,请通过“\”进行转义。例如:
select 1; select * from a where b="dsfa\;"; --example 1\;example 2.
- SQL脚本内容大小不能超过1MB。
- 使用SQL语句获取的系统日期和通过数据库工具获取的系统日期是不一样,查询结果存到数据库是以YYYY-MM-DD格式,而页面显示查询结果是经过转换后的格式。
- 请勿输入敏感信息,例如ak、sk、password、authorization等信息。
- SQL语句之间以“;”分隔。如果其它地方使用“;”,请通过“\”进行转义。例如:
-
单击画布上方的“提交”提交作业,再单击运行按钮
,运行作业。
用户可以查看该作业的运行日志,单击“查看日志”可以进入查看日志界面查看日志的详细信息记录,在日志信息中搜索“jobId”即可获取该作业的ID。
运行完成后,单击画布上方的保存按钮
,保存作业的配置信息。保存后,在右侧的版本里面,会自动生成一个保存版本,支持版本回滚。保存版本时,一分钟内多次保存只记录一次版本。对于中间数据比较重要时,可以通过“新增版本”按钮手动增加保存版本。
- (可选)如果运行的为调度作业,可返回数据开发首页,在左侧导航栏选择“运维调度 > 作业监控”,在列表中单击提交的作业名称,即可查看作业状态,“运行成功”即表示作业执行成功。
- 返回AI DataLake管理控制台,切换工作空间,并在左侧导航栏选择“引擎管理 > 多模数据引擎 Aura”,单击运行作业的Aura端点名称,选择“作业运行历史”,可通过作业ID查看作业运行相关信息。
- 查看数据结果文件内容。
- 在页面左上角单击
图标,选择“存储 > 对象存储服务”,进入对象存储服务页面。 - 选择“并行文件系统”进入并行文件系统列表页面,单击存放结果文件的文件系统名称,例如“aura-job”。
- 单击存放结果文件的目录,例如“output”,获取结果文件“sum_result.csv”,并下载至本地查看文件内容,例如内容为:
6 15 24
- 在页面左上角单击
