华为云用户手册

  • 修订记录 发布日期 修订记录 2021-02-01 第六次正式发布。 新增集群的管理节点为运行状态,但是集群异常提示“master node cannot reached”怎么办?。 2021-01-12 第五次正式发布。 新增管理共享存储。 HPC-S²应用场景与使用限制新增支持“华南-广州”。 HPC-S²应用场景与使用限制新增支持鲲鹏架构的sge调度器。 2020-03-26 第四次正式发布。 新增查看部署进度。 2019-09-04 第三次正式发布。 HPC-S²应用场景与使用限制新增支持“华北-北京四”。 2019-08-20 第二次正式发布。 删除“查看部署进度”章节。 2019-08-19 第一次正式发布。
  • HPC-S²使用限制 HPC解决方案服务当前只支持“华北-北京一”、“华北-北京四”、“华南-广州”区域,推荐使用“华北-北京四”,其他区域暂不支持。 集群部署仅支持slurm和sge两种调度器。 集群部署支持鲲鹏架构的sge调度器,支持X86架构的slurm和sge调度器。 单个用户可创建集群的上限为3个。 单个集群中的计算节点的上限为2000个。 集群创建/扩容时,节点不能添加数据盘,如需使用,用户需手动挂载。 当前不支持集群恢复操作,创建失败或扩容失败的节点无法自动恢复。 集群创建/扩容时,公共镜像当前只支持CentOS 7系列。 集群/节点执行删除操作时,请自行判断是否删除节点所绑定的弹性公网IP和挂载的数据盘。未删除的弹性公网IP和数据盘会持续产生扣费。 请不要在E CS 控制台对HPC集群中的节点进行操作,以免集群出现异常。 请勿修改或删除“/usr/local/.hpccluster”路径下文件内容,以免造成集群异常。 “/usr/local/.hpccluster/role/.ssh/”下的“authorized_keys”仅用于系统维护。 同一主账号下的不同子账号创建的集群不能重名。
  • 操作场景 当集群不再使用后,可使用集群删除的功能将集群删除,如未勾选“删除云服务器”,节点资源将持续扣费,包周期资源需手动退订。 集群创建失败后,可使用集群删除的功能将集群删除,删除时不要勾选“删除云服务器”,然后再使用“已有节点部署集群”的功能重新部署集群。 集群出现异常后,如无法手动进行恢复,可使用集群删除的功能将集群删除,删除时不要勾选“删除云服务器”,然后再使用“已有节点部署集群”的功能重新部署集群。
  • 操作步骤 登录HPC-S²控制台。 单击左侧的“集群管理”。 在“集群管理”页面,对于不需要或异常的集群可进行删除操作。 按需类型集群 确定页可选择是否删除云服务器,如勾选,连同云服务器一同删除,如不勾选,则只删除集群信息,对应的云服务器节点仍保留,用户可通过弹性云服务器页面查看。 包周期类型集群 不能选择删除节点,包周期节点资源需手动退订。 混合类型集群删除 可选择删除节点,同时会有提示包周期节点需要手动退订,勾选“删除节点”时,只有按需类型节点资源会被删除。
  • HPC-S²与其他服务的关系 服务名称 HPC-S²与其他服务的关系 主要交互功能 弹性云服务器(ECS) 购买弹性云服务器创建HPC集群或使用已有弹性云服务器部署HPC集群。 创建弹性云服务器 虚拟私有云(VPC) 同一个HPC场景的云服务器,都位于同一个VPC中,并且需要使用VPC中的子网和安全组进行相关的网络安全隔离。 创建虚拟私有云和子网 修改虚拟私有云基本信息 镜像服务 (IMS) 可以使用公共镜像、私有镜像、共享镜像创建高性能计算的云服务器。 也可以将已有的HPC场景的云服务器创建私有镜像。 创建私有镜像 云硬盘(EVS) 购买云硬盘并挂载至HPC场景的云服务器。 购买云硬盘 弹性文件服务(SFS) 为用户的弹性云服务器提供一个完全托管的共享文件存储。 文件共享 父主题: 产品介绍
  • 响应示例 状态码: 200 查询成功 { "dimensions" : [ { "name" : "disk", "value" : "2e84018fc8b4484b94e89aae212fe615", "origin_value" : "vda" }, { "name" : "disk", "value" : "6a1b2de69eeb9a037ea23de6b529394d", "origin_value" : "vdc" } ], "count" : 10 }
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 发送的实体的MIME类型。默认使用application/json; charset=UTF-8。 缺省值:application/json; charset=UTF-8 最小长度:1 最大长度:64 X-Auth-Token 是 String 用户Token 最小长度:1 最大长度:16384
  • URI GET /v2/{project_id}/instances/{instance_id}/agent-dimensions 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目编号。 最小长度:1 最大长度:64 instance_id 是 String 资源ID,如:4270ff17-aba3-4138-89fa-820594c39755。 最小长度:36 最大长度:36 表2 Query参数 参数 是否必选 参数类型 描述 dim_name 是 String 维度名称,枚举类型,类型有: mount_point:挂载点, disk:磁盘, proc:进程, gpu:显卡, raid: RAID控制器, 枚举值: mount_point disk proc gpu raid dim_value 否 String 维度值,32位字符串,如:2e84018fc8b4484b94e89aae212fe615。 最小长度:32 最大长度:32 offset 否 Integer 分页偏移量 最小值:0 最大值:2147483647 缺省值:0 正则匹配:^(0|[1-9][0-9]*)$ limit 否 Integer 分页大小 最小值:1 最大值:1000 缺省值:1000 正则匹配:^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000)$
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 dimensions Array of AgentDimension objects 维度信息 数组长度:0 - 2147483647 count Integer 维度信息总数 最小值:0 最大值:2147483647 表5 AgentDimension 参数 参数类型 描述 name String 维度名称,枚举类型,类型有: mount_point:挂载点, disk:磁盘, proc:进程, gpu:显卡, raid: RAID控制器 枚举值: mount_point disk proc gpu raid value String 维度值,32位字符串,如:2e84018fc8b4484b94e89aae212fe615 最小长度:32 最大长度:32 origin_value String 实际维度信息,字符串,如:vda。 最小长度:1 最大长度:1024 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 最小长度:0 最大长度:256 error_msg String 错误信息 最小长度:0 最大长度:256 request_id String 请求id 最小长度:0 最大长度:256 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码 最小长度:0 最大长度:256 error_msg String 错误信息 最小长度:0 最大长度:256 request_id String 请求id 最小长度:0 最大长度:256 状态码: 500 表8 响应Body参数 参数 参数类型 描述 error_code String 错误码 最小长度:0 最大长度:256 error_msg String 错误信息 最小长度:0 最大长度:256 request_id String 请求id 最小长度:0 最大长度:256
  • 场景介绍 GaussDB (DWS)使用对象标识符(oid)来保存对象之间的引用关系,这使得视图在定义的时候就绑定了其依赖的数据库对象的oid,不管视图名称怎么改变,都不会改变这层依赖关系。如果要对基表进行一些字段修改,会因为与视图字段存在强绑定而报错。如果要删除某个表字段或整个表,就需要连同其关联的视图一起使用cascade关键字删除,表字段删除完成或表重建后再依次重建各级视图,给用户的使用增加了很大的工作量,导致易用性较差。 为了解决这一问题,GaussDB(DWS)在8.1.0集群版本实现了视图的解耦,使得存在视图依赖的基表或其他数据库对象(视图、同义词、函数、表字段)可以单独删除,而其对应对象上关联的依赖视图依然存在,而在基表重建后,可以通过ALTER VIEW REBUILD命令重建依赖关系。而8.1.1集群版本在此基础上又实现了自动重建,可以无感知自动重建依赖关系,开启自动重建后会有锁冲突,因此不建议用户开启自动重建。
  • 使用方法 在管理控制台上创建集群,具体操作步骤请参考创建集群。 打开GUC参数view_independent参数。 视图解耦功能由GUC参数view_independent进行控制,默认关闭。使用时需要用户手动打开,可登录管理控制台后,单击集群名称,进入“集群详情”页面,单击“参数修改”页签,并在“参数列表”模块搜索view_independent参数,修改后保存。 使用DAS连接集群。在集群列表中找到所需要的集群,单击“操作”栏中的“登录”按钮,跳转至数据库管理服务(DAS)页面,填写登录用户名、数据库名称、密码信息后测试连接,测试无误后登录集群。更多详细步骤请参考使用DAS连接集群。 创建示例表t1并插入数据。 1 2 3 SET current_schema='public'; CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a); INSERT INTO t1 VALUES(1,1,'a'),(2,2,'b'); 创建视图v1依赖表t1,创建视图v11依赖视图v1。查询视图v11。 1 2 3 4 5 6 7 8 9 CREATE VIEW v1 AS SELECT a, b FROM t1; CREATE VIEW v11 AS SELECT a FROM v1; SELECT * FROM v11; a --- 1 2 (2 rows) 删除表t1后,查询视图v11会因表t1不存在而报错,但视图是依旧存在的。 GaussDB(DWS)提供GS_VIEW_INVALID视图查询当前用户可见的所有不可用的视图。如果该视图依赖的基础表或函数或同义词存在异常,该视图validtype列显示为“invalid”。 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE t1; SELECT * FROM v11; ERROR: relation "public.t1" does not exist SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+-----------------------------+----------- 213563 | public | v1 | dbadmin | SELECT a, b FROM public.t1; | invalid 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (2 rows) 8.3.0之前的历史版本集群,重建表t1后,视图自动重建。视图只有使用才能自动刷新。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a); INSERT INTO t1 VALUES(1,1,'a'),(2,2,'b'); SELECT * from v1; a | b ---+--- 1 | 1 2 | 2 (2 rows) SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+--------------------------+----------- 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (1 row) SELECT * from v11; a --- 1 2 (2 rows) SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype -----+------------+----------+-----------+------------+----------- (0 rows) 8.3.0及以上版本集群,重建表t1后,视图不会自动重建,执行ALTER VIEW REBUILD操作后视图才能自动刷新。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a); INSERT INTO t1 VALUES(1,1,'a'),(2,2,'b'); SELECT * from v1; a | b ---+--- 1 | 1 2 | 2 (2 rows) SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+-----------------------------+----------- 213563 | public | v1 | dbadmin | SELECT a, b FROM public.t1; | invalid 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (1 row) ALTER VIEW ONLY v1 REBUILD; SELECT * FROM gs_view_invalid; oid | schemaname | viewname | viewowner | definition | validtype --------+------------+----------+-----------+--------------------------+----------- 213567 | public | v11 | dbadmin | SELECT a FROM public.v1; | invalid (1 rows)
  • 步骤三:创建资源池 登录GaussDB(DWS) 管理控制台,在集群列表中单击集群名称,切换至“资源管理”页签。 单击“添加资源池”创建资源池。参见场景介绍的模型分别创建报表业务资源池pool_1和核心交易资源池pool_2。 修改异常规则。 单击创建好的pool_1资源池。 在异常规则中,修改“阻塞时间”和“执行所消耗时间”分别为1200s和1800s。 单击“保存”。 重复以上步骤,修改pool_2。 关联用户。 左侧单击“pool_1”资源池。 单击“关联用户”右侧的“添加”。 勾选报表业务对应的用户report_user,单击“确定”。 重复以上步骤,将核心交易的用户budget_config_user添加入pool_2的资源池中。
  • 步骤四:异常规则验证 使用用户report_user登录数据库。 执行如下命令查看用户report_user所属资源池。 1 SELECT usename,respool FROM pg_user WHERE usename = 'report_user'; 查询显示用户report_user所属资源池为pool_1。 校验资源池pool_1所绑定的异常规则。 1 SELECT respool_name,mem_percent,active_statements,except_rule FROM pg_resource_pool WHERE respool_name='pool_1'; 确认资源池pool_1所绑定的是异常规则rule_1。 查看当前用户异常规则的规则类型和阈值。 1 SELECT * FROM pg_except_rule WHERE name = 'rule_1'; 查询显示rule_1中所绑定的规则为3设置的“阻塞时间1200秒,运行时长1800秒”,则会终止查询。 PG_EXCEPT_RULE系统表存储关于异常规则的信息,该系统表仅8.2.0及以上集群版本支持。 同一条异常规则内的参数项相互之间为且的关系。 执行作业,当运行时长超过“阻塞时间1200秒,运行时长1800秒”时,报错提示作业被取消并提示所触发的异常规则限制。 作业执行过程中,如果出现类似“ERROR: canceling statement due to workload manager exception.”的报错信息,表示该作业超过异常规则的规则阈值限制被终止。若规则设置合理,那么就需要考虑从业务角度进行语句优化,减少执行时间。
  • 步骤二:连接集群并导入数据 参见使用gsql命令行客户端连接集群连接集群。 导入样例数据。参见导入TPC-H数据。 执行以下语句创建核心交易用户budget_config_user和报表用户report_user。 1 2 CREATE USER budget_config_user PASSWORD 'password'; CREATE USER report_user PASSWORD 'password'; 为测试需要,将tpch模式下所有表的所有权限授予两个用户。 1 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA tpch to budget_config_user,report_user; 查看当前两个用户的资源分配情况。 1 SELECT * FROM PG_TOTAL_USER_RESOURCE_INFO where username in ('budget_config_user' , 'report_user');
  • 场景介绍 当有多个数据库用户同时在GaussDB(DWS)上执行SQL作业时,可能出现以下情况: 一些复杂SQL可能会长时间占用集群资源,从而影响其他查询的性能。例如一组数据库用户不断提交复杂、耗时的查询,而另一组用户经常提交短查询。在这种情况下,短时查询可能不得不在资源池中等待耗时查询完成。 一些SQL由于数据倾斜、执行计划未调优等原因,占用过多内存空间,导致其他语句因申请不到内存而报错,或占用过多磁盘空间,导致磁盘满而触发集群只读,无法进行写入。 为了提高系统整体吞吐量,避免坏SQL影响系统整体运行,您可以使用GaussDB(DWS)工作负载管理功能处理这类问题,例如,将经常提交复杂查询作业的数据库用户分为一类,为这类用户创建一个资源池并给这个资源池分配多一些的资源,之后将这类用户添加至这个资源池中,那么这类用户所提交的复杂作业只能使用所创建资源池拥有的资源;同时再创建一个占用资源较少的资源池分配给执行短查询的用户使用,这样两种作业就能够同时执行互不影响。 以A用户为例,该用户业务场景主要分为联机交易(OLTP)和报表分析(OLAP)两大类,其中报表服务的优先级相对较低,在合理的情况下优先保障业务系统的正常运行。业务系统中运行的SQL分为简单SQL和复杂SQL,大量复杂SQL的并发执行会导致数据库服务器资源争抢,简单SQL的大量并发对服务器不构成持续压力,短时间内可执行完成,不会造成业务堆积。其中报表服务中运行的SQL以复杂SQL居多,整体业务逻辑相对复杂,在数据库层面需要分别对核心交易和报表服务进行合理的资源管控,以保障业务系统正常运行。 报表分析类业务的优先级和实时性相对较低,但是复杂度更高,为有效进行资源管控,将报表分析和核心交易业务进行数据库用户分离,例如核心交易业务使用数据库用户budget_config_user,报表分析业务使用数据库用户report_user。针对交易用户和报表用户分别进行CPU资源和并发数控制以保障数据库稳定运行。 结合报表分析业务的负载调研、日常监控和测试验证,50并发以内的复杂报表SQL不会引起服务器资源争抢,不会引起业务系统卡慢,配置报表用户可使用20%的CPU资源。 结合核心交易业务的负载调研、日常监控和测试验证,100并发以内的查询SQL不会对系统造成持续压力,配合交易用户可使用60%的CPU资源。 报表用户资源配置(对应资源池pool_1):CPU=20%,内存=20%,存储=1024000MB,并发=20。 交易用户资源配置(对应资源池pool_2):CPU=60%,内存=60%,存储=1024000MB,并发=200。 设置单个语句最大内存使用量,超过使用量则报错退出,避免单个语句占用过多内存。 异常规则中设置阻塞时间=1200S,执行所消耗时间1800s,强制终止。
  • 使用gsql元命令导入数据 \copy命令在任何gsql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较,\copy命令不是读取或写入数据库服务端的文件,而是直接读取或写入本地文件。 \copy命令不如SQL COPY命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说SQL命令可能会更好。 有关如何使用\copy命令的更多信息,请参阅使用gsql元命令\COPY导入数据 。 \COPY只适合小批量、格式良好的数据导入,容错能力较差。导入数据应优先选择GDS或COPY。
  • 使用GDS导入数据 数据倾斜会造成查询表性能下降。对于记录数超过千万条的表,建议在执行全量数据导入前,先导入部分数据,以进行数据倾斜检查和调整分布列,避免导入大量数据后发现数据倾斜而造成调整成本高。详细请参见查看数据倾斜状态。 为了优化导入速度,建议拆分文件,使用多GDS进行并行导入。单个导入任务可以拆分成多个导入任务并发执行导入;多个导入任务使用同一GDS时,可以使用-t参数打开GDS多线程并发执行导入。GDS建议挂载在不同物理盘以及不同网卡上,避免物理IO以及网络可能出现的瓶颈。 在GDS IO与网卡未达到物理瓶颈前,可以考虑在GaussDB(DWS)开启SMP进行加速。SMP开启之后会对对应的GDS产生成倍的压力。需要特别说明的是:SMP自适应衡量的标准是GaussDB(DWS)的CPU压力,而不是GDS所承受的压力。有关SMP的更多信息请参见SMP手动调优建议。 GDS与GaussDB(DWS)通信要求物理网络畅通,并且尽量使用万兆网。千兆网无法承载高速的数据传输压力,极易出现断连。即使用千兆网时GaussDB(DWS)无法提供通信保障。满足万兆网的同时,数据磁盘组I/O性能大于GDS单核处理能力上限(约400MB/s)时,方可寻求单文件导入速率最大化。 并发导入场景与单表导入相似,至少应保证I/O性能大于网络最大速率。 GDS跟DN的数据比例建议在1:3至1:6之间。 为了优化列存分区表的批量插入效率,在批量插入过程中会对数据进行缓存后再批量写盘。通过GUC参数“partition_mem_batch”和“partition_max_cache_size”,可以设置缓存个数以及缓存区大小。这两个参数的值越小,列存分区表的批量插入越慢。当然,越大的缓存个数和缓存分区,会带来越多的内存消耗。
  • 使用INSERT多行插入 在导入时,如果不能使用COPY命令,可以根据情况使用多行插入。多行插入是通过批量进行一系列插入而提高性能。 下面的示例使用一条INSERT语句向一个三列表插入三行。这仍属于少量插入,只是用来说明多行插入的语法。创建表的步骤请参考创建表。 向表customer_t1中插入多行数据: 1 2 3 4 INSERT INTO customer_t1 VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James'); 有关更多详情和示例,请参阅INSERT。
  • 从OBS并行导入数据 将导入数据拆分为多个文件 导入大数据量的数据时,通常需要较长的时间及耗费较多的计算资源。 从OBS上导入数据时,如下方法可以提升导入性能:将数据文件存储到OBS前,尽可能均匀地将文件切分成多个,文件的数量为DN的整数倍更适合。 在导入前后验证数据文件 从OBS导入数据时,首先将您的文件上传到OBS存储桶中,建议您列出存储桶的内容,然后验证该存储桶是否包含所有正确的文件并且仅包含这些文件。 在完成导入操作后,请使用SELECT查询语句验证所需文件是否已导入。 OBS导入导出数据时,不支持中文路径。
  • 查看冷热表数据分布 查看单表数据分布情况。 1 2 3 4 5 6 7 SELECT * FROM pg_catalog.pg_lifecycle_table_data_distribute('lifecycle_table'); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------------+--------------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | lifecycle_table | dn_6001_6002 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes public | lifecycle_table | dn_6003_6004 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes public | lifecycle_table | dn_6005_6006 | p1,p2,p3,p8 | | | 96 KB | 0 bytes | 0 bytes (3 rows) 查看所有冷热表数据分布情况。 1 2 3 4 5 6 7 SELECT * FROM pg_catalog.pg_lifecycle_node_data_distribute(); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------------+--------------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | lifecycle_table | dn_6001_6002 | p1,p2,p3,p8 | | | 98304 | 0 | 0 public | lifecycle_table | dn_6003_6004 | p1,p2,p3,p8 | | | 98304 | 0 | 0 public | lifecycle_table | dn_6005_6006 | p1,p2,p3,p8 | | | 98304 | 0 | 0 (3 rows)
  • 冷热数据切换 切换冷数据至OBS表空间。 自动切换:每日0点调度框架自动触发,无需关注切换情况。 可使用函数pg_obs_cold_refresh_time(table_name, time)自定义自动切换时间。例如,根据业务情况调整自动触发时间为每天早晨6点30分。 1 2 3 4 5 SELECT * FROM pg_obs_cold_refresh_time('lifecycle_table', '06:30:00'); pg_obs_cold_refresh_time -------------------------- SUC CES S (1 row) 手动切换。 使用ALTER TABLE语句手动切换单表: 1 2 ALTER TABLE lifecycle_table refresh storage; ALTER TABLE 使用函数pg_refresh_storage()批量切换所有冷热表: 1 2 3 4 5 SELECT pg_catalog.pg_refresh_storage(); pg_refresh_storage -------------------- (1,0) (1 row)
  • 场景介绍 海量大数据场景下,随着业务和数据量的不断增长,数据存储与消耗的资源也日益增长。根据业务系统中用户对不同时期数据的不同使用需求,对膨胀的数据进行“冷热”分级管理,不仅可以提高数据分析性能还能降低业务成本。针对数据使用的一些场景,可以将数据按照时间分为:热数据、冷数据。 冷热数据主要从数据访问频率、更新频率进行划分。 Hot(热数据):访问、更新频率较高,对访问的响应时间要求很高的数据。 Cold(冷数据):不允许更新或更新访问频率较低,对访问的响应时间要求不高的数据。 用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。 图1 冷热数据管理 冷热切换的策略名称支持LMT(last modify time)和HPN(hot partition number),LMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。 LMT:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0, 36500],单位为天。 HPN:表示保留HPN个有数据的分区为热分区。在冷热切换时,需要将数据迁移至OBS表空间中。其中HPN为整型,范围为[0,1600]。
  • 创建冷热表 创建列存冷热数据管理表lifecycle_table,指定热数据有效期LMT为100天。 1 2 3 4 5 6 7 8 9 CREATE TABLE lifecycle_table(i int, val text) WITH (ORIENTATION = COLUMN, storage_policy = 'LMT:100') PARTITION BY RANGE (i) ( PARTITION P1 VALUES LESS THAN(5), PARTITION P2 VALUES LESS THAN(10), PARTITION P3 VALUES LESS THAN(15), PARTITION P8 VALUES LESS THAN(MAXVALUE) ) ENABLE ROW MOVEMENT;
  • 使用方法 设置参数(表倾斜告警阈值table_skewness_warning_threshold和表倾斜告警最小行数table_skewness_warning_rows)。 表倾斜告警阈值取值范围0~1,默认值为1,即关闭状态,取其他值时为开启状态。 表倾斜告警最小行数取值范围0~2147483647,默认值为100,000。当导入总行数超过该值与导入DN数之积时,才可能触发告警,从而不会在小数据量导入的场景进行无意义的告警。 1 2 3 4 show table_skewness_warning_threshold; set table_skewness_warning_threshold = xxx; show table_skewness_warning_rows; set table_skewness_warning_rows = xxx; 使用INSERT或者COPY导入。 发现并处理告警,告警信息包括表名、最小行数、最大行数、总行数、平均行数、倾斜率,以及提示信息(检查数据分布或者修改参数)。 WARNING: Skewness occurs, table name: xxx, min value: xxx, max value: xxx, sum value: xxx, avg value: xxx, skew ratio: xxx HINT: Please check data distribution or modify warning threshold
  • 执行导出数据 创建普通表product_info_output。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DROP TABLE product_info_output; CREATE TABLE product_info_output ( product_price int , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt int , product_comment_time date , product_comment_num int , product_comment_content varchar(200) ) with (orientation = column,compression=middle) distribute by hash (product_name); 将表product_info_output的数据通过外表product_info_output_ext导出到数据文件中。 1 INSERT INTO product_info_output_ext SELECT * FROM product_info_output; 若返回如下信息,表示数据导出成功。 1 INSERT 0 10
  • 创建外表 建立不包含分区列的HDFS外表,表关联的外部服务器为hdfs_server,表对应的HDFS服务上的文件格式为“orc”,HDFS上的数据存储路径为“/user/hive/warehouse/product_info_orc/”。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 DROP FOREIGN TABLE IF EXISTS product_info_output_ext; CREATE FOREIGN TABLE product_info_output_ext ( product_price integer , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca OPTIONS ( format 'orc', foldername '/user/hive/warehouse/product_info_orc/', compression 'snappy', version '0.12' ) Write Only;
  • 创建外部服务器 使用Data Studio连接已创建好的DWS集群。 新建一个具有创建数据库权限的用户dbuser: 1 CREATE USER dbuser WITH CREATEDB PASSWORD 'password'; 切换为新建的dbuser用户: 1 SET ROLE dbuser PASSWORD 'password'; 创建新的mydatabase数据库: 1 CREATE DATABASE mydatabase; 执行以下步骤切换为连接新建的mydatabase数据库。 在Data Studio客户端的“对象浏览器”窗口,右键单击数据库连接名称,在弹出菜单中单击“刷新”,刷新后就可以看到新建的数据库。 右键单击“mydatabase”数据库名称,在弹出菜单中单击“打开连接”。 右键单击“mydatabase”数据库名称,在弹出菜单中单击“打开新的终端”,即可打开连接到指定数据库的SQL命令窗口,后面的步骤,请全部在该命令窗口中执行。 为dbuser用户授予创建外部服务器的权限,8.1.1及以后版本,还需要授予使用public模式的权限: 1 2 GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser; GRANT ALL ON SCHEMA public TO dbuser; //8.1.1及以后版本,普通用户对public模式无权限,需要赋权,8.1.1之前版本不需要执行。 其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令赋予用户使用外表的权限。 1 ALTER USER dbuser USEFT; 切换回Postgres系统数据库,查询创建 MRS 数据源后系统自动创建的外部服务器。 1 SELECT * FROM pg_foreign_server; 返回结果如: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- gsmpp_server | 10 | 13673 | | | | gsmpp_errorinfo_server | 10 | 13678 | | | | hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:9820,192.168.1.218:9820",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (3 rows) 切换到mydatabase数据库,并切换到dbuser用户。 1 SET ROLE dbuser PASSWORD 'password'; 创建外部服务器。 SERVER名字、地址、配置路径保持与8一致即可。 1 2 3 4 5 6 7 CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca FOREIGN DATA WRAPPER HDFS_FDW OPTIONS ( address '192.168.1.245:9820,192.168.1.218:9820', //MRS管理面的Master主备节点的内网IP,可与DWS通讯。 hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca', type 'hdfs' ); 查看外部服务器。 1 SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:9820,192.168.1.218:9820",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (1 row)
  • 场景二:常规数据倾斜巡检 在库中表个数少于1W的场景,直接使用倾斜视图查询当前数据库内所有表的数据倾斜情况。 1 SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC; 在库中表个数非常多(至少大于1W)的场景,因PGXC_GET_TABLE_SKEWNESS涉及全库查并计算非常全面的倾斜字段,所以可能会花费比较长的时间(小时级),建议参考PGXC_GET_TABLE_SKEWNESS视图定义,直接使用table_distribution()函数自定义输出,减少输出列进行计算优化,例如: 1 2 3 4 5 6 SELECT schemaname,tablename,max(dnsize) AS maxsize, min(dnsize) AS minsize FROM pg_catalog.pg_class c INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H' GROUP BY schemaname,tablename;
  • 场景三:查询某个表的数据倾斜情况 执行以下SQL查询某个表的数据倾斜情况,其中table_name替换为实际的表名。 1 SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; 返回如下类似信息。若各DN上数据分布差小于10%,表明数据分布均衡。若大于10%,则表示数据出现倾斜。 1 2 3 4 5 6 7 8 9 10 11 12 SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; count | node_name ------+----------- 11010 | datanode4 10000 | datanode3 12001 | datanode2 8995 | datanode1 10000 | datanode5 7999 | datanode6 9995 | datanode7 10000 | datanode8 (8 rows)
  • 场景一:磁盘满后快速定位存储倾斜的表 首先,通过pg_stat_get_last_data_changed_time(oid)函数查询出近期发生过数据变更的表,介于表的最后修改时间只在进行IUD操作的CN记录,要查询库内1天(间隔可在函数中调整)内被修改的所有表,可以使用如下封装函数: CREATE OR REPLACE FUNCTION get_last_changed_table(OUT schemaname text, OUT relname text) RETURNS setof record AS $$ DECLARE row_data record; row_name record; query_str text; query_str_nodes text; BEGIN query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'''; FOR row_name IN EXECUTE(query_str_nodes) LOOP query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT b.nspname,a.relname FROM pg_class a INNER JOIN pg_namespace b on a.relnamespace = b.oid where pg_stat_get_last_data_changed_time(a.oid) BETWEEN current_timestamp - 1 AND current_timestamp;'''; FOR row_data IN EXECUTE(query_str) LOOP schemaname = row_data.nspname; relname = row_data.relname; return next; END LOOP; END LOOP; return; END; $$ LANGUAGE plpgsql; 然后,通过table_distribution(schemaname text, tablename text)查询出表在各个DN占用的存储空间。 1 SELECT table_distribution(schemaname,relname) FROM get_last_changed_table();
共100000条