华为云用户手册

  • 通过API网关调用Karmada API Karmada API 可以通过API网关调用,其URL格式为:https://{fleetname}.fleet.ucs.{Region}-dev.myhuaweicloud.com/{uri},其中有三个参数。 表1 URL中的参数说明 参数 描述 {fleetname} 舰队名称,可在控制台内舰队基本信息中获取。 {Region} 服务应用区域的URL,可以通过终端节点(Endpoint)获取。 示例:华北-北京四的Region为cn-north-4 {uri} 资源路径,也即API访问路径。从具体接口的URI模块获取,请参见Karmada API。 示例:根据需要调用的接口设置,例如需要查看一个Deployment的详情,则请求方法为GET,接口uri为apis/apps/v1/namespaces/default/deployments,其中{namespace}为集群命名空间名称,本示例为default。 登录U CS 控制台,单击目标容器舰队名进入“容器舰队信息”页面,在“舰队基本信息”中单击“kubectl”。 图1 kubectl连接信息 参照页面中的提示信息,选择对应的项目名称、虚拟私有云(VPC)、控制节点子网以及有效期,单击“下载”,下载kubectl配置文件。 下载下来的文件名为kubeconfig.json。 图2 kubectl连接联邦实例 kubeconfig.json文件中存在安全泄露风险,请您务必妥善保存。 kubectl配置文件有效期可根据实际需求选择,下拉列表内可选范围为:5年、1年、6个月、30天、15天、14天、13天...1天,最短为1天。 在执行机上安装和配置kubectl。 拷贝kubectl及其配置文件到上述所选的vpc和子网下的执行机的/home目录下。 登录到您的执行机,配置kubectl cd /home chmod +x kubectl mv -f kubectl /usr/local/bin mkdir -p $HOME/.kube mv -f kubeconfig.json $HOME/.kube/config 根据URL格式进行拼接,确定请求的URL。 {fleetname}为舰队名称,可在控制台内舰队基本信息中获取。 region为Web服务入口点的URL,可以通过终端节点(Endpiont)获取。 {uri}为资源路径,也即API访问的路径,从具体接口的URI模块获取,请参见Karmada API。 则调用接口查看联邦内所有deployment信息的URL示例如下: https://r******.fleet.ucs.cn-north-4-dev.myhuaweicloud.com/apis/apps/v1/namespaces/default/deployments 创建Admin Role 获取请求对应Beartoken。 将如下内容保存为admin-role.yaml文件。 kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: admin annotations: rbac.authorization.kubernetes.io/autoupdate: "true" roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: admin namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: admin namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile 使用kubectl apply -f admin-role.yaml 创建对应的service-account及权限。 使用kubectl create token admin --namespace kube-system 获取账户对应Beartoken。 设置环境变量token,其值为上一步获取的Beartoken。 使用接口指定的请求方法,并设置请求Header参数。如果接口要求添加Body参数,可参考Karmada API添加接口对应的结构体。 例如使用curl命令调用创建Deployment接口,请求方法为POST,并添加对应的Body体。 示例:本示例将使用nginx.json文件,创建一个名为nginx的deployment负载,该工作负载使用nginx:latest镜像并包含两个Pod,每个Pod占用100mCPU、200Mi内存。在该工作负载创建完成后,您可以继续参考上述步骤,从Karmada API获取PropagationPolicy对应的URI,创建分发策略。 curl --location --request POST 'https://r*****.fleet.ucs.cn-north-4-dev.myhuaweicloud.com/apis/apps/v1/deployments' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer $token' \ --data @nginx.json 请求中包含的Header参数如下: 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),例如application/json Authorization 是 String 获取Beartoken的方式请参见5。 nginx.json文件内容如下: { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "nginx" }, "spec": { "replicas": 2, "selector": { "matchLabels": { "app": "nginx" } }, "template": { "metadata": { "labels": { "app": "nginx" } }, "spec": { "containers": [ { "image": "nginx:latest", "name": "container-0", "resources": { "limits": { "cpu": "100m", "memory": "200Mi" }, "requests": { "cpu": "100m", "memory": "200Mi" } } } ], "imagePullSecrets": [ { "name": "default-secret" } ] } } } }
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 详细的公共请求消息头字段请参见表3。 表3 公共请求消息头 名称 描述 是否必选 示例 Host 请求的服务器信息,从服务API的URL中获取。值为hostname[:port]。端口缺省时使用默认的端口,https的默认端口为443。 否 使用AK/SK认证时该字段必选。 code.test.com or code.test.com:443 Content-Type 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。 是 application/json Content-Length 请求body长度,单位为Byte。 否 3495 X-Project-Id project id,项目编号。请参考获取项目ID章节获取项目编号。 否 如果是专属云场景采用AK/SK认证方式的接口请求,或者多project场景采用AK/SK认证的接口请求,则该字段必选。 e9993fc787d94b6c886cbaa340f9c0f4 X-Auth-Token 用户Token。 用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 请求响应成功后在响应消息头(Headers)中包含的“X-Subject-Token”的值即为Token值。 否 使用Token认证时该字段必选。 注:以下仅为Token示例片段。 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ API同时支持使用AK/SK认证,AK/SK认证使用SDK对请求进行签名,签名过程会自动往请求中添加Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参见认证鉴权的“AK/SK认证”。 对于获取用户Token接口,由于不需要认证,所以只添加“Content-Type”即可,添加消息头后的请求如下所示。 1 2 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json
  • 请求消息体(可选) 该部分可选。请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-Type对应,传递除请求消息头之外的内容。若请求消息体中的参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于获取用户Token接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的斜体字段需要根据实际值填写,其中username为用户名,domainname为用户所属的账号名称,********为用户登录密码,xxxxxxxxxxxxxxxxxx为project的名称,如“cn-north-1”,您可以从地区和终端节点获取。 scope参数定义了Token的作用域,下面示例中获取的Token仅能访问project下的资源。您还可以设置Token的作用域为某个账号下所有资源或账号的某个project下的资源,详细定义请参见获取用户Token。 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 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxxxxxxxxxxxx" } } } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中的“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求URI 请求URI由如下部分组成: {URI-scheme}://{Endpoint}/{resource-path}?{query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 表1 URI中的参数说明 参数 描述 URI-scheme 表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint 指定承载REST服务端点的服务器 域名 或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点获取。 例如 IAM 服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path 资源路径,即API访问路径。从具体API的URI模块获取,例如“获取用户Token”API的resource-path为“/v3/auth/tokens”。 query-string 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在获取用户Token的URI部分找到resource-path(/v3/auth/tokens),拼接起来如下所示。 1 https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 图1 URI示意图 为方便查看,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务您正在请求什么类型的操作。 表2 HTTP方法 方法 说明 GET 请求服务器返回指定资源。 PUT 请求服务器更新指定资源。 POST 请求服务器新增资源或执行特殊操作。 DELETE 请求服务器删除指定资源,如删除对象等。 HEAD 请求服务器资源头部。 PATCH 请求服务器更新资源的部分内容。 当资源不存在的时候,PATCH可能会去创建一个新的资源。 在获取用户Token的URI部分,您可以看到其请求方法为“POST”,则其请求为: 1 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens
  • UCS集群概述 UCS服务支持跨云、跨地域的集群统一接入、统一管理,支持接入如下几种集群类型: 华为云集群:包括华为云CCE集群和 CCE Turbo 集群。 本地集群:由UCS提供的、运行在您的数据中心基础设施之上的Kubernetes集群,如UCS on Bare Metal、UCS on VMware。 附着集群:满足CNCF(Cloud Native Computing Foundation)标准的第三方Kubernetes集群,如AWS(EKS)、GCP(GKE)以及自建的Kubernetes集群。 多云集群:由UCS提供的、运行在第三方云服务供应商(如AWS)基础设施之上的Kubernetes集群,如UCS on AWS、UCS on Azure。 伙伴云集群:包括伙伴侧Kubernetes集群。 当前局点仅支持接入华为云集群、本地集群、附着集群与伙伴云集群。 如果您接入的集群中包含超大容量的节点,并且希望其不被统计在UCS控制台集群列表上的CPU和内存分配率指标中,那么需要为这个节点打上“type:virtual-kubelet”标签,以便您准确识别集群资源分配情况。为集群节点打标签请参照为节点添加标签/污点。 父主题: UCS集群
  • 第三方云厂商集群 由于第三方云厂商集群提供的KubeConfig文件格式存在差异,您需要自行创建一个具有所有集群资源操作权限的ServiceAccount,并获取这个ServiceAccount的token,用于配置UCS支持的KubeConfig文件。 通过kubectl连接集群。 创建ucs-service-account.yaml文件。 apiVersion: v1 kind: ServiceAccount metadata: name: ucs-user --- apiVersion: v1 kind: Secret metadata: name: ucs-user-token annotations: kubernetes.io/service-account.name: "ucs-user" type: kubernetes.io/service-account-token --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ucs-user-role rules: - apiGroups: - '*' resources: - '*' verbs: - '*' - nonResourceURLs: - '*' verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ucs-user-role-binding subjects: - kind: ServiceAccount name: ucs-user namespace: default roleRef: kind: ClusterRole name: ucs-user-role apiGroup: rbac.authorization.k8s.io 在集群中执行以下命令创建ServiceAccount。 kubectl apply -f ucs-service-account.yaml 使用以下命令获取token。 kubectl get secret ucs-user-token -n default -oyaml | grep token: | awk '{print $2}' | base64 -d ;echo 配置KubeConfig文件。 参考以下示例创建一个kubeconfig.yaml文件,并将token替换为4中获取的值。 kubeconfig.yaml: kind: Config apiVersion: v1 preferences: {} clusters: - name: internalCluster cluster: server: 'https://kubernetes.default.svc.cluster.local:443' insecure-skip-tls-verify: true users: - name: ucs-user user: token: 'MIIFbAYJKo*****' contexts: - name: internal context: cluster: internalCluster user: ucs-user current-context: internal KubeConfig文件中的关键参数说明如下: 参数名 参数值 说明 是否可选 server 'https://kubernetes.default.svc.cluster.local:443' APIServer的集群内访问地址。由于部分厂商集群对APIServer地址做了外部访问限制,可能导致UCS无法正常接入集群,因此建议使用集群内访问地址。 必选 insecure-skip-tls-verify true 如使用该参数,表示跳过证书认证,参数值必须为true。 二选一 说明: 当server字段为集群内访问地址时,优选跳过证书认证。 certificate-authority-data base64加密字符串 如使用该参数,表示集群开启双向认证,参数值为经base64加密后的服务端证书。 原生K8s集群的服务端证书默认地址为master节点的“/etc/kubernetes/pki/ca.crt”。 token base64加密字符串 用户以token方式进行认证,参数值为4中获取的token值。 三选一 说明: 优选token方式,UCS不支持除这三种方式外的其他认证方式。 client-certificate-data client-key-data base64加密字符串 用户以证书加私钥的方式进行认证。 client-certificate-data:经base64加密后的客户端证书。 client-key-data:经base64加密后的客户端私钥。 username password 字符串 用户通过用户名密码进行认证。 username:访问集群的用户名。 password:用户名对应的密码。 使用5中配置的KubeConfig文件接入集群,详细步骤请继续参考注册附着集群(公网接入)或注册附着集群(私网接入)。 使用UCS期间,创建的ServiceAccount、ClusterRole、ClusterRoleBinding对象均不能删除,否则token将会失效。 如集群不再接入UCS,可使用kubectl delete -f ucs-service-account.yaml命令删除UCS创建的SA对象。
  • 自建集群 如果您的集群是通过Kubernetes官方二进制文件或Kubeadm等部署工具搭建的标准集群,可直接使用以下方法获取KubeConfig文件。 该方法不适用于云服务商提供的商用集群,商用集群的KubeConfig文件获取请参考第三方云厂商集群。 登录集群Master节点。 查看集群访问凭证。默认情况下,自建集群的配置文件路径为Master节点的“$HOME/.kube/config”,如您的集群指定了其他KubeConfig配置文件,请自行更换路径。 cat $HOME/.kube/config 复制该凭证内容。 在本地创建一个YAML文件,将上一步中复制的凭证内容粘贴至该文件并保存。 使用4中的YAML文件接入集群,详细步骤请继续参考注册附着集群(公网接入)或注册附着集群(私网接入)。
  • 接入集群 登录UCS控制台,在“等待接入”状态下的目标集群栏中单击“单击接入”,选择“私网接入”。 选择项目,再选择购买终端节点中创建的终端节点。 下载集群代理agent的配置文件。 集群代理配置存在私有秘钥信息,每个集群代理配置仅能下载一次,请您妥善保管。 将步骤3中的agent配置文件上传至节点。 单击“安装集群代理agent配置”,在待接入集群中执行如下命令,可单击右侧直接复制命令。 图3 安装集群代理agent配置 私网接入的集群无法通过私网下载SWR镜像仓库中的镜像,请确保工作负载运行的节点可访问公网。 拉取proxy-agent容器镜像要求集群需要具备公网访问能力,或将proxy-agent镜像上传至集群可访问的镜像仓库,否则将导致proxy-agent部署失败。 前往UCS控制台刷新集群状态,集群处于“运行中”。
  • 注册集群 登录UCS控制台。 在左侧导航栏中选择“容器舰队”,单击附着集群选项卡中的“注册集群”按钮。 参考表1填写待添加集群的基础信息,其中带“*”的参数为必填参数。 表1 注册集群基础信息配置 参数 参数说明 集群名称* 输入集群的自定义名称,需以小写字母开头,由小写字母、数字、中划线(-)组成,且不能以中划线(-)结尾。 集群服务商* 选择一个集群服务商。 所属区域* 选择集群所在的区域。 集群标签 非必填项,以键值对的形式为集群添加标签,可以通过标签实现集群的分类。键值对可自定义,以字母或者数字开头和结尾,由字母、数字、连接符(-)、下划线(_)、点号(.)组成,且63个字符之内。 上传KubeConfig* 上传kubectl的配置文件来完成集群认证,支持JSON或YAML格式。获取KubeConfig文件的操作步骤因厂商而异,请参见KubeConfig。 选择Context* 选择对应的Context。在完成KubeConfig文件上传后,选项列表将自动获取文件中的“contexts”字段。 默认值为KubeConfig文件中“current-context”字段指定的Context,若文件中无此字段则需要从列表中手动选择。 容器舰队 选择集群所属的舰队。 舰队用于权限精细化管理,一个集群只能加入一个舰队。若不选择舰队,集群注册成功后将显示在“未加入舰队的集群”页签下,后续还可以再添加至舰队中。 不支持在注册集群阶段选择已开通集群联邦能力的舰队,如果一定要加入这个舰队,请在集群注册成功后,再添加到该舰队中。关于集群联邦的介绍,请参见开通集群联邦章节。 如需新建舰队,请参见管理容器舰队。 单击“确定”,集群注册成功后如图1所示,请在30分钟内接入网络。您可选择集群的接入方式或单击右上角按钮查看详细的网络接入流程。 如您未在30分钟内接入网络,将会导致集群注册失败,可单击右上角按钮重新注册集群。如果已经接入但数据未采集上来,请等待2分钟后刷新集群。 图1 集群等待接入状态
  • 购买终端节点 登录 VPC终端节点 控制台,单击“购买终端节点”。 选择终端节点的区域。 选择“按名称查找服务”,输入服务名称“cn-north-4.open-vpcep-svc.29696ab0-1486-4f70-ab35-a3f6b1b37c02”,并单击“验证”。 图2 购买终端节点 选择准备网络环境中与集群网络连通的虚拟私有云以及对应的子网。 根据需求选择终端节点的“节点IP”为“自动分配”或“手动分配”。 配置完其他参数后,单击“立即购买”,并进行规格确认。 规格确认无误,单击“提交”,任务提交成功。 参数信息配置有误,需要修改,单击“上一步”,修改参数,然后单击“提交”。
  • 前提条件 已创建一个准备接入UCS的集群,并且集群状态正常。 在UCS提供服务的区域中创建一个VPC,具体操作请参见创建虚拟私有云和子网,当前仅支持“华北-北京四”区域。 该VPC子网网段不能与IDC或第三方云中已使用的网络网段重叠,否则将无法接入集群。例如,IDC中已使用的VPC子网为192.168.1.0/24,那么华为云VPC中不能使用192.168.1.0/24这个子网。 已获取待添加集群的KubeConfig文件,具体操作步骤因厂商而异,请参见KubeConfig。关于KubeConfig文件的更多说明请参考使用kubeconfig文件组织集群访问。
  • 认证证书 合规证书 华为云服务及平台通过了多项国内外权威机构(ISO/SOC/PCI等)的安全合规认证,用户可自行申请下载合规资质证书。 图1 合规证书下载 资源中心 华为云还提供以下资源来帮助用户满足合规性要求,具体请查看资源中心。 图2 资源中心 销售许可证&软件著作权证书 另外,华为云还提供了以下销售许可证及软件著作权证书,供用户下载和参考。具体请查看合规资质证书。 图3 销售许可证&软件著作权证书 父主题: 安全
  • 创建外表 当完成创建外部服务器后,在 GaussDB (DWS)数据库中创建一个OBS/HDFS只写外表,用来访问存储在OBS/HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下: 1 2 3 4 5 6 7 8 9 10 11 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name [ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] | table_constraint [, ...]} [, ...] ] ) SERVER dfs_server OPTIONS ( { option_name ' value ' } [, ...] ) [ {WRITE ONLY }] DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ; 例如,创建一个名为“product_info_ext_obs”的外表,对语法中的参数按如下描述进行设置: table_name 外表的表名。 表字段定义 column_name:外表中的字段名。 type_name:字段的数据类型。 多个字段用“,”隔开。 SERVER dfs_server 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS/HDFS读取数据。 此处应填写为参照创建外部服务器创建的外部服务器名称。 OPTIONS参数 用于指定外表数据的各类参数,关键参数如下所示。 “format”:表示导出的数据文件格式,支持“orc”格式。 “foldername”:必选参数。外表中数据源文件目录。OBS:数据源文件的OBS路径,此处仅需要填写“/桶名/文件夹目录层级/”。HDFS:HDFS文件系统上的路径。此选项对WRITE ONLY外表为必选项。 “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。 “filesize” 指定WRITE ONLY外表的文件大小,单位为MB。此选项为可选项,不指定该选项默认分布式文件系统配置中文件大小的配置值。此语法仅对WRITE ONLY的外表有效。 取值范围:[1, 1024]的整数。 filesize参数只对ORC格式的WRITE ONLY的HDFS外表有效。 “compression” 指定ORC格式文件的压缩方式,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围:zlib,snappy,lz4。缺省值为snappy。 “version” 指定ORC格式的版本号,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围:目前仅支持0.12。缺省值为0.12。 “dataencoding” 在数据库编码与数据表的数据编码不一致时,该参数用于指定导出数据表的数据编码。比如数据库编码为Latin-1,而导出的数据表中的数据为UTF-8编码。此选项为可选项,如果不指定该选项,默认采用数据库编码。此语法仅对HDFS的WRITE ONLY外表有效。 取值范围:该数据库编码支持转换的数据编码。 dataencoding参数只对ORC格式的WRITE ONLY的HDFS外表有效。 语法中的其他参数 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。 根据以上信息,创建外表命令如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 DROP FOREIGN TABLE IF EXISTS product_info_ext_obs; ---建立不包含分区列的OBS外表,表关联的外部服务器为obs_server,表对应的OBS服务上的文件格式为‘orc’,OBS上的数据存储路径为'/mybucket/data/'。 CREATE FOREIGN TABLE product_info_ext_obs ( 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 obs_server OPTIONS ( format 'orc', foldername '/mybucket/demo.db/product_info_orc/', compression 'snappy', version '0.12' ) Write Only; 父主题: 导出ORC数据到OBS
  • 表自动分析 GaussDB(DWS)提供了三种场景下表的自动分析。 当查询中存在“统计信息完全缺失”或“修改量达到analyze阈值”的表,且执行计划不采取FQS(Fast Query Shipping)执行时,则通过GUC参数autoanalyze控制此场景下表统计信息的自动收集。此时,查询语句会等待统计信息收集成功后,生成更优的执行计划,再执行原查询语句。 当autovacuum设置为on时,系统会定时启动autovacuum线程,对“修改量达到analyze阈值”的表在后台自动进行统计信息收集。 表1 表自动分析 触发方式 触发条件 触发频率 控制参数 备注 同步 统计信息完全缺失 查询时 autoanalyze truncate主表时会清空统计信息。 同步 数据修改量达到analyze阈值 查询时 autoanalyze 先触发analyze,后选择最优计划。 异步 数据修改量达到analyze阈值 autovacuum线程轮询检查 autovacuum_mode, autovacuum_naptime 2s等锁超时, 5min执行超时。 autoanalyze只支持默认采样方式,不支持百分比采样方式。 多列统计信息仅支持百分比采样,因此autoanalyze不收集多列统计信息。 查询过程因表的“统计信息完全缺失”和“修改量达到analyze阈值”而自动触发autoanalyze的场景,当前不支持对外表触发autoanalyze,不支持对带有ON COMMIT [DELETE ROWS | DROP]选项的临时表触发autoanalyze。 修改量达到analyze阈值是指:表的修改量超过autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * reltuples,其中reltuples是pg_class中记录的表的估算行数。 基于定时启动的autovacuum线程触发的autoanalyze,仅支持行存表和列存表,不支持外表、HDFS表、OBS外表、临时表、unlogged表和toast表。 查询时触发analyze会对分区表的所有分区加四级锁,直到查询所在事务提交后才会放锁。四级锁不堵塞增删改查,但会堵塞分区的修改操作,比如分区的truncate,可以通过将object_mtime_record_mode设置为disable_partition,实现提前释放分区锁。 autovacuum自动清理功能的生效还依赖于下面两个GUC参数: track_counts参数需要设置为on,开启收集收据库统计数据功能。 autovacuum_max_workers参数需要大于0,该参数表示能同时运行的自动清理线程的最大数量。
  • \copy命令 \copy命令格式以及说明参见表 1 \copy元命令说明。 表1 \copy元命令说明 语法 说明 \copy { table [ ( column_list ) ] | ( query ) } { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ header ] [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list | * ] [ force not null column_list ] ] 在任何gsql客户端登录数据库成功后,可以使用该命令进行数据的导入/导出。但是与SQL的COPY命令不同,该命令读取/写入的文件是本地文件,而非数据库服务器端文件;所以,要操作的文件的可访问性、权限等,都是受限于本地用户的权限。 说明: \COPY只适合小批量,格式良好的数据导入,容错能力较差。导入数据应优先选择GDS或COPY。
  • 删除外表和目标表 (可选)如果执行了导入数据后查询数据,请执行以下命令,删除目标表。 1 DROP TABLE product_info; 当结果显示为如下信息,则表示删除成功。 1 DROP TABLE 执行以下命令,删除外表。 1 DROP FOREIGN TABLE product_info_ext_obs; 当结果显示为如下信息,则表示删除成功。 1 DROP FOREIGN TABLE
  • 删除创建的外部服务器 使用创建外部服务器的用户连接到外部服务器所在的数据库。 在本示例中,使用的是普通用户dbuser在数据库mydatabase中创建了一个外部服务器。用户需要通过GaussDB(DWS)提供的数据库客户端连接数据库。例如,使用gsql客户端的用户,可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令进行切换: 1 \c mydatabase dbuser; 根据提示输入密码。 如果已经登录了gsql客户端,您也可以执行“\q”退出gsql后,再执行以下命令重新进行连接: 1 gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r 根据提示输入密码。 删除创建的外部服务器。 执行以下命令进行删除: 1 DROP SERVER obs_server; 返回以下信息表示删除成功: 1 DROP SERVER 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='obs_server'; 返回结果如下所示,表示已经删除成功: 1 2 3 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions ---------+----------+--------+---------+------------+--------+------------ (0 rows)
  • 删除数据库及其所属的用户 如果您执行了(可选)新建用户及数据库并授予外表权限中的步骤,请参照以下步骤删除数据库及其所属的用户。 删除自定义数据库。 通过GaussDB(DWS)提供的数据库客户端连接默认数据库gaussdb。 如果已经登录了gsql客户端,可以直接执行如下命令进行切换: 先切换到默认数据库: 1 \c gaussdb 根据界面提示输入密码。 执行以下命令,删除自定义数据库: 1 DROP DATABASE mydatabase; 返回以下信息表示删除成功: 1 DROP DATABASE 使用管理员用户,删除本示例中创建的普通用户。 使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接数据库。 如果已经登录了gsgl客户端,可以直接执行如下命令进行切换: 1 \c gaussdb dbadmin 执行以下命令回收创建外部服务器的权限: 1 REVOKE ALL ON FOREIGN DATA WRAPPER dfs_fdw FROM dbuser; 其中FOREIGN DATA WRAPPER的名字只能是dfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令删除用户: 1 DROP USER dbuser; 可使用“\du”命令查询用户,确认用户是否已经删除。
  • 导入数据后查询数据 也可以将 MRS 数据导入GaussDB(DWS)后,再查询数据。 在GaussDB(DWS)数据库中,创建导入数据的目标表,用于存储导入的数据。 该表的表结构必须与创建外表中创建的外表的表结构保持一致,即字段个数、字段类型要完全一致。 例如,创建一个名为product_info的表,示例如下: 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); 执行“INSERT INTO .. SELECT ..”命令从外表导入数据到目标表。 示例: 1 INSERT INTO product_info SELECT * FROM foreign_product_info; 若出现以下类似信息,说明数据导入成功。 INSERT 0 20 执行SELECT命令,查看从MRS导入到GaussDB(DWS)中的数据。 1 SELECT * FROM product_info; 查询结果显示如数据文件中所示的数据,表示导入成功。查询结果的结尾将显示以下信息: (20 rows)
  • 数据文件 假设有数据文件product_info.txt,示例数据如下所示: 100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good 205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good! 300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad. 310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice 150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite 200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality. 250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time. 108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy 450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor 260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes 980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small 98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter. 150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective 200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear 300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good 100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good. 350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good 110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good. 230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good
  • 注意事项 两个集群必须在同一个Region、一个AZ内且VPC网络互通。 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表、列存表、哈希表或者复制表。 如果关联的表在另外一个集群是复制表或者存在数据倾斜,性能可能会很差。 使用期间,两个集群的状态应为“Normal”。 使用期间,禁止对远端集群的源数据表做ddl修改和增、删、改操作,否则可能导致查询结果不一致。 两个集群都需要具备基于Foreign Table的SQL on other GaussDB数据处理功能。 保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。 仅支持8.0.0及以上版本。
  • 操作步骤 创建server。 1 2 3 4 5 6 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.180.157.231:8000,10.180.157.130:8000' , dbname 'gaussdb', username 'xyz', password 'xxxxxx' ); server_remote为server名字,供外表使用。 address为远端集群CN的地址和端口号,如配置LVS,推荐只填写一个LVS地址,如未配置,推荐使用多个CN作为server的地址。 dbname为远端集群的数据库名。 username为连接远端集群使用的用户名,注意该用户不能为系统管理员。 password为连接远端集群使用的用户名的密码。 创建外表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE FOREIGN TABLE region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ) SERVER server_remote OPTIONS ( schema_name 'test', table_name 'region', encoding 'gbk' ); 外表的列不允许带任何约束。 外表的列名和列的类型要与远端集群对应的表的列名和列的类型完全一致。 schema_name为远端集群对应的表所在的schema,如果该option省略,则schema_name预设该外表所在的schema。 table_name为远端集群对应的表所在的表名,如果该option省略,则table_name预设该外表的表名。 encoding为远端集群的编码,如果该option省略,则编码使用远端集群数据库的默认编码。 查看建立的外表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \d+ region Foreign table "public.region" Column | Type | Modifiers | FDW Options | Storage | Stats target | Description -------------+---------+-----------+-------------+----------+--------------+------------- r_regionkey | integer | | | plain | | r_name | text | | | extended | | r_comment | text | | | extended | | Server: server_remote FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk') FDW permition: read only Has OIDs: no Distribute By: ROUND ROBIN Location Nodes: ALL DATANODES 查看建立的server。 1 2 3 4 5 6 7 8 9 \des+ server_remote List of foreign servers Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ---------------+---------+----------------------+-------------------+------+---------+----------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------+------------- server_remote | dbadmin | gc_fdw | | | | (address '10.180.157.231:8000,10.180.157.130:8000', dbname 'gaussdb' , username 'xyz', password 'xxxxxx') | (1 row) 使用外表进行导入数据或者关联查询。 导入数据。 1 2 3 4 5 6 7 CREATE TABLE local_region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ); INSERT INTO local_region SELECT * FROM region; 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。 如遇到报错表不存在,请检查外表的option信息是否正确。 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。 如遇到报错版本不一致,请升级低版本的集群在继续使用。 如遇到乱码,请检查数据源的实际编码方式,并重新创建外表指定正确的编码。 关联查询。 1 SELECT * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME; 外表可以当做一个本地表来使用,执行复杂的作业。 如果远端集群已经有统计信息,请对该外表执行analyze以获得更优的执行计划。 如果本地集群的DN数量比远端集群的DN数量少,本地集群需要使用SMP来获得更佳的性能。 删除外表。 1 DROP FOREIGN TABLE region;
  • 背景信息 GDS的版本需与集群版本保持一致(如:GDS V100R008C00版本与DWS 1.3.X版本配套),否则可能会出现导入导出失败或导入导出进程停止响应等情况。因此请勿使用历史版本的GDS进行导入。 数据库版本升级后,请按照操作步骤中的办法下载GaussDB(DWS)软件包解压缩自带的GDS进行安装配置和启动。在导入导出开始时,GaussDB(DWS)也会进行两端的版本一致性检测,不一致时会在屏幕上显示报错信息并终止对应操作。 GDS的版本号的查看办法为:在GDS工具的解压目录下执行如下命令。 gds -V 数据库版本的查看办法为:连接数据库后,执行如下SQL命令查看。 1 SELECT version();
  • gds.conf参数说明 表1 gds.conf配置说明 属性 说明 取值范围 name 标识名。 - ip 监听ip地址。 IP需为合法IP地址。 IP的默认值:127.0.0.1 port 监听端口号。 取值范围:1024~65535,正整数。 默认值:8098。 data_dir 数据文件目录。 - err_dir 错误日志文件目录。 默认值:数据文件目录 log_file 日志文件路径。 - host 设置允许连接到GDS的主机IP地址(参数为CIDR格式,仅支持linux系统)。 - recursive 是否递归数据文件目录。 取值范围: true:递归 。 false:不递归。 默认值:false。 daemon 是否以DAEMON(后台)模式运行。 取值范围: true:以DAEMON模式运行。 false:不以DAEMON模式运行。 默认值:false。 parallel 导入工作线程并发数目。 取值范围:0~200,正整数。 默认值:8。
  • 创建外部服务器 使用即将创建外部服务器的用户去连接其对应的数据库。 在本示例中,将使用(可选)新建用户及数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase 。用户需要通过GaussDB(DWS)提供的数据库客户端连接数据库。 例如,使用gsql客户端的用户可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户: 1 \c mydatabase dbuser; 根据提示输入密码。 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行“\q”退出gsql后,执行以下命令重新进行连接: 1 gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r 根据提示输入密码。 创建外部服务器。 例如,执行以下命令创建外部服务器“obs_server”: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw OPTIONS ( address 'obs.cn-north-1.myhuaweicloud.com' , AC CES S_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', encrypt 'on', type 'obs' ); 以下为必选参数的说明: 外部服务器名称 允许用户自定义名字。 在本例中指定为“obs_server” 。 FOREIGN DATA WRAPPER fdw_name的名字可以是hdfs_fdw或者dfs_fdw,它在数据库中已经存在。 OPTIONS参数 address 指定OBS服务的终端节点。 address的获取方法如下: 先通过OBS上的数据准备中的2获取OBS路径。 在OBS上查看到的OBS路径,为OBS服务终端节点(Endpoint):obs.xxx.xxx.com。 访问密钥(AK和SK)(必选) GaussDB(DWS)需要通过访问密钥(AK和SK)访问OBS,因此,必须先获取访问密钥。 “access_key”(必选):表示用户的AK信息。 “secret_access_key”(必选):表示用户的SK信息。 获取访问密钥的具体步骤,请参见创建访问密钥(AK和SK)。 type 取值为“obs”,表示dfs_fdw连接的是OBS。 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='obs_server'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions ------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- obs_server | 24661 | 13686 | | | | {address=xxx.xxx.x.xxx,access_key=xxxxxxxxxxxxxxxxxxxx,type=obs,secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} (1 row)
  • (可选)新建用户及数据库并授予外表权限 如果您将使用普通用户在自定义数据库中创建外部服务器和外表,由于普通用户没有外表权限无法创建,所以,您必须参照以下步骤新建用户和数据库,并授予该用户外表权限。 以下示例,是新建一个普通用户dbuser并创建一个数据库mydatabase,然后使用管理员用户授予dbuser外表权限。 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库gaussdb。 例如,使用gsql客户端的用户执行下面命令连接数据库: 1 gsql -d gaussdb -h 192.168.2.30 -U dbadmin -p 8000 -W password -r 新建一个普通用户,并用它创建一个数据库。 新建一个具有创建数据库权限的用户dbuser: 1 CREATE USER dbuser WITH CREATEDB PASSWORD 'password'; 切换为新建的用户: 1 SET ROLE dbuser PASSWORD 'password'; 执行以下命令创建数据库: 1 CREATE DATABASE mydatabase; 查询数据库: 1 SELECT * FROM pg_database; 返回结果中有mydatabase的信息表示创建成功: 1 2 3 4 5 6 7 8 9 10 datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility | datacl ------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+-------------------------------------- -------------- template1 | 10 | 0 | C | C | t | t | -1 | 14146 | 1351 | 1663 | ORA | {=c/Ruby,Ruby=CTc/Ruby} template0 | 10 | 0 | C | C | t | f | -1 | 14146 | 1350 | 1663 | ORA | {=c/Ruby,Ruby=CTc/Ruby} gaussdb | 10 | 0 | C | C | f | t | -1 | 14146 | 1352 | 1663 | ORA | {=Tc/Ruby,Ruby=CTc/Ruby,chaojun=C/Ruby,hu obinru=C/Ruby} mydatabase | 17000 | 0 | C | C | f | t | -1 | 14146 | 1351 | 1663 | ORA | (4 rows) 使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。 使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接新建的数据库。 例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的数据库: 1 \c mydatabase dbadmin; 根据提示输入管理员用户密码。 注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进行授权。 默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以下命令授权: 1 2 GRANT ALL ON SCHEMA public TO dbuser; GRANT ALL ON FOREIGN DATA WRAPPER dfs_fdw TO dbuser; 其中fdw_name的名字可以是hdfs_fdw或者dfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令赋予用户使用外表的权限。 1 ALTER USER dbuser USEFT; 查看用户: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof , r.rolreplication , r.rolauditadmin , r.rolsystemadmin , r.roluseft FROM pg_catalog.pg_roles r ORDER BY 1; 返回结果中dbuser的信息中包含了UseFT权限,表示授权成功: 1 2 3 4 5 rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft -----------+----------+------------+---------------+-------------+-------------+--------------+---------------+---------------+----------+----------------+---------------+----------------+---------- dbuser | f | t | f | t | t | -1 | | | {} | f | f | f | t lily | f | t | f | f | t | -1 | | | {} | f | f | f | f Ruby | t | t | t | t | t | -1 | | | {} | t | t | t | t
  • OBS导入数据示例 在GaussDB(DWS)上,创建导入的目标表tpcds.customer_address。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE tpcds.customer_address ( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) WITH (orientation = column,compression=middle) DISTRIBUTE BY hash (ca_address_sk); 用户通过管理控制台登录到OBS数据服务器。在OBS数据服务器上,分别创建数据文件存放的两个桶“/input-data1”和“/input-data2”,并创建每个桶下面的data目录“/input-data1/data”和“/input-data2/data”。 将数据源文件均匀上传至OBS数据服务器的“/input-data1/data/”和“/input-data2/data/”目录中。 在GaussDB(DWS)上,创建外表tpcds.customer_address_ext用于接收数据服务器上的数据。 假设OBS数据服务器与集群网络连接正常,OBS数据服务器IP为xxx.xxx.x.xx,数据源文件格式为CSV,规划的并行导入与示例保持一致。 其中设置的导入信息如下所示: 由于OBS服务器上的数据源文件存放目录为“/input-data1/data/ ”和“/input-data2/data/ ”,所以设置参数“location”为“obs://input-data1/data/ | obs://input-data2/data/”。 设置的数据格式信息是根据数据源文件的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 是否使用加密(encrypt),默认为 “off”。 用户获取OBS访问协议对应的AK值(access_key) 。 用户获取OBS访问协议对应的SK值 (secret_access_key)。 请根据用户实际获取的access_key和secret_access_key的密钥替换示例中的对应内容。 设置的导入容错性如下所示: 允许每个DN上出现数据格式错误的个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息( LOG INTO error_table_name)写入表customer_address_err。 根据以上信息,创建的外表如下所示: 认证用的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 CREATE FOREIGN TABLE tpcds.customer_address_ext ( ca_address_sk integer , ca_address_id char(16) , ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) SERVER gsmpp_server OPTIONS(location 'obs://input-data1/data/ | obs://input-data2/data/', FORMAT 'CSV' , encoding 'utf8', DELIMITER E'\x08', quote E'\x1b', encrypt 'off', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' )LOG INTO customer_address_err PER NODE REJECT LIMIT 'unlimited'; 在GaussDB(DWS)上,通过外表tpcds.customer_address_ext,将数据导入目标表tpcds.customer_address。 1 INSERT INTO tpcds.customer_address SELECT * FROM tpcds.customer_address_ext; 查询错误信息表customer_address_err,处理数据导入错误。更多关于错误表的信息,请参见处理导入错误。 1 SELECT * FROM customer_address_err; 在数据导入完成后,执行ANALYZE语句生成表统计信息。 1 ANALYZE tpcds.customer_address; 父主题: 从OBS导入CSV、TXT数据
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 错误类型 原因 解决办法 missing data for column "r_reason_desc" 格式错误 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 格式错误 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 格式错误 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非格式错误 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 非格式错误 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 格式错误 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB(DWS)进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 样例程序如下,执行时需要加载GaussDB(DWS) jdbc驱动。 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 //以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //数据库URL String username = new String("jack"); //用户名 String password = new String("********"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", migration_table_1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", migration_table_1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 使用COPY FROM STDIN导入数据
共100000条