华为云用户手册

  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.912中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──AscendFactory |──examples/ # config配置文件目录 |──data.tgz # 样例数据压缩包 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──intall.sh # 需要的依赖包 |──scripts_llamafactory/ # llamafactory兼容旧版本启动方式目录 |──scripts_modellink/ # modelLink兼容旧版本启动方式目录 |──Dockerfile
  • 工作目录介绍 详细的工作目录参考如下,建议参考以下要求设置工作目录。训练脚本以分类的方式集中在scripts文件夹中。 ${workdir}(例如/home/ma-user/ws ) |──llm_train # 模型训练代码包 |──AscendFactory |──examples/config/ # 配置文件 |──deepspeed/ # deepspeed配置json文件 |──modellink_performance_cfgs.yaml # ModelLink训练配置json文件 |──....... |──data.tgz #样例数据压缩包 |──intall.sh # 需要的依赖包 |──scripts_modellink/ # modelLink兼容旧版本启动方式目录 |──llama3 # llama3系列模型执行脚本的文件夹 |──qwen2.5 # Qwen2.5系列模型执行脚本的文件夹 |── ... |── dev_pipeline.sh # 系列模型共同调用的多功能的脚本 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──ascendcloud_patch/ # patch补丁包 |──benchmark/ #工具包,存放数据集及基线数据 |──trainer.py # 训练启动脚本 |──performance.py # benchmark训练性能比较启动脚本 |──accuracy.py # benchmark训练精度启动脚本 |──model/Qwen2-7B/ # 权重词表文件目录,如Qwen2-7B |──training_data # 原始数据目录 |──alpaca_gpt4_data.json # 微调数据 |──train-00000-of-00001-a09b74b3ef9c3b56.parquet #预训练数据 |──{output_dir} #{OUTPUT_SAVE_DIR}或yaml文件{output_dir}参数设置值 # 自动生成数据目录结构 |── preprocessed_data |──converted_hf2mg_weight_TP${TP}PP${PP} |──checkpoint # 训练完成生成目录Qwen2-7B,自动生成
  • Step4 开启训练故障自动重启功能 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图3 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置接续训练,加载中断生成的checkpoint,中间不需要改动任何参数。可以通过训练脚本中的SAVE_INTERVAL参数来指定间隔多少step保存checkpoint。 如果要使用自动重启功能,资源规格必须选择八卡规格,设置超参train_auto_resume为True的前提下,默认为Fasle。 训练作业中的训练故障自动恢复功能包括: 训练容错检查(自动重启),帮助用户隔离故障节点,优化用户训练体验。详细可了解:训练容错检查 无条件自动重启,不管什么原因系统都会自动重启训练作业,提高训练成功率和提升作业的稳定性。详细可了解:无条件自动重启。
  • Step2 配置数据输入和输出 单击“增加训练输入”和“增加训练输出”,用于配置训练作业开始时需要输入数据的路径和训练结束后输出数据的路径。 输入指定的目录在训练开始时,平台会自动将指定的OBS路径下的文件copy到容器内 输出指定的目录在训练过程中,平台会自动将容器内的文件copy到指定的OBS路径下 在“输入”框内设置超参配置:dataset、processed_data_dir、user_converted_ckpt_path、model_name_or_path根据实际要求选择,示例如下。 输入数据集参数:是否使用已处理好数据集; 是,设置以下超参 processed_data_dir:已处理好数据路径目录 否,使用原始数据集,设置以下超参 dataset:训练时指定的输入原始数据集路径。 输入权重词表超参:是否使用已转换Megatron格式权重或训练输出结果权重目录; 是,设置以下超参 user_converted_ckpt_path:已转换Megatron格式权重目录或训练输出结果权重目录,一般搭配断点续训或增量训练。详见断点续训和故障快恢说明 model_name_or_path:加载tokenizer与Hugging Face权重对应存放目录地址。 否,设置以下超参 model_name_or_path:加载tokenizer与Hugging Face权重对应的存放地址 在“输出”的输入框内设置超参:output_dir、hf_save_dir,根据实际要求选择,示例如下; output_dir:训练完成后指定的输出模型路径。 hf_save_dir:训练完成的权重文件自动转换为Hugging Face格式权重输出的路径(确保convert_mg2hf_at_last设置为True,默认为True)。 分别单击“输入”和“输出”的数据存储位置,如图所示,选择OBS桶中指定的目录。超参:dataset中则直接选中数据集文件,超参:processed_data_dir则需选中存放已处理好数据集的目录文件夹。 “输入”和“输出”中的获取方式全部选择为:超参。 “输出”中的预下载至本地目标选择:下载,此时输出路径中的数据则会下载至OBS中。
  • 如何选择区域? 选择区域时,您需要考虑以下几个因素: 地理位置 一般情况下,建议就近选择靠近您或者您的目标用户的区域,这样可以减少网络时延,提高访问速度。不过,在基础设施、BGP网络品质、资源的操作与配置等方面,中国大陆各个区域间区别不大,如果您或者您的目标用户在中国大陆,可以不用考虑不同区域造成的网络时延问题。 曼谷等其他地区和国家提供国际带宽,主要面向非中国大陆地区的用户。如果您或者您的目标用户在中国大陆,使用这些区域会有较长的访问时延,不建议使用。 在除中国大陆以外的亚太地区有业务的用户,可以选择“亚太-曼谷”或“亚太-新加坡”区域。 在非洲地区有业务的用户,可以选择“南非-约翰内斯堡”区域。 在欧洲地区有业务的用户,可以选择“欧洲-巴黎”区域。 资源的价格 不同区域的资源价格可能有差异,请参见华为云服务价格详情。
  • 什么是区域、可用区? 我们用区域和可用区来描述数据中心的位置,您可以在特定的区域、可用区创建资源。 区域(Region):从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 可用区(AZ,Availability Zone):一个AZ是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 图1阐明了区域和可用区之间的关系。 图1 区域和可用区 目前,华为云已在全球多个地域开放云服务,您可以根据需求选择适合自己的区域和可用区。更多信息请参见华为云全球站点。
  • 基本概念 通道名称:租户创建的逻辑单位,用以区分不同租户实时数据的集合,创建通道时指定。在用户发送或者接收实时数据时,需要指定通道名称。 分区数:分区(Partition)是DIS数据通道的基本吞吐量单位。创建数据通道时,您将指定所需的分区数量。 记录:记录(Record)是存储在DIS通道中的数据单元。记录由序列号、分区键和数据块组成。数据块是您的数据生产者添加到数据通道的重要数据。数据块的最大尺寸(Base64编码前的数据有效载荷)是1MB。 序列号:序列号是每个记录的唯一标识符。序列号由DIS在数据生产者调用PutRecord操作以添加数据到DIS数据通道时DIS服务自动分配的。同一分区键的序列号通常会随时间变化增加。PutRecords请求之间的时间段越长,序列号越大。 应用程序:一个DIS应用程序是读取和处理来自DIS数据通道的使用者。您可以使用客户端库(SDK)构建DIS应用程序。 客户端库:SDK是一个适用于Java的客户端库,帮助用户轻松构建DIS应用程序,用以读取和处理来自DIS数据通道的数据。 Project:用于将OpenStack的资源(计算资源、存储资源和网络资源)进行分组和隔离。Project可以是一个部门或者一个项目组。一个账户中可以创建多个Project。账户是租户对应的账号。一个Region有n个Project,但是一个Project只关联一个Region。不同项目中的DIS通道不可以相互连通。 Checkpoint:消费检查点。应用程序消费数据时,记录已消费数据的最新序列号作为检查点。当重新消费数据时,可根据此检查点继续消费。 APP:应用程序标识符。当多个应用程序分别消费同一通道的数据时,为区分不同应用程序的消费检查点,使用APP作为标识。
  • 使用限制 使用DIS前,您需要认真阅读并了解以下使用限制。 建议使用支持的浏览器登录DIS。 Google Chrome:48.0及更高版本 Mozilla FireFox:43.0及更高版本 Internet Explorer:9.0及更高版本 当使用Internet Explorer 9.0时可能无法登录DIS管理控制台,原因是某些Windows系统例如Win7旗舰版,默认禁止Administrator用户,Internet Explorer在安装时自动选择其他用户如System用户安装,从而导致Internet Explorer无法打开登录页面。请使用管理员身份重新安装Internet Explorer 9.0或更高版本(建议),或尝试使用管理员身份运行Internet Explorer 9.0。 用户使用接入通道上传数据的时候,如果数据涉及敏感信息,请使用DIS SDK提供的加密配置进行加密或者自行加密。 用户使用接入通道上传数据时,普通通道单分区单次请求的记录总大小不能超过1MB(不包含partitionKey数据大小),高级通道单分区单次请求的记录总大小不能超过5MB(不包含partitionKey数据大小)。
  • 与其他服务的关系 介绍DIS与其他服务的关系。 对象存储服务 (Object Storage Service,简称OBS) 在用户购买接入通道时选择数据转储至OBS,用户上传的数据会存储至对象存储服务(OBS)。 统一身份认证 服务(Identity and Access Management,简称 IAM ) 统一身份认证服务为DIS提供了用户鉴权功能。 云审计 服务(Cloud Trace Service,简称 CTS ) 云审计服务记录DIS相关的操作事件,方便用户日后的查询、审计和回溯。CTS的更多信息,请参见《云审计服务用户指南》。
  • DIS权限 默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 DIS部署时通过物理区域划分,为项目级服务,需要在各区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效,如果需要所有区域都生效,则需要在所有项目都设置权限。访问DIS时,需要先切换至授权区域。 角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。 如表1所示,包括了DIS的所有系统权限。其中“依赖关系”表示该系统权限对其它权限的依赖。由于华为云各服务之间存在业务交互关系, 数据接入服务 的权限依赖其他服务的权限实现功能。因此给用户授予数据接入服务的权限时,需要同时授予依赖的权限,数据接入服务的权限才能生效。 表1 DIS系统权限 系统角色 策略类别 描述 依赖关系 DIS Administrator 系统角色 对数据接入服务的所有执行权限。 无 DIS Operator 系统角色 通道管理权限,拥有创建删除等管理通道的权限,但不能使用通道上传下载数据。 无 DIS User 系统角色 通道使用权限,拥有使用通道上传下载数据的权限,但不能管理通道。 无 表2列出了数据接入服务 (Data Ingestion Service)常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。 表2 常用操作与系统权限的关系 操作 DIS Administrator DIS Operator DIS User 创建通道 √ √ x 删除通道 √ √ x 查询通道列表 √ √ √ 查询通道详情 √ √ √ 查询通道监控信息 √ √ √ 查询分区监控信息 √ √ √ 获取通道消费信息 √ √ √ 变更分区数量 √ √ x 上传数据 √ x √ 获取数据游标 √ x √ 下载数据 √ x √ 创建APP √ √ √ 查询APP详情 √ √ √ 查询APP列表 √ √ √ 删除APP √ √ √ 新增Checkpoint √ x √ 查询Checkpoint √ √ √ 删除Checkpoint √ x √ 添加转储任务 √ √ √ 查询转储任务详情 √ √ √ 查询转储任务列表 √ √ √ 删除转储任务 √ √ √
  • 操作步骤 使用注册账户登录DIS控制台。 单击管理控制台左上角的,选择区域和项目。 单击“购买接入通道”配置相关参数。 表1 接入通道参数说明 参数 参数解释 参数示例 计费模式 按需计费 按需计费 区域 指的是云服务所在的物理位置。您可以在下拉框中选择并切换区域。 华北-北京1 基本信息 通道名称 用户发送或者接收数据时,需要指定通道名称,通道名称不可重复。通道名称由英文字母、数字、中划线和下划线组成。长度为1~64个字符。 dis-Tido 通道类型 普通通道单分区容量:最高发送速度可达1MB/秒或1000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 2MB/秒,单次请求的记录总大小不能超过1MB(不包含partitionKey数据大小)。 高级通道单分区容量:最高发送速度可达 5MB/秒或2000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 10MB/秒,单次请求的记录总大小不能超过5MB(不包含partitionKey数据大小) - 分区数量 分区是DIS数据通道的基本吞吐量单位。 5 分区计算 用户可以根据实际需求通过系统计算得到一个建议的分区数量值。 单击“分区计算”,弹出“计算所需分区数量”对话框。 根据实际需求填写“平均记录大小”、“最大写入记录数”和“消费程序数量”,“预估所需分区数量”选项框中将显示所需的分区数量,此值不可修改。 说明: 所需分区计算公式: 按流量计算所需写分区数:(所得数值需向上取整后作为分区数) 普通通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(1*1024KB) 高级通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(5*1024KB) 按消费程序数量计算读分区数:(消费程序数量/2后的数值需要保留两位小数,然后乘以“按流量计算所需写分区数”,最终取值需向上取整) (消费程序数量/2)*按流量计算所需的写分区数 获取“按流量计算所需写分区数”、“按消费程序数量计算读分区数”中的最大值作为预估所需分区数量。 单击“使用计算值”将系统计算出的建议值应用于“分区数量”。 - 生命周期(小时) 存储在DIS中的数据保留的最长时间,超过此时长数据将被清除。 取值范围:24~72的整数。 24 源数据类型 BLOB:存储在数据库管理系统中的一组二进制数据。“源数据类型”选择“BLOB”,则支持的“转储服务类型”为“OBS”。 JSON:一种开放的文件格式,以易读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。“源数据类型”选择“JSON”,则支持的“转储服务类型”为“OBS”。 CS V:纯文本形式存储的表格数据,分隔符默认采用逗号。 “源数据类型”选择“CSV”,则支持的“转储服务类型”为“OBS”。 JSON 自动扩缩容 创建通道的同时是否开启自动扩缩容功能。 通过单击通过单击或来关闭或开启自动扩缩容开关。 说明: 用户可在创建通道时定义是否自动扩缩容,也可对已创建的通道修改自动扩缩容属性。 自动缩容最小分区数 设置自动缩容的分区下限,自动缩容的目标分区数不小于下限值。 - 自动扩容最大分区数 设置自动扩容的分区上限,自动扩容的目标分区数不超过上限值。 - 源数据分隔符 源数据为CSV格式时的数据分隔符。 - Schema开关 创建通道的同时是否为其创建数据Schema。源数据类型为JSON或CSV时可配置该参数。 通过单击或来关闭或开启Schema配置开关。 说明: 若创建通道时,没有同时创建数据Schema,可待通道创建成功后。到通道的管理页面创建数据Schema,详情请参见管理源数据Schema。 “源数据类型”为“JSON”和“CSV”时,可选择创建数据Schema。 源数据Schema 支持输入和导入源数据样例,源数据样例格式为JSON或者CSV,详细操作请参见管理源数据Schema。 在左侧文本框中输入JSON或者CSV格式的源数据样例,也可单击导入源数据样例。 在左侧文本框中单击,可删除左侧文本框中已输入或导入的源数据样例。 在左侧文本框中单击,可在右侧文本框中根据源数据样例生成Avro schema。 在右侧文本框中单击,可删除已生成的Avro schema。 在右侧文本框中单击,可修改已生成的Avro schema。 仅当“Schema配置开关”配置为“开启”:时需要配置此参数。 企业项目 配置通道所属的企业项目。已开通企业项目管理服务的用户才可以配置该参数。默认值为default。 企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 您可以选择默认的企业项目“default”或其他已有的企业项目。如果要创建新的企业项目,请登录企业管理控制台进行创建,详细操作请参考《企业管理用户指南》。 - 现在配置 单击“现在配置”,呈现添加标签。 添加标签具体请参考管理通道标签。 - 暂不配置 暂不配置任何信息。 - 标签 标签是通道的标识。为通道添加标签,可以方便用户识别和管理拥有的通道资源。 - 单击“立即购买”,弹出“规格确认”页面。 单击“提交”,完成通道接入。
  • 操作步骤 使用注册账户登录DIS控制台。 单击管理控制台左上角的,选择区域和项目。 单击“购买接入通道”配置相关参数。 表1 接入通道参数说明 参数 参数解释 参数示例 计费模式 按需计费 按需计费 区域 指的是云服务所在的物理位置。您可以在下拉框中选择并切换区域。 华北-北京1 基本信息 通道名称 用户发送或者接收数据时,需要指定通道名称,通道名称不可重复。通道名称由英文字母、数字、中划线和下划线组成。长度为1~64个字符。 dis-Tido 通道类型 普通通道单分区容量:最高发送速度可达1MB/秒或1000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 2MB/秒,单次请求的记录总大小不能超过1MB(不包含partitionKey数据大小)。 高级通道单分区容量:最高发送速度可达 5MB/秒或2000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 10MB/秒,单次请求的记录总大小不能超过5MB(不包含partitionKey数据大小) - 分区数量 分区是DIS数据通道的基本吞吐量单位。 5 分区计算 用户可以根据实际需求通过系统计算得到一个建议的分区数量值。 单击“分区计算”,弹出“计算所需分区数量”对话框。 根据实际需求填写“平均记录大小”、“最大写入记录数”和“消费程序数量”,“预估所需分区数量”选项框中将显示所需的分区数量,此值不可修改。 说明: 所需分区计算公式: 按流量计算所需写分区数:(所得数值需向上取整后作为分区数) 普通通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(1*1024KB) 高级通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(5*1024KB) 按消费程序数量计算读分区数:(消费程序数量/2后的数值需要保留两位小数,然后乘以“按流量计算所需写分区数”,最终取值需向上取整) (消费程序数量/2)*按流量计算所需的写分区数 获取“按流量计算所需写分区数”、“按消费程序数量计算读分区数”中的最大值作为预估所需分区数量。 单击“使用计算值”将系统计算出的建议值应用于“分区数量”。 - 生命周期(小时) 存储在DIS中的数据保留的最长时间,超过此时长数据将被清除。 取值范围:24~72的整数。 24 源数据类型 BLOB:存储在数据库管理系统中的一组二进制数据。“源数据类型”选择“BLOB”,则支持的“转储服务类型”为“OBS”。 JSON:一种开放的文件格式,以易读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。“源数据类型”选择“JSON”,则支持的“转储服务类型”为“OBS”。 CSV:纯文本形式存储的表格数据,分隔符默认采用逗号。 “源数据类型”选择“CSV”,则支持的“转储服务类型”为“OBS”。 JSON 自动扩缩容 创建通道的同时是否开启自动扩缩容功能。 通过单击通过单击或来关闭或开启自动扩缩容开关。 说明: 用户可在创建通道时定义是否自动扩缩容,也可对已创建的通道修改自动扩缩容属性。 自动缩容最小分区数 设置自动缩容的分区下限,自动缩容的目标分区数不小于下限值。 - 自动扩容最大分区数 设置自动扩容的分区上限,自动扩容的目标分区数不超过上限值。 - 源数据分隔符 源数据为CSV格式时的数据分隔符。 - Schema开关 创建通道的同时是否为其创建数据Schema。源数据类型为JSON或CSV时可配置该参数。 通过单击或来关闭或开启Schema配置开关。 说明: 若创建通道时,没有同时创建数据Schema,可待通道创建成功后。到通道的管理页面创建数据Schema,详情请参见管理源数据Schema。 “源数据类型”为“JSON”和“CSV”时,可选择创建数据Schema。 源数据Schema 支持输入和导入源数据样例,源数据样例格式为JSON或者CSV,详细操作请参见管理源数据Schema。 在左侧文本框中输入JSON或者CSV格式的源数据样例,也可单击导入源数据样例。 在左侧文本框中单击,可删除左侧文本框中已输入或导入的源数据样例。 在左侧文本框中单击,可在右侧文本框中根据源数据样例生成Avro schema。 在右侧文本框中单击,可删除已生成的Avro schema。 在右侧文本框中单击,可修改已生成的Avro schema。 仅当“Schema配置开关”配置为“开启”:时需要配置此参数。 企业项目 配置通道所属的企业项目。已开通企业项目管理服务的用户才可以配置该参数。默认值为default。 企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 您可以选择默认的企业项目“default”或其他已有的企业项目。如果要创建新的企业项目,请登录企业管理控制台进行创建,详细操作请参考《企业管理用户指南》。 - 现在配置 单击“现在配置”,呈现添加标签。 添加标签具体请参考管理通道标签。 - 暂不配置 暂不配置任何信息。 - 标签 标签是通道的标识。为通道添加标签,可以方便用户识别和管理拥有的通道资源。 - 单击“立即购买”,弹出“规格确认”页面。 单击“提交”,完成通道接入。
  • 如何开通DIS通道? 使用注册账户登录DIS控制台。 单击管理控制台左上角的,选择区域和项目。 单击“购买接入通道”配置相关参数。 表1 接入通道参数说明 参数 参数解释 参数示例 计费模式 按需计费 按需计费 区域 指的是云服务所在的物理位置。您可以在下拉框中选择并切换区域。 华北-北京1 基本信息 通道名称 用户发送或者接收数据时,需要指定通道名称,通道名称不可重复。通道名称由英文字母、数字、中划线和下划线组成。长度为1~64个字符。 dis-Tido 通道类型 普通通道单分区容量:最高发送速度可达1MB/秒或1000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 2MB/秒,单次请求的记录总大小不能超过1MB(不包含partitionKey数据大小)。 高级通道单分区容量:最高发送速度可达 5MB/秒或2000条记录/秒(达到任意一种速度上限才会被限流),最高提取速度可达 10MB/秒,单次请求的记录总大小不能超过5MB(不包含partitionKey数据大小) - 分区数量 分区是DIS数据通道的基本吞吐量单位。 5 分区计算 用户可以根据实际需求通过系统计算得到一个建议的分区数量值。 单击“分区计算”,弹出“计算所需分区数量”对话框。 根据实际需求填写“平均记录大小”、“最大写入记录数”和“消费程序数量”,“预估所需分区数量”选项框中将显示所需的分区数量,此值不可修改。 说明: 所需分区计算公式: 按流量计算所需写分区数:(所得数值需向上取整后作为分区数) 普通通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(1*1024KB) 高级通道:平均记录大小*(1+分区预留比例20%)*最大写入记录数/(5*1024KB) 按消费程序数量计算读分区数:(消费程序数量/2后的数值需要保留两位小数,然后乘以“按流量计算所需写分区数”,最终取值需向上取整) (消费程序数量/2)*按流量计算所需的写分区数 获取“按流量计算所需写分区数”、“按消费程序数量计算读分区数”中的最大值作为预估所需分区数量。 单击“使用计算值”将系统计算出的建议值应用于“分区数量”。 - 生命周期(小时) 存储在DIS中的数据保留的最长时间,超过此时长数据将被清除。 取值范围:24~72的整数。 24 源数据类型 BLOB:存储在数据库管理系统中的一组二进制数据。“源数据类型”选择“BLOB”,则支持的“转储服务类型”为“OBS”。 JSON:一种开放的文件格式,以易读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。“源数据类型”选择“JSON”,则支持的“转储服务类型”为“OBS”。 CSV:纯文本形式存储的表格数据,分隔符默认采用逗号。 “源数据类型”选择“CSV”,则支持的“转储服务类型”为“OBS”。 JSON 自动扩缩容 创建通道的同时是否开启自动扩缩容功能。 通过单击通过单击或来关闭或开启自动扩缩容开关。 说明: 用户可在创建通道时定义是否自动扩缩容,也可对已创建的通道修改自动扩缩容属性。 自动缩容最小分区数 设置自动缩容的分区下限,自动缩容的目标分区数不小于下限值。 - 自动扩容最大分区数 设置自动扩容的分区上限,自动扩容的目标分区数不超过上限值。 - 源数据分隔符 源数据为CSV格式时的数据分隔符。 - Schema开关 创建通道的同时是否为其创建数据Schema。源数据类型为JSON或CSV时可配置该参数。 通过单击或来关闭或开启Schema配置开关。 说明: 若创建通道时,没有同时创建数据Schema,可待通道创建成功后。到通道的管理页面创建数据Schema,详情请参见管理源数据Schema。 “源数据类型”为“JSON”和“CSV”时,可选择创建数据Schema。 源数据Schema 支持输入和导入源数据样例,源数据样例格式为JSON或者CSV,详细操作请参见管理源数据Schema。 在左侧文本框中输入JSON或者CSV格式的源数据样例,也可单击导入源数据样例。 在左侧文本框中单击,可删除左侧文本框中已输入或导入的源数据样例。 在左侧文本框中单击,可在右侧文本框中根据源数据样例生成Avro schema。 在右侧文本框中单击,可删除已生成的Avro schema。 在右侧文本框中单击,可修改已生成的Avro schema。 仅当“Schema配置开关”配置为“开启”:时需要配置此参数。 企业项目 配置通道所属的企业项目。已开通企业项目管理服务的用户才可以配置该参数。默认值为default。 企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 您可以选择默认的企业项目“default”或其他已有的企业项目。如果要创建新的企业项目,请登录企业管理控制台进行创建,详细操作请参考《企业管理用户指南》。 - 现在配置 单击“现在配置”,呈现添加标签。 添加标签具体请参考管理通道标签。 - 暂不配置 暂不配置任何信息。 - 标签 标签是通道的标识。为通道添加标签,可以方便用户识别和管理拥有的通道资源。 - 单击“立即购买”,弹出“规格确认”页面。 单击“提交”,完成通道接入。 父主题: 一般性问题
  • 自助解封规则说明 购买了DDoS防护(DDoS原生高级防护或DDoS高防)的用户,每个月将免费赠送三次自助解封配额,解封配额当月如果未用完将在月底清零。 对于同一防护IP,当日首次解封时间必须大于封堵时间30分钟以上才能解封。解封时间=2(n-1)*30分钟(n表示解封次数)。 例如,当日第一次解封需要封堵开始后30分钟,第二次解封需要封堵开始后60分钟,第三次解封需要封堵开始后120分钟。 对于同一防护IP,如果上次解封时间和本次封堵时间间隔小于30分钟,则本次解封时间的间隔=2n*30分钟(n表示解封次数)。 例如,该IP已解封过一次,上次解封时间为10:20,本次发生封堵时间为10:40,两者时间间隔小于30分钟,则本次需要封堵开始后120分钟才能解封,即12:40可以解封(本次发生封堵时间10:40后120分钟)。 如果您在30分钟内解封过其他任一IP,即使满足以上条件,您也不能对该IP进行解封。 DDoS防护会根据风控自动调整自助解封次数和间隔时长。
  • 如何解除黑洞 当服务器(云主机)进入黑洞后,您可以参考如表1所示方式进行处理。 表1 解除黑洞方式 DDoS防护版本 解封策略 解除方法 DDoS原生基础防护(Anti-DDoS流量清洗) 说明: DDoS原生基础防护无需购买,默认开启。 当云主机进入黑洞24小时后,黑洞会自动解封。 如果系统监控到攻击流量没有停止,依然超过限定的阈值时,IP会再次被黑洞封堵。 等待自动解封。 当“华北”、“华东”和“华南”区域的公网IP封堵时,可以使用自助解封功能提前解封黑洞,解封规则详见自助解封规则说明。 有关自助解封的详细操作,请参见自助解封封堵IP。 DDoS原生高级防护 黑洞解封时间默认为24小时。 等待自动解封。 DDoS高防 建议提升弹性带宽规格避免再次封堵。 可以通过升级规格提升弹性防护带宽上限以提前解封黑洞。
  • 如何解除黑洞 当服务器(云主机)进入黑洞后,您可以参考表1进行处理。 表1 解除黑洞方式 DDoS防护版本 解封策略 解除方法 DDoS原生基础防护(Anti-DDoS流量清洗) 说明: DDoS原生基础防护无需购买,默认开启。 当云主机进入黑洞24小时后,黑洞会自动解封。 如果系统监控到攻击流量没有停止,依然超过限定的阈值时,IP会再次被黑洞封堵。 等待自动解封。 DDoS原生高级防护 黑洞解封时间默认为24小时。 等待自动解封。 DDoS高防 联系华为云技术支持提前解封。 建议提升弹性带宽规格避免再次封堵。 可以通过升级规格提升弹性防护带宽上限以提前解封黑洞。
  • 为什么需要黑洞策略? DDoS攻击不仅影响受害者,也会对华为云高防机房造成严重影响。而且DDoS防御需要成本,其中最大的成本就是带宽费用。 带宽是华为云向各运营商购买所得,运营商计算带宽费用时不会把DDoS攻击流量清洗掉,而是直接收取华为云的带宽费用。华为云DDoS原生基础防护(Anti-DDoS流量清洗)服务为用户提供免费的DDoS攻击防御能力,但是当攻击流量超出Anti-DDoS流量清洗阈值时,华为云会采取黑洞策略封堵IP。
  • DDoS攻击导致客户端禁止访问,怎么办? 您可以通过“Anti-DDoS监控报表”,查看单个公网IP 24小时的异常事件,或查看Anti-DDoS拦截报告查看所有公网IP的防护统计信息、TOP10被攻击公网IP等,判断您的业务是否是遭受DDoS攻击,导致IP被黑洞封堵,从而引发客户端被禁止访问。 如果确认是遭受DDoS攻击导致IP被黑洞封堵,那么当您的云主机进入黑洞24小时后,黑洞会自动解封。 父主题: 业务故障类
  • 自助解封规则说明 购买了DDoS防护(DDoS原生高级防护)的用户,每个月将免费赠送三次自助解封配额,解封配额当月如果未用完将在月底清零。 对于同一防护IP,当日首次解封时间必须大于封堵时间30分钟以上才能解封。解封时间=2(n-1)*30分钟(n表示解封次数)。 例如,当日第一次解封需要封堵开始后30分钟,第二次解封需要封堵开始后60分钟,第三次解封需要封堵开始后120分钟。 对于同一防护IP,如果上次解封时间和本次封堵时间间隔小于30分钟,则本次解封时间的间隔=2n*30分钟(n表示解封次数)。 例如,该IP已解封过一次,上次解封时间为10:20,本次发生封堵时间为10:40,两者时间间隔小于30分钟,则本次需要封堵开始后120分钟才能解封,即12:40可以解封(本次发生封堵时间10:40后120分钟)。 如果您在30分钟内解封过其他任一IP,即使满足以上条件,也不能对该IP进行解封。 DDoS防护会根据风控自动调整自助解封次数和间隔时长。
  • 如何解除黑洞 当服务器(云主机)进入黑洞后,您可以参考表1进行处理。 表1 解除黑洞方式 DDoS防护版本 解封策略 解除方法 DDoS原生基础防护(Anti-DDoS流量清洗) 说明: DDoS原生基础防护无需购买,默认开启。 当云主机进入黑洞24小时后,黑洞会自动解封。 如果系统监控到攻击流量没有停止,依然超过限定的阈值时,IP会再次被黑洞封堵。 等待自动解封。 DDoS原生高级防护 黑洞解封时间默认为24小时。 等待自动解封。 DDoS高防 联系华为云技术支持提前解封。 建议提升弹性带宽规格避免再次封堵。 可以通过升级规格提升弹性防护带宽上限以提前解封黑洞。
  • 为什么需要黑洞策略? DDoS攻击不仅影响受害者,也会对华为云高防机房造成严重影响。而且DDoS防御需要成本,其中最大的成本就是带宽费用。 带宽是华为云向各运营商购买所得,运营商计算带宽费用时不会把DDoS攻击流量清洗掉,而是直接收取华为云的带宽费用。华为云DDoS原生基础防护(Anti-DDoS流量清洗)服务为用户提供免费的DDoS攻击防御能力,但是当攻击流量超出Anti-DDoS流量清洗阈值时,华为云会采取黑洞策略封堵IP。
  • 名词解释 基本概念、云服务简介、专有名词解释: 华为云Flexus云服务器X实例:Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器。Flexus云服务器X实例功能接近ECS, 同时还具备独有特点,例如Flexus云服务器X实例具有更灵活的vCPU内存配比、支持热变配不中断业务变更规格、支持性能模式等。 弹性负载均衡 ELB:将访问流量自动分发到多台云服务器,扩展应用系统对外的服务能力,实现更高水平的应用容错。 弹性公网IP EIP:提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑。 云数据库 RDS:是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼。 云备份 CBR:为云内的云服务器、云硬盘、文件服务,云下文件、VMware虚拟化环境,提供简单易用的备份服务,针对病毒入侵、人为误删除、软硬件故障等场景,可将数据恢复到任意备份点。 云搜索 CSS :基于开源Elasticsearch提供在线分布式搜索、日志统计报表、语义搜索等功能。 分布式缓存服务Redis版:业界首个支持Arm和X86双架构的Redis云服务,全面兼容开源,企业版支持超高性能与超大容量,满足高读写性能及弹性变配的业务需求。
  • 快速部署 本章节主要帮助用户快速部署“基于Magento快速构建电商网站”解决方案。 表1 参数填写说明 参数名称 类型 是否可选 参数解释 默认值 enterprise_project_id string 必填 企业项目id。请参考部署指南到项目管理界面获取,0代表default项目。 0 vpc_name string 必填 虚拟私有云 VPC名称,该模板使用新建VPC,不允许重名。取值范围:1-60个字符,仅支持中文、英文字母、数字、_(下划线)、-(中划线)、.(点)。 magento-ecommerce-website-demo security_group_name string 必填 安全组名称,该模板使用新建安全组,安全组规则请参考安全组规则修改(可选)进行配置。取值范围:1-64个字符,仅支持数字、字母、中文、_(下划线)、-(中划线)、.(点)。 magento-ecommerce-website-demo eip_bandwidth_size number 必填 弹性公网IP EIP(该EIP默认绑定在ELB,用于访问Magento网站)带宽大小,按带宽计费,单位:Mbit/s。取值范围:1-2,000。 5 rds_name string 必填 云数据库RDS for MySQ L实例 名称,不支持重名。取值范围:4-64个字符,以字母开头,仅支持英文字母、数字、-(中划线)_(下划线)。 magento-ecommerce-website-demo rds_flavor string 必填 云数据库RDS实例规格,详细规格信息请单击RDS for MySQL实例规格。 rds.mysql.n1.xlarge.2.ha rds_volume_size number 必填 云数据库RDS实例磁盘大小,默认存储盘类型为SSD云盘,单位:GB。取值范围:40-4,000,必须为10的整数倍。 100 rds_password string 必填 云数据库RDS实例密码,管理员账户默认root。取值范围:8-32个字符,密码至少必须包含大写字母、小写字母、数字和特殊字符(~!@#%^-_=)中的三种。 空 redis_name string 必填 分布式缓存服务 Redis版实例名称,取值范围:4-64个字符,以字母、中文或数字开头,仅支持中文、字母、数字、-(中划线)、_(下划线)。 magento-ecommerce-website-demo redis_capacity number 必填 分布式缓存服务 Redis版主备实例缓存内存规格,以GB为单位,具体规格详见Redis 6.0实例。 2 redis_password string 必填 分布式缓存服务 Redis版实例初始化密码。取值范围:8-64个字符,必须至少包含大写字母、小写字母、数字、特殊字符(~!@#%^-_=)中的三种。 空 css_name string 必填 云搜索服务 CSS Elasticsearch集群名称。取值范围:4-32个字符,以字母开头,仅支持字母、数字、-(中划线)及_(下划线)。 magento-ecommerce-website-demo elasticsearch_flavor string 必填 Elasticsearch集群节点节点规格,取值范围:计算密集型(ess.spec-4u8g(4vCPUs|8GB)、ess.spec-8u16g(8vCPUs|16GB)、ess.spec-16u32g(16vCPUs|32GB)、ess.spec-32u64g(32vCPUs|64GB))、通用计算型(ess.spec-4u16g(4vCPUs|16GB)、ess.spec-8u32g(8vCPUs|32GB)、ess.spec-16u64g(16vCPUs|64GB)、ess.spec-32u128g(32vCPUs|128GB))、内存优化型(ess.spec-4u32g(4vCPUs|32GB)、ess.spec-8u64g(8vCPUs|64GB)、ess.spec-16u128g(16vCPUs|128GB)、ess.spec-32u256g(32vCPUs|256GB))。 ess.spec-4u8g elasticsearch_node_number number 必填 Elasticsearch集群节点数量,取值范围:1-32,建议节点数为3或3以上,以提升集群可用性。 3 elasticsearch_volume_size number 必填 Elasticsearch集群节点磁盘大小,默认节点存储类型超高I/O。取值范围:40-20,480,具体取值需结合规格。 100 elasticsearch_password string 必填 指定安全模式下Elasticsearch集群管理员admin的初始化密码,不能与管理员账户或倒叙的管理员账户名相同。取值范围:长度为8-32个字符,必须至少包含大写字母、小写字母、数字、特殊字符(~!@#%^-_=)中的三种。 空 cbr_vault_name string 必填 云备份 CBR 云服务器备份存储库名称,用于为Magento服务器创建整机镜像备份(镜像名默认{ecs_name}-ims)。取值范围:1-64个字符,仅支持数字、字母、中文、_(下划线)、-(中划线)。 magento-ecommerce-website-demo sfs_turbo_name string 必填 弹性文件服务 SFS turbo名称,取值范围:4-64字符,以字母开头,仅支持字母、数字、_(下划线)和-(中划线)。 magento-ecommerce-website-demo sfs_turbo_size number 必填 SFS turbo容量大小,文件系统类型默认通用型,存储类型默认标准型。取值范围:500-32,768GB。 500 ecs_name string 必填 云服务器名称,不允许重名。命名规则{ecs_name}-X,其中X取值[1,16]。取值范围:1-52个字符,仅支持数字、字母、中文、_(下划线)、-(中划线)、.(点)。 magento-ecommerce-website-demo ecs_number number 必填 云服务器数量。取值范围:2-16。 2 ecs_flavor string 必填 云服务器实例规格,支持弹性云服务器 ECS及华为云Flexus 云服务器X实例。Flexus 云服务器X实例规格ID命名规则为x1.?u.?g,例如4vCPUs8GiB规格ID为x1.4u.8g,具体华为云Flexus 云服务器X实例规格请参考控制台。弹性云服务器 ECS规格请参考官网弹性云服务器规格清单 x1.4u.8g ecs_password string 必填 云服务器密码。取值范围:长度为8-26个字符,密码至少包含大写字母、小写字母、数字和特殊字符(~!@#%^-_=)中的三种。管理员账户默认root。 空 system_disk_size number 必填 云服务器系统盘大小,磁盘类型默认通用型SSD,单位:GB。取值范围:40-1,024,不支持缩盘。 100 elb_name string 必填 弹性负载均衡 ELB名称。取值范围:1-64个字符组成,仅支持中文、英文字母、数字、_(下划线)、-(中划线)、.(点)。 magento-ecommerce-website-demo magento_admin_firstname string 必填 Magento管理员用户名,取值范围:1-40 个字符组成,支持字母、数字、_(下划线)、-(中划线)、.(点)。 magento magento_admin_lastname string 必填 Magento网站管理员用户的姓氏。取值范围:1-40 个字符组成,支持字母、数字、_(下划线)、-(中划线)、.(点)。 magento magento_admin_passwd string 必填 Magento网站管理员密码,管理员登录账户名默认admin。取值范围:密码长度必须至少为7个字符,密码至少必须包含大写字母、小写字母、数字和特殊字符(~!@#%^-_=)中的三种,密码不能包含用户名或用户名的逆序。 空 magento_admin_email string 必填 Magento管理员使用的邮箱,个人邮箱或 企业邮箱 均可。 空 magento_public_key string 必填 Commerce Marketplace账户生成的身份验证密钥公钥,获取请参考获取您的身份验证密钥。 空 magento_private_key string 必填 Commerce Marketplace账户生成的身份验证密钥私钥。 空 charging_mode string 必填 计费模式,默认自动扣费。可选值为:postPaid(按需计费)、prePaid(包年包月)。 postPaid charging_unit string 必填 订购周期类型。仅当charging_mode为prePaid(包年/包月)生效,此时该参数为必填参数。可选值为:month(月),year(年)。 month charging_period number 必填 订购周期,仅当charging_mode为prePaid(包年/包月)生效,此时该参数为必填参数。当charging_unit=month(周期类型为月)时,取值范围:1-9;当charging_unit=year(周期类型为年)时,取值范围:1-3。 1 登录华为云解决方案实践,选择“基于Magento快速构建电商网站”模板。单击“一键部署”,跳转至解决方案创建堆栈界面。 图1 解决方案实践 在选择模板界面中,单击“下一步”。 图2 选择模板 在配置参数界面中,自定义填写堆栈名称,根据表1填写配置参数信息,单击“下一步”。 图3 参数配置 (可选,如果使用华为主账号或admin用户组下的IAM子账户可不选委托)在资源设置界面中,在权限委托下拉框中选择“rf_admin_trust”委托,单击“下一步”。 图4 资源栈设置 在配置确认页面中,单击“创建执行计划”。 图5 确认配置 在弹出的创建执行计划框中,自定义填写执行计划名称,单击“确定”。 图6 创建执行计划 等待执行计划状态为“创建成功,待部署”后,单击“部署”,并且在弹出的执行计划确认框中单击“执行”。 图7 执行计划 图8 执行计划确认 (可选)如果计费模式选择“包年包月”,在余额不充足的情况下(所需总费用请参考表1)请及时登录费用中心,手动完成待支付订单的费用支付。 待“事件”中出现“Apply required resource success”,表示该解决方案资源已经部署完成,后台将自动完成环境构建,大约需要30分钟(该时间为预估时间,具体时间受网络波动影响)。 图9 资源创建成功 父主题: 实施步骤
  • 建表规范 【强制】创建表指定分桶buckets时,每个桶的数据大小为应保持在100M-3G之间,单分区中最大分桶数据不超过5000。 【强制】表数据超过5亿条以上必须设置分区分桶策略。 【强制】分桶的列不要设置太多,一般情况下1或2个列,同时需要兼顾数据分布均匀和查询吞吐之间的均衡,考虑数据均匀是为了避免某些桶的数据存在倾斜影响数据均衡和查询效率,考虑查询吞吐是为了利用查询SQL的分桶剪裁优化避免全桶扫描提升查询性能,所以优先考虑哪些数据较为均匀且常用于查询条件的列适合做分桶列。 【强制】2000kw以内数据禁止使用动态分区(动态分区会自动创建分区,而小表用户客户关注不到,会创建出大量不使用分区分桶)。 【强制】创建表时的副本数必须至少为2,默认是3,禁止使用单副本。 【建议】单表物化视图不能超过6个。 【建议】对于有大量历史分区数据,但是历史数据比较少,或者不均衡,或者查询概率的情况,使用如下方式将数据放在特殊分区: 对于历史数据,如果数据量比较小我们可以创建历史分区(比如年分区,月分区),将所有历史数据放到对应分区里。 创建历史分区方式:FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR。 【建议】1000w-2亿以内数据为了方便可以不设置分区,直接用分桶策略(不设置其实Doris内部会有个默认分区)。 【建议】如果分桶字段存在30%以上的数据倾斜,则禁止使用Hash分桶策略,改使用random分桶策略:Create table ... DISTRIBUTED BY RANDOM BUCKETS 10 ... 【建议】建表时第一个字段一定是最常查询使用的列,默认有前缀索引快速查询能力,选取分区分桶外最长查询且高基数的列,前缀索引36位,如果列超长也不能使用前缀索引能力。 【建议】亿级别以上数据,如果有模糊匹配或者等值/in条件,可以使用倒排索引或者是Bloomfilter。如果是低基数列的正交查询适合使用bitmap索引。 【强制】Doris 建表不要指定Merge-On-Write属性,当前有很多开源问题,不推荐。如使用了该属性,CloudTable服务不承诺SLA。 【建议】根据业务手动分桶,不使用AUTO自动分桶策略。
  • 数据查询规范 【强制】鉴于外表存在不稳定性,目前doris暂不支持外表查询。 【强制】in中条件超过2000后,必须修改为子查询。 【强制】禁止使用REST API(Statement Execution Action)执行大量SQL查询,该接口仅仅用于集群维护。 【建议】一次insert into select数据超过1亿条后,建议拆分为多个insert into select语句执行,分成多个批次来执行。如果非要这样执行不可,必须在集群资源相对空闲的时候可以通过调整并发度来加快的数据导入速度 。 例如:set parallel_fragment_exec_instance_num = 8 建议数值是单BE节点上CPU内核的一半。 【强制】query查询条件返回结果在5w条以上,使用JDBC Catalog或者OUTFILE方式导出。不然大量FE上数据传输将占用FE资源,影响集群稳定性。 如果是交互式查询,建议使用分页方式(offset limit),分页要加Order by。 如果是数据导出提供给第三方使用,建议使用outfile或者export方式。 【强制】2个以上大于3亿的表JOIN使用Colocation Join。 【强制】亿级别大表禁止使用select * 查询,查询时需要明确要查询的字段。 使用SQL Block方式禁止这种操作。 如果是高并发点查,建议开启行存(2.x版本)。 使用PreparedStatement查询。 【强制】亿级以上表数据查询必须带分区分桶条件。 【建议】尽量不要使用OR作为JOIN条件。 【建议】大量数据排序(5亿以上)后返回部分数据,建议先减少数据范围再执行排序,否则大量排序会影响性能。 例如:将from table order by datatime desc limit 10优化为from table where datatime='2023-10-20' order by datatime desc limit 10。
  • 数据变更类 【强制】应用程序不可以直接使用delete或者update语句变更数据,可以使用CDC的upsert方式来实现。 低频操作上使用,比如Update几分钟更新一次。 如果使用Delete一定带上分区条件。 【强制】禁止使用INSERT INTO tbl1 VALUES (“1”), (“a”);这种方式做数据导入,少量少次写可以,多量多频次时要使用Doris提供的StreamLoad、BrokerLoad、SparkLoad或者Flink Connector方式。 【建议】执行特殊的长SQL操作时,可以使用SELECT /*+ SET_VAR(query_timeout = xxx*/ from table 类似这样通过Hint方式去设置Session 会话变量,不要设置全局的系统变量。
  • Unique模型 在某些多维分析场景下,用户更关注的是如何保证Key的唯一性,即如何获得Primary Key唯一性约束。因此,我们引入了Unique的数据模型。该模型本质上是聚合模型的一个特例,也是一种简化的表结构表示方式。举例说明: Unique模型表,不推荐开启merge-on-write属性,默认使用merge-on-read。 表11 参数说明 ColumnName Type IsKey Comment user_id BIGINT Yes 用户ID username VARCHAR(50) Yes 用户昵称 city VARCHAR(20) No 用户所在城市 age SMALLINT No 用户年龄 sex TINYINT No 用户性别 phone LARGEINT No 用户电话 address VARCHAR(500) No 用户住址 register_time DATETIME No 用户注册时间 这是一个典型的用户基础信息表。这类数据没有聚合需求,只需保证主键唯一性。(这里的主键为user_id+username)。那么我们的建表语句如下: CREATE TABLE IF NOT EXISTS example_db.expamle_tbl ( `user_id` LARGEINT NOT NULL COMMENT "用户id", `username` VARCHAR(50) NOT NULL COMMENT "用户昵称", `city` VARCHAR(20) COMMENT "用户所在城市", `age` SMALLINT COMMENT "用户年龄", `sex` TINYINT COMMENT "用户性别", `phone` LARGEINT COMMENT "用户电话", `address` VARCHAR(500) COMMENT "用户地址", `register_time` DATETIME COMMENT "用户注册时间" ) UNIQUE KEY(`user_id`, `username`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" ); 而这个表结构,完全同等于以下使用聚合模型描述的表结构: 表12 参数说明 ColumnName Type AggregationType Comment user_id BIGINT - 用户ID username VARCHAR(50) - 用户昵称 city VARCHAR(20) REPLACE 用户所在城市 age SMALLINT REPLACE 用户年龄 sex TINYINT REPLACE 用户性别 phone LARGEINT REPLACE 用户电话 address VARCHAR(500) REPLACE 用户住址 register_time DATETIME REPLACE 用户注册时间 建表语句。 CREATE TABLE IF NOT EXISTS example_db.expamle_tbl ( `user_id` LARGEINT NOT NULL COMMENT "用户id", `username` VARCHAR(50) NOT NULL COMMENT "用户昵称", `city` VARCHAR(20) REPLACE COMMENT "用户所在城市", `age` SMALLINT REPLACE COMMENT "用户年龄", `sex` TINYINT REPLACE COMMENT "用户性别", `phone` LARGEINT REPLACE COMMENT "用户电话", `address` VARCHAR(500) REPLACE COMMENT "用户地址", `register_time` DATETIME REPLACE COMMENT "用户注册时间" ) AGGREGATE KEY(`user_id`, `username`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" ); 即Unique模型完全可以用聚合模型中的REPLACE方式替代。其内部的实现方式和数据存储方式也完全一样。
  • Duplicate模型 在某些多维分析场景下,数据既没有主键,也没有聚合需求。因此,我们引入Duplicate数据模型来满足这类需求。 表13 数据 ColumnName Type SortKey Comment timestamp DATETIME Yes 日志时间 type INT Yes 日志类型 error_code INT Yes 错误码 error_msg VARCHAR(1024) No 错误详细信息 op_id BIGINT No 负责人ID op_time DATETIME No 处理时间 建表语句。 CREATE TABLE IF NOT EXISTS example_db.expamle_tbl ( `timestamp` DATETIME NOT NULL COMMENT "日志时间", `type` INT NOT NULL COMMENT "日志类型", `error_code` INT COMMENT "错误码", `error_msg` VARCHAR(1024) COMMENT "错误详细信息", `op_id` BIGINT COMMENT "负责人id", `op_time` DATETIME COMMENT "处理时间" ) DUPLICATE KEY(`timestamp`, `type`) DISTRIBUTED BY HASH(`type`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" ); 这种数据模型区别于Aggregate和Unique模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留。 而在建表语句中指定的DUPLICATE KEY,只是用来指明底层数据按照哪些列进行排序。更贴切的名称应该为“Sorted Column”,这里取名“DUPLICATE KEY”只是用以明确表示所用的数据模型。在DUPLICATE KEY的选择上,我们建议适当地选择前2-4列就可以。 这种数据模型适用于既没有聚合需求,又没有主键唯一性约束的原始数据的存储。更多使用场景,可参见聚合模型的局限性。
  • Aggregate模型 以实际的例子来说明什么是聚合模型,以及如何正确的使用聚合模型。 示例1:导入数据聚合 假设业务有以下模式: 表1 参数说明 ColumnName Type AggregationType Comment user_id LARGEINT - 用户ID date DATE - 数据导入日期 city VARCHAR(20) - 用户所在城市 age SMALLINT - 用户年龄 sex TINYINT - 用户性别 last_visit_date DATETIME REPLACE 用户最后一次访问时间 cost BIGINT SUM 用户总消费 max_dwell_time INT MAX 用户最大停留时间 min_dwell_time INT MIN 用户最小停留时间 转换成建表语句,如下所示。 CREATE TABLE IF NOT EXISTS demo.example_tbl ( `user_id` LARGEINT NOT NULL COMMENT "用户id", `date` DATE NOT NULL COMMENT "数据灌入日期时间", `city` VARCHAR(20) COMMENT "用户所在城市", `age` SMALLINT COMMENT "用户年龄", `sex` TINYINT COMMENT "用户性别", `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" ) AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" ); 可以看到,这是一个典型的用户信息和访问行为的事实表。在一般星型模型中,用户信息和访问行为一般分别存放在维度表和事实表中。这里我们为了更加方便的解释Doris的数据模型,将两部分信息统一存放在一张表中。 表中的列按照是否设置了AggregationType,分为Key(维度列)和Value(指标列)。没有设置AggregationType的,如user_id、date、age、sex称为Key,而设置了AggregationType的称为Value。 当导入数据时,对于Key列相同的行会聚合成一行,而Value列会按照设置的AggregationType进行聚合。AggregationType目前有以下四种聚合方式: SUM:求和,多行的Value进行累加。 REPLACE:替代,下一批数据中的Value会替换之前导入过的行中的Value。 MAX:保留最大值。 MIN:保留最小值。 表2 原始数据 user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 A 20 0 2017-10-01 06:00:00 20 10 10 10000 2017-10-01 A 20 0 2017-10-01 07:00:00 15 2 2 10001 2017-10-01 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 D 35 0 2017-10-03 10:20:22 11 6 6 我们假设这是一张记录用户访问某商品页面行为的表。我们以第一行数据为例,解释如下: 表3 参数说明 数据 说明 10000 用户id,每个用户唯一识别id 2017-10-01 数据入库时间,精确到日期 A 用户所在城市 20 用户年龄 0 性别男(1 代表女性) 2017-10-01 06:00:00 用户本次访问该页面的时间,精确到秒 20 用户本次访问产生的消费 10 用户本次访问,驻留该页面的时间 10 用户本次访问,驻留该页面的时间(冗余) 那么当这批数据正确导入到Doris中后,Doris中最终存储如下: 表4 插入数据 user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 A 20 0 2017-10-01 07:00:00 35 10 2 10001 2017-10-01 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 D 35 0 2017-10-03 10:20:22 11 6 6 可以看到,用户10000只剩下了一行聚合后的数据。而其余用户的数据和原始数据保持一致。这里先解释下用户10000 聚合后的数据: 前5列没有变化,从第6列last_visit_date开始: 2017-10-01 07:00:00:因为last_visit_date列的聚合方式为REPLACE,所以2017-10-01 07:00:00替换了2017-10-01 06:00:00保存了下来。 在同一个导入批次中的数据,对于REPLACE这种聚合方式,替换顺序不做保证。如在这个例子中,最终保存下来的,也有可能是2017-10-01 06:00:00。而对于不同导入批次中的数据,可以保证,后一批次的数据会替换前一批次。 35:因为cost列的聚合类型为SUM,所以由20+15累加获得35。 10:因为max_dwell_time列的聚合类型为MAX,所以10和2取最大值,获得10。 2:因为min_dwell_time列的聚合类型为MIN,所以10和2取最小值,获得2。 经过聚合,Doris中最终只会存储聚合后的数据。换句话说,即明细数据会丢失,用户不能够再查询到聚合前的明细数据了。 示例2:保留,明细数据。 接示例1,将表结构修改如下: 表5 参数说明 ColumnName Type AggregationType Comment user_id LARGEINT - 用户ID date DATE - 数据导入日期 timestamp DATETIME - 数据导入时间,精确到秒 city VARCHAR(20) - 用户所在城市 age SMALLINT - 用户年龄 sex TINYINT - 用户性别 last_visit_date DATETIME REPLACE 用户最后一次访问时间 cost BIGINT SUM 用户总消费 max_dwell_time INT MAX 用户最大停留时间 min_dwell_time INT MIN 用户最小停留时间 即增加了一列timestamp,记录精确到秒的数据导入时间。 同时,将AGGREGATE KEY设置为AGGREGATE KEY(user_id, date, timestamp, city, age, sex)。 导入数据如下: 表6 原始数据 user_id date timestamp city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 2017-10-01 08:00:05 A 20 0 2017-10-01 06:00:00 20 10 10 10000 2017-10-01 2017-10-01 09:00:05 A 20 0 2017-10-01 07:00:00 15 2 2 10001 2017-10-01 2017-10-01 18:12:10 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 2017-10-02 13:10:00 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 2017-10-02 13:15:00 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 2017-10-01 12:12:48 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 2017-10-03 12:38:20 D 35 0 2017-10-03 10:20:22 11 6 6 那么当这批数据正确导入到Doris中后,Doris中最终存储如下: 表7 数据结果 user_id date timestamp city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 2017-10-01 08:00:05 A 20 0 2017-10-01 06:00:00 20 10 10 10000 2017-10-01 2017-10-01 09:00:05 A 20 0 2017-10-01 07:00:00 15 2 2 10001 2017-10-01 2017-10-01 18:12:10 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 2017-10-02 13:10:00 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 2017-10-02 13:15:00 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 2017-10-01 12:12:48 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 2017-10-03 12:38:20 D 35 0 2017-10-03 10:20:22 11 6 6 示例3:导入数据与已有数据聚合。 接示例1中的参数列表,插入以下表中数据。 表8 原始数据 user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 A 20 0 2017-10-01 07:00:00 35 10 2 10001 2017-10-01 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 D 35 0 2017-10-03 10:20:22 11 6 6 在导入一批新的数据: 表9 新数据 user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time 10004 2017-10-03 D 35 0 2017-10-03 11:22:00 44 19 19 10005 2017-10-03 E 29 1 2017-10-03 18:11:02 3 1 1 那么当这批数据正确导入到Doris中后,Doris中最终存储如下: 表10 user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time 10000 2017-10-01 A 20 0 2017-10-01 07:00:00 35 10 2 10001 2017-10-01 A 30 1 2017-10-01 17:05:45 2 22 22 10002 2017-10-02 B 20 1 2017-10-02 12:59:12 200 5 5 10003 2017-10-02 C 32 0 2017-10-02 11:20:00 30 11 11 10004 2017-10-01 D 35 0 2017-10-01 10:00:15 100 3 3 10004 2017-10-03 D 35 0 2017-10-03 11:22:00 55 19 6 10005 2017-10-03 E 29 1 2017-10-03 18:11:02 3 1 1 可以看到,用户10004的已有数据和新导入的数据发生了聚合。同时新增了10005用户的数据。 数据的聚合,在Doris中有如下三个阶段发生: 每一批次数据导入的ETL阶段。该阶段会在每一批次导入的数据内部进行聚合。 底层BE进行数据Compaction的阶段。该阶段,BE会对已导入的不同批次的数据进行进一步的聚合。 数据查询阶段。在数据查询时,对于查询涉及到的数据,会进行对应的聚合。 数据在不同时间,可能聚合的程度不一致。例如一批数据刚导入时,可能还未与之前已存在的数据进行聚合。但是对于用户而言,用户只能查询到聚合后的数据。即不同的聚合程度对于用户查询而言是透明的。用户需始终认为数据以最终的完成的聚合程度存在,而不应假设某些聚合还未发生。
  • 查看调测结果 运行结果中没有异常或失败信息即表明运行成功。 图1 运行成功 日志说明:日志级别默认为INFO,可以通过调整日志打印级别(DEBUG,INFO,WARN,ERROR,FATAL)来显示更详细的信息。可以通过修改log4j.properties文件来实现,如: hbase.root.logger=INFO,console log4j.logger.org.apache.zookeeper=INFO #log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG log4j.logger.org.apache.hadoop.hbase=INFO # Make these two classes DEBUG-level. Make them DEBUG to see more zk debug. log4j.logger.org.apache.hadoop.hbase.zookeeper.ZKUtil=INFO log4j.logger.org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher=INFO 父主题: 在Linux中调测程序
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全