云服务器内容精选

  • 原因分析 创建OBS外表语句中的访问密钥AK和SK错误,会出现如下所示的错误信息: 1 ERROR: Fail to connect OBS in node:cn_5001 with error code: AccessDenied 账户OBS权限不足,对OBS桶没有读、写权限,会出现如下所示的错误信息: 1 dn_6001_6002: Datanode 'dn_6001_6002' fail to read OBS object bucket:'obs-bucket-name' key:'xxx/xxx/xxx.csv' with OBS error code:AccessDenied message: Access Denied 默认情况下,您不具备访问其他账号的OBS数据的权限,此外, IAM 用户(相当于子用户)也不具备访问其所属账号的OBS数据的权限。
  • 处理方法 创建OBS外表语句中的访问密钥AK和SK错误 请获取正确的访问密钥AK和SK,写入创建OBS外表的SQL语句中。获取访问密钥的步骤如下: 登录 GaussDB (DWS)管理控制台。 将鼠标移至右上角的用户名,单击“我的凭证”。 进入“我的凭证”后,在左侧导航树单击“访问密钥”。 在访问密钥页面,可以查看已有的访问密钥ID(即AK)。 如果要同时获取AK和SK,单击“新增访问密钥”创建并下载访问密钥。 账户OBS权限不足,对OBS桶没有读、写权限 您必须给指定的用户授予所需的OBS访问权限: 通过OBS外表导入数据到GaussDB(DWS)时,执行导入操作的用户必须具备数据源文件所在的OBS桶和对象的读取权限。 通过OBS外表导出数据时,执行导出操作的用户必须具备数据导出路径所在的OBS桶和对象的读取和写入权限。 有关配置OBS权限的具体操作,请参见《 对象存储服务 控制台指南》中的配置桶ACL和“配置对象ACL”章节。
  • 使用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”,可以设置缓存个数以及缓存区大小。这两个参数的值越小,列存分区表的批量插入越慢。当然,越大的缓存个数和缓存分区,会带来越多的内存消耗。
  • 从OBS并行导入数据 将导入数据拆分为多个文件 导入大数据量的数据时,通常需要较长的时间及耗费较多的计算资源。 从OBS上导入数据时,如下方法可以提升导入性能:将数据文件存储到OBS前,尽可能均匀地将文件切分成多个,文件的数量为DN的整数倍更适合。 在导入前后验证数据文件 从OBS导入数据时,首先将您的文件上传到OBS存储桶中,建议您列出存储桶的内容,然后验证该存储桶是否包含所有正确的文件并且仅包含这些文件。 在完成导入操作后,请使用SELECT查询语句验证所需文件是否已导入。 OBS导入导出数据时,不支持中文路径。
  • 使用gsql元命令导入数据 \copy命令在任何gsql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较,\copy命令不是读取或写入数据库服务端的文件,而是直接读取或写入本地文件。 \copy命令不如SQL COPY命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说SQL命令可能会更好。 有关如何使用\copy命令的更多信息,请参阅使用gsql元命令\COPY导入数据 。 \COPY只适合小批量、格式良好的数据导入,容错能力较差。导入数据应优先选择GDS或COPY。
  • 使用INSERT多行插入 在导入时,如果不能使用COPY命令,可以根据情况使用多行插入。多行插入是通过批量进行一系列插入而提高性能。 下面的示例使用一条INSERT语句向一个三列表插入三行。这仍属于少量插入,只是用来说明多行插入的语法。 向表customer_t1中插入多行数据: 1 2 3 4 INSERT INTO customer_t1 VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James'); 有关更多详情和示例,请参考INSERT章节。
  • 兼容性说明 支持OpenAPI规范。 OpenAPI规范(OAS),是定义一个标准的、与具体编程语言无关的RESTful API的规范。OpenAPI规范的前身是Swagger规范,API网关目前支持两种OpenAPI规范:Swagger 2.0或OpenAPI 3.0。为了方便区分,下文中OAS表示OpenAPI规范(包含Swagger 2.0或OpenAPI 3.0),Swagger表示Swagger 2.0规范,OpenAPI表示OpenAPI 3.0规范。 API网关导入或导出的OAS对象,与API网关对象定义的映射关系。 请求参数类型与API网关参数类型差异。 API请求路径模板语法差异。 导入API时支持的API网关扩展字段。 表1 OAS对象与API网关对象定义的映射关系 Swagger对象 OpenAPI对象 (以3.0.0为例) API网关对象 导入时行为 导出时行为 info.title info.title API分组名称 导入到新的分组:新的分组名称 导入到已有分组:未使用 支持汉字、英文、数字、下划线,且只能以英文或汉字开头,3 ~ 64字符 填充为分组名称 info.description info.description API分组描述 导入到新的分组:新的分组描述 导入到已有分组:未使用 填充为分组描述信息 info.version info.version 版本 未使用 用户指定 未指定则使用当前时间 host server.url API分组 域名 未使用 优先使用API分组的第一个自定义域名 如果分组未绑定自定义域名则使用分组的独立域名 basePath - - 将与每条API的请求路径拼接起来使用 未填充 paths.path paths.path API请求路径 与basePath拼接起来作为API请求路径 填充为API请求路径 operation.operationId operation.operationId API名称 作为API名称 填充为API名称 operation.description operation.description API描述 作为API描述 填充为API描述 operation.parameters operation.parameters API前端请求参数 作为API请求参数 填充为API请求参数 operation.schemes - API前端请求协议 作为API请求协议 填充为API请求协议 operation.responses operation.responses - 未使用 固定填充default响应定义 operation.security operation.security API认证方式 API认证方式 结合x-apigateway-auth-type 填充为API认证方式 结合x-apigateway-auth-type 表2 请求参数类型和API网关参数类型差异 OAS类型 API网关类型 支持的参数属性字段 integer long float double number maximum minimum default enum required description string string maxLength minLength default enum required description 其它类型 不支持 不支持 表3 API请求路径模板语法差异 语法 OAS类型Swagger类型 API网关 /users/{userName} 支持 支持 /users/prefix-{userName} /users/{userName}-suffix /users/prefix-{userName} -suffix 支持 前端请求定义不支持 后端请求定义支持 /users/{proxy+} 不支持 前端请求定义支持 后端请求定义不支持
  • 限制说明 API网关参数限制,如下所示。 API网关暂不支持formData和body位置的请求参数定义。 API网关暂不支持consumes和produces定义。 API网关中,header位置的参数名称,不区分大小写。 后端策略限制,如下所示。 默认后端类型为HTTP,策略后端支持HTTP、HTTP-VPC 默认后端类型为HTTP-VPC,策略后端支持HTTP、HTTP-VPC 默认后端类型为function,策略后端支持function 默认后端类型为mock,策略后端支持mock
  • 执行数据导入 在GaussDB(DWS)数据库中,创建一个名为product_info的表,用于存储从OBS导入的数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 DROP TABLE IF EXISTS product_info; CREATE TABLE product_info ( product_price integer not null, product_id char(30) not null, 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) ) WITH ( orientation = column, compression=middle ) DISTRIBUTE BY hash (product_id); 执行INSERT命令,通过外表product_info_ext将OBS上的数据导入到目标表product_info中。 1 INSERT INTO product_info SELECT * FROM product_info_ext; 执行SELECT命令查询目标表product_info,查看从OBS导入到GaussDB(DWS)中的数据。 1 SELECT * FROM product_info; 查询结果的结尾将显示以下信息: (20 rows) 对表product_info执行VACUUM FULL。 1 VACUUM FULL product_info; 更新表product_info的统计信息。 1 ANALYZE product_info;
  • 教程指引 本教程通过演示将样例数据上传OBS,以及将OBS的数据导入GaussDB(DWS)的目标表中,让您快速掌握如何从OBS导入数据到GaussDB(DWS)集群的完整过程。 GaussDB(DWS)支持通过外表将OBS上TXT、 CS V、ORC、PARQUET、CARBONDATA以及JSON格式的数据导入到集群进行查询。 本教程中以CSV格式为例,进行如下操作: 生成CSV格式的数据文件。 创建一个与GaussDB(DWS)集群在同一区域的OBS存储桶,然后将数据文件上传到该存储桶。 创建外表,用于引流OBS存储桶中的数据到GaussDB(DWS)集群。 启动GaussDB(DWS)并创建数据库表后,将OBS上的数据导入到表中。 根据错误表中的提示诊断加载错误并更正这些错误。 估计时间:30分钟
  • 上传数据到OBS 将上面准备的3个CSV格式的数据源文件存储到OBS桶中。 登录OBS管理控制台。 单击“服务列表”,选择“对象存储服务”,打开OBS管理控制台页面。 创建桶。 如何创建OBS桶,具体请参见《对象存储服务》“快速入门”中的创建桶。 例如,创建以下两个桶:“mybucket”和“mybucket02”。 确保这两个桶与GaussDB(DWS)集群在同一个区域,本教程以“华北-北京四”区域为例。 新建文件夹。 具体请参见《对象存储服务用户指南》中的新建文件夹章节。 例如: 在已创建的OBS桶“mybucket”中新建一个文件夹“input_data”。 在已创建的OBS桶“mybucket02”中新建一个文件夹“input_data”。 上传文件。 具体请参见《对象存储服务快速入门》的上传对象章节。 例如: 将以下数据文件上传到OBS桶“mybucket”的“input_data”目录中。 1 2 product_info0.csv product_info1.csv 将以下数据文件上传到OBS桶“mybucket02”的“input_data”目录中。 1 product_info2.csv 为导入用户设置OBS桶的读取权限。 在从OBS导入数据到集群时,执行导入操作的用户需要取得数据源文件所在OBS桶的读取权限。通过配置桶的ACL权限,可以将读取权限授予指定的用户账号。 具体请参见《对象存储服务控制台指南》中的配置桶ACL章节。
  • 创建外表 连接GaussDB(DWS)数据库。 创建外表。 AC CES S_KEY和SECRET_ACCESS_KEY 用户访问OBS的AK和SK,请根据实际替换。 获取访问密钥,请登录管理控制台,将鼠标移至右上角的用户名,单击“我的凭证”,然后在左侧导航树单击“访问密钥”。在访问密钥页面,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 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 28 29 30 DROP FOREIGN TABLE IF EXISTS product_info_ext; CREATE FOREIGN TABLE product_info_ext ( product_price integer not null, product_id char(30) not null, 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 gsmpp_server OPTIONS( LOCATION 'obs://mybucket/input_data/product_info | obs://mybucket02/input_data/product_info', FORMAT 'CSV' , DELIMITER ',', ENCODING 'utf8', HEADER 'false', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', FILL_MISSING_FIELDS 'true', IGNORE_EXTRA_DATA 'true' ) READ ONLY LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 返回如下信息表示创建成功: 1 CREATE FOREIGN TABLE
  • 执行数据导入 创建本地目标表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 DROP TABLE IF EXISTS product_info; CREATE TABLE product_info ( 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) ) with ( orientation = column, compression=middle ) DISTRIBUTE BY HASH (product_id); 从外表导入目标表。 1 INSERT INTO product_info SELECT * FROM foreign_product_info; 查询导入结果。 1 SELECT * FROM product_info;
  • 创建外部服务器 使用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)
  • 手动导入 通过主页面的“更多功能”选项或单击左上角搜索框旁边的,可以展示当前支持的导入选项,可根据需要选择。 导入文件 选择响应格式的文件并上传,然后选择文件中系统识别出来的接口和数据模型导入。 一个文件导入后,将会视为一个根目录,一个根目录中不允许存在URL相同的接口。 Postman支持Collections和Environment数据集ZIP包的全量导入,也支持单个Collection文件导入。 Postman支持接口和接口用例的前置脚本及后置脚本导入。 导入URL 选择“导入Swagger URL”,输入URL,即可完成文档导入。 通过Swagger URL导入时,需要填写json数据文件的URL,而非Swagger UI的URL。