华为云用户手册

  • 解决方案 优先联系DBA修改表结构,将需要过滤的列配置为索引列,然后重试。 如果由于数据不离散,导致还是失败请参考2~4,通过增大JDBC超时时间解决。 根据作业找到对应的MySQL连接名称,查找连接信息。 图2 连接信息 单击“连接管理”,在“操作”列中,单击“连接”进行编辑。 图3 连接 打开高级属性,在“连接属性”中建议新增“connectTimeout”与“socketTimeout”参数及参数值,单击“保存”。 图4 编辑高级属性
  • 解决方案 如果是作为 DataArts Studio 服务 CDM 组件使用: 检查用户是否添加DAYU Administrator或DAYU User角色,参考DataArts Studio权限管理。 是否有对应工作空间的权限,如开发者、访客等,参考DataArts Studio权限列表。 如果是独立CDM服务使用: 检查是否开启 IAM 细粒度鉴权。 如果未开启,检查用户组是否添加CDM Administrator角色。 如果已开启,请继续执行步骤2继续检查。 检查用户是否添加CDM访问策略,包含自定义策略或预设策略,如CDM FullAccess、CDM ReadOnlyAccess等,参考CDM权限管理。 检查对应企业项目是否添加拒绝访问策略。
  • Hadoop类型的数据源进行数据迁移时,建议使用的组件版本有哪些? 建议使用的组件版本既可以作为目的端使用,也可以作为源端使用。 表1 建议使用的组件版本 Hadoop类型 组件 说明 MRS /Apache/ FusionInsight HD Hive 暂不支持2.x版本,建议使用的版本: 1.2.X 3.1.X HDFS 建议使用的版本: 2.8.X 3.1.X Hbase 建议使用的版本: 2.1.X 1.3.X 父主题: 数据集成(CDM作业)
  • 解决方法一:CDM的字段映射界面增加字段 获取源端HBase待迁移的表中所有的字段,列族与列之间用“:”分隔,例如: rowkey:rowkey g:DAY_COUNT g:CATEGORY_ID g:CATEGORY_NAME g:FIND_TIME g:UPLOAD_PEOPLE g:ID g:INFOMATION_ID g:TITLE g:COORDINATE_X g:COORDINATE_Y g:COORDINATE_Z g:CONTENT g:IMAGES g:STATE 在CDM的作业管理界面,找到HBase导出数据到DWS的作业,单击作业后面的“编辑”,进入字段映射界面,如图1所示。 图1 字段映射03 单击添加字段,在弹出框中选择“添加新字段”,如图2所示。 图2 添加字段04 添加完字段后,新增的字段在界面不显示样值,这个不影响字段值的传输,CDM会将字段值直接写入目的端。 这里“添加新字段”的功能,要求源端数据源为:MongoDB、HBase、关系型数据库或Redis,其中Redis必须为Hash数据格式。 全部字段添加完之后,检查源端和目的端的字段映射关系是否正确,如果不正确可以拖拽字段调整字段位置。 单击“下一步”后保存作业。
  • 原因分析 由于HBase/CloudTable无Schema,每条数据的列数不固定,在字段映射界面CDM通过获取样值的方式有较大概率无法获得所有列,此时作业执行完后会造成目的端的数据不全。 这个问题,可以通过以下方法解决: 在CDM的字段映射界面增加字段。 在CDM的作业管理界面直接编辑作业的JSON(修改“fromJobConfig.columns”、“toJobConfig.columnList”这2个参数)。 导出作业的JSON文件到本地,在本地手动修改JSON文件中的参数后(原理同2相同),再导回CDM。 推荐使用方法1,下面以HBase导到DWS为例进行说明。
  • 原因分析 云搜索服务 对于时间类型有一个特殊处理:如果存储的时间数据不带时区信息,在Kibana可视化的时候,Kibana会认为该时间为GMT标准时间。 在各个地区会产生日志显示时间与本地时区时间不一致的现象,例如,在东八区某地,日志显示时间比本地时区时间少8个小时。因此在CDM迁移数据到 云搜索 服务的时候,如果是通过CDM自动创建的索引和类型(例如图2中,目的端的“date_test”和“test1”在云搜索服务中不存在时,CDM会在云搜索服务中自动创建该索引和类型),则CDM默认会将时间类型字段的格式设置为“yyyy-MM-dd HH:mm:ss.SSS Z”的标准格式,例如“2018-01-08 08:08:08.666 +0800”。 图2 作业配置 此时,从其他数据源导入数据到云搜索服务时,如果源端数据中的日期格式不完全满足标准格式,例如“2018/01/05 15:15:46”,则CDM作业会执行失败,日志提示无法解析日期格式。需要通过CDM配置字段转换器,将日期字段的格式转换为云搜索服务的目的端格式。
  • 解决方案 编辑作业,进入作业的字段映射步骤,在源端的时间格式字段后面,选择新建转换器,如图3所示。 图3 新建转换器 转换器类型选择“表达式转换”,目前表达式转换支持字符串和日期类型的函数,语法和Java的字符串和时间格式函数非常相似,可以查看表达式转换了解如何编写表达式。 本例中源时间格式是“yyyy/MM/dd HH:mm:ss”,要将其转换成“yyyy-MM-dd HH:mm:ss.SSS Z”,需要经过如下几步: 添加时区信息“+0800”到原始日期字符串的尾部,对应的表达式为:value+" +0800"。 使用原始日期格式来解析字符串,将字符串解析为一个日期对象。可以使用DateUtils.parseDate函数来解析,语法是:DateUtils.parseDate(String value, String format)。 将日期对象格式化成目标格式的字符串,可以使用DateUtils.format函数来格式化,语法是DateUtils.format(Date date, String format)。 因此本例中串起来完整的表达式是:DateUtils.format(DateUtils.parseDate(value+" +0800","yyyy/MM/dd HH:mm:ss Z"),"yyyy-MM-dd HH:mm:ss.SSS Z"),如图4所示。 图4 配置表达式 保存转换器配置,再保存并运行作业,可解决云搜索服务的解析日期格式失败问题。
  • 代码示例 使用Java调用CDM服务的REST API创建、启动、查询、删除CDM作业的代码示例如下: package cdmclient; import java.io.IOException; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class CdmClient { private final static String DOMAIN_NAME="云账号名"; private final static String USER_NAME="云用户名"; private final static String USER_PASSWORD="云用户密码"; private final static String PROJECT_ID="项目ID"; private final static String CLUSTER_ID="CDM集群ID"; private final static String JOB_NAME="作业名称"; private final static String FROM_LINKNAME="源连接名称"; private final static String TO_LINKNAME="目的连接名称"; private final static String IAM_ENDPOINT="IAM的Endpoint"; private final static String CDM_ENDPOINT="CDM的Endpoint"; private CloseableHttpClient httpclient; private String token; public CdmClient() { this.httpclient = createHttpClient(); this.token = login(); } private CloseableHttpClient createHttpClient() { CloseableHttpClient httpclient =HttpClients.createDefault(); return httpclient; } private String login(){ HttpPost httpPost = new HttpPost("https://"+IAM_ENDPOINT+"/v3/auth/tokens"); String json = "{\r\n"+ "\"auth\": {\r\n"+ "\"identity\": {\r\n"+ "\"methods\": [\"password\"],\r\n"+ "\"password\": {\r\n"+ "\"user\": {\r\n"+ "\"name\": \""+USER_NAME+"\",\r\n"+ "\"password\": \""+USER_PASSWORD+"\",\r\n"+ "\"domain\": {\r\n"+ "\"name\": \""+DOMAIN_NAME+"\"\r\n"+ "}\r\n"+ "}\r\n"+ "}\r\n"+ "},\r\n"+ "\"scope\": {\r\n"+ "\"project\": {\r\n"+ "\"name\": \"PROJECT_NAME\"\r\n"+ "}\r\n"+ "}\r\n"+ "}\r\n"+ "}\r\n"; try { StringEntity s = new StringEntity(json); s.setContentEncoding("UTF-8"); s.setContentType("application/json"); httpPost.setEntity(s); CloseableHttpResponse response = httpclient.execute(httpPost); Header tokenHeader = response.getFirstHeader("X-Subject-Token"); String token = tokenHeader.getValue(); System.out.println("Login successful"); return token; } catch (Exception e) { throw new RuntimeException("login failed.", e); } } /*创建作业*/ public void createJob(){ HttpPost httpPost = new HttpPost("https://"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job"); /**此处JSON信息比较复杂,可以先在作业管理界面上创建一个作业,然后单击作业后的“作业JSON定义”,复制其中的JSON内容,格式化为Java字符串语法,然后粘贴到此处。 *JSON消息体中一般只需要替换连接名、导入和导出的表名、导入导出表的字段列表、源表中用于分区的字段。**/ String json = "{\r\n"+ "\"jobs\": [\r\n"+ "{\r\n"+ "\"from-connector-name\": \"generic-jdbc-connector\",\r\n"+ "\"name\": \""+JOB_NAME+"\",\r\n"+ "\"to-connector-name\": \"generic-jdbc-connector\",\r\n"+ "\"driver-config-values\": {\r\n"+ "\"configs\": [\r\n"+ "{\r\n"+ "\"inputs\": [\r\n"+ "{\r\n"+ "\"name\": \"throttlingConfig.numExtractors\",\r\n"+ "\"value\": \"1\"\r\n"+ "}\r\n"+ "],\r\n"+ "\"validators\": [],\r\n"+ "\"type\": \"JOB\",\r\n"+ "\"id\": 30,\r\n"+ "\"name\": \"throttlingConfig\"\r\n"+ "}\r\n"+ "]\r\n"+ "},\r\n"+ "\"from-link-name\": \""+FROM_LINKNAME+"\",\r\n"+ "\"from-config-values\": {\r\n"+ "\"configs\": [\r\n"+ "{\r\n"+ "\"inputs\": [\r\n"+ "{\r\n"+ "\"name\": \"fromJobConfig.schemaName\",\r\n"+ "\"value\": \"sqoop\"\r\n"+ "},\r\n"+ "{\r\n"+ "\"name\": \"fromJobConfig.tableName\",\r\n"+ "\"value\": \"city1\"\r\n"+ "},\r\n"+ "{\r\n"+ "\"name\": \"fromJobConfig.columnList\",\r\n"+ "\"value\": \"code&name\"\r\n"+ "},\r\n"+ "{\r\n"+ "\"name\": \"fromJobConfig.partitionColumn\",\r\n"+ "\"value\": \"code\"\r\n"+ "}\r\n"+ "],\r\n"+ "\"validators\": [],\r\n"+ "\"type\": \"JOB\",\r\n"+ "\"id\": 7,\r\n"+ "\"name\": \"fromJobConfig\"\r\n"+ "}\r\n"+ "]\r\n"+ "},\r\n"+ "\"to-link-name\": \""+TO_LINKNAME+"\",\r\n"+ "\"to-config-values\": {\r\n"+ "\"configs\": [\r\n"+ "{\r\n"+ "\"inputs\": [\r\n"+ "{\r\n"+ "\"name\": \"toJobConfig.schemaName\",\r\n"+ "\"value\": \"sqoop\"\r\n"+ "},\r\n"+ "{\r\n"+ "\"name\": \"toJobConfig.tableName\",\r\n"+ "\"value\": \"city2\"\r\n"+ "},\r\n"+ "{\r\n"+ "\"name\": \"toJobConfig.columnList\",\r\n"+ "\"value\": \"code&name\"\r\n"+ "}, \r\n"+ "{\r\n"+ "\"name\": \"toJobConfig.shouldClearTable\",\r\n"+ "\"value\": \"true\"\r\n"+ "}\r\n"+ "],\r\n"+ "\"validators\": [],\r\n"+ "\"type\": \"JOB\",\r\n"+ "\"id\": 9,\r\n"+ "\"name\": \"toJobConfig\"\r\n"+ "}\r\n"+ "]\r\n"+ "}\r\n"+ "}\r\n"+ "]\r\n"+ "}\r\n"; try { StringEntity s = new StringEntity(json); s.setContentEncoding("UTF-8"); s.setContentType("application/json"); httpPost.setEntity(s); httpPost.addHeader("X-Auth-Token", this.token); httpPost.addHeader("X-Language", "en-us"); CloseableHttpResponse response = httpclient.execute(httpPost); int status = response.getStatusLine().getStatusCode(); if(status == 200){ System.out.println("Create job successful."); }else{ System.out.println("Create job failed."); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Create job failed.", e); } } /*启动作业*/ public void startJob(){ HttpPut httpPut = new HttpPut("https://"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME+"/start"); String json = ""; try { StringEntity s = new StringEntity(json); s.setContentEncoding("UTF-8"); s.setContentType("application/json"); httpPut.setEntity(s); httpPut.addHeader("X-Auth-Token", this.token); httpPut.addHeader("X-Language", "en-us"); CloseableHttpResponse response = httpclient.execute(httpPut); int status = response.getStatusLine().getStatusCode(); if(status == 200){ System.out.println("Start job successful."); }else{ System.out.println("Start job failed."); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Start job failed.", e); } } /*循环查询作业运行状态,直到作业运行结束。*/ public void getJobStatus(){ HttpGet httpGet = new HttpGet("https://"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME+"/status"); try { httpGet.addHeader("X-Auth-Token", this.token); httpGet.addHeader("X-Language", "en-us"); boolean flag = true; while(flag){ CloseableHttpResponse response = httpclient.execute(httpGet); int status = response.getStatusLine().getStatusCode(); if(status == 200){ HttpEntity entity = response.getEntity(); String msg = EntityUtils.toString(entity); if(msg.contains("\"status\":\"SUCCEEDED\"")){ System.out.println("Job succeeded"); break; }else if (msg.contains("\"status\":\"FAILED\"")){ System.out.println("Job failed."); break; }else{ Thread.sleep(1000); } }else{ System.out.println("Get job status failed."); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); break; } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Get job status failed.", e); } } /*删除作业*/ public void deleteJob(){ HttpDelete httpDelte = new HttpDelete("https://"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME); try { httpDelte.addHeader("X-Auth-Token", this.token); httpDelte.addHeader("X-Language", "en-us"); CloseableHttpResponse response = httpclient.execute(httpDelte); int status = response.getStatusLine().getStatusCode(); if(status == 200){ System.out.println("Delete job successful."); }else{ System.out.println("Delete job failed."); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Delete job failed.", e); } } /*关闭*/ public void close(){ try { httpclient.close(); } catch (IOException e) { throw new RuntimeException("Close failed.", e); } } public static void main(String[] args){ CdmClient cdmClient = new CdmClient(); cdmClient.createJob(); cdmClient.startJob(); cdmClient.getJobStatus(); cdmClient.deleteJob(); cdmClient.close(); } }
  • 如何降低CDM使用成本? 如果是迁移公网的数据上云,可以使用NAT网关服务,实现CDM服务与子网中的其他弹性云服务器共享弹性IP,可以更经济、更方便的通过Internet迁移本地数据中心或第三方云上的数据。 具体操作如下: 假设已经创建好了CDM集群(无需为CDM集群绑定专用弹性IP),记录下CDM集群所在的VPC和子网。 创建NAT网关,注意选择和CDM集群相同的VPC、子网。 创建完NAT网关后,回到NAT网关控制台列表,单击创建好的网关名称,然后选择“添加SNAT规则”。 图1 添加SNAT规则 选择子网和弹性IP,如果没有弹性IP,需要先申请一个。 完成之后,就可以到CDM控制台,通过Internet迁移公网的数据上云了。例如:迁移本地数据中心FTP服务器上的文件到OBS、迁移第三方云上关系型数据库到云服务RDS。 父主题: 数据集成(CDM作业)
  • 解决方案 此类问题一般是由于用户不具备MRS集群操作权限导致的。 对于租户下新增的用户,需要在MRS集群列表的界面找到对应的MRS集群实例,手动单击同步。 操作如下: 进入MRS控制台,查看现有集群,单击对应的集群名称进入概览页。 图1 MRS集群实例 在“IAM用户同步”处,单击同步。 图2 单击同步 在操作日志处查看操作结果。 图3 操作日志 如果经过上述步骤,账号已同步。但还是提示MRS权限不足的话,则需要登录到Manger管理页面中创建一个与当前主账号同名的账号。 在步骤4中,需要创建一个与当前主账号同名的账号。
  • 套餐包到期未续订或按需资源欠费时,我的数据会保留吗? 云服务进入宽限期/保留期后,华为云将会通过邮件、短信等方式向您发送提醒,提醒您续订或充值。保留期到期仍未续订或充值,存储在云服务中的数据将被删除、云服务资源将被释放。 宽限期:指客户的包周期资源到期未续订或按需资源欠费时,华为云提供给客户进行续费与充值的时间,宽限期内客户可正常访问及使用云服务。 保留期:指宽限期到期后客户的包周期资源仍未续订或按需资源仍未缴清欠款,将进入保留期。保留期内客户不能访问及使用云服务,但对客户存储在云服务中的数据仍予以保留。 华为云宽限期和保留期时长设定请参考宽限期保留期。 父主题: 咨询与计费
  • 数据目录组件有什么用? 数据目录的核心是通过元数据采集任务,采集并展示企业在工作空间范围内的数据资产地图,包括元数据信息和数据血缘关系。 元数据管理 元数据管理模块是 数据湖 治理的基石,支持创建自定义策略的采集任务,可采集数据源中的技术元数据。支持自定义业务元模型,批量导入业务元数据,关联业务和技术元数据、全链路的血缘管理和应用。 数据地图 数据地图围绕数据搜索,服务于数据分析、数据开发、数据挖掘、数据运营等数据表的使用者和拥有者,提供方便快捷的数据搜索服务,拥有功能强大的血缘信息及影响分析。 在数据地图中,可通过关键词搜索数据资产,支持模糊搜索,快速检索,定位数据。 使用数据地图根据表名直接查看表详情,快速查阅明细信息,掌握使用规则。获得数据详细信息后,可添加额外描述。 通过数据地图的血缘分析可以查看每个数据表的来源、去向,并查看每个表及字段的加工逻辑。 对数据资产,可以从业务角度定义分类或标签。 父主题: 数据目录
  • 如何在IAM中创建细粒度权限策略? 当前DataArts Studio不支持在IAM中创建细粒度权限策略。推荐通过DAYU策略+工作空间角色的方式进行权限控制,您可以通过自定义角色进行更精细化的权限管理。 DataArts Studio基于DAYU系统角色+工作空间角色实现授权的能力。为使IAM用户权限正常,IAM用户所在的用户组需要在IAM控制台中被授予DAYU User或DAYU Administrator的系统角色,另外也必须确保DAYU User角色的IAM用户已在对应的DataArts Studio工作空间中被设置为对应的工作空间角色。 工作空间角色决定了该用户在工作空间内的权限,当前有管理员、开发者、运维者和访客这四种预置角色可被分配,您也可以自定义角色进行更精细化的权限管理。各角色权限的详细说明请参见权限列表章节。 管理员:工作空间管理员,拥有工作空间内所有的业务操作权限。建议将项目负责人、开发责任人、运维管理员设置为管理员角色。 开发者:开发者拥有工作空间内创建、管理工作项的业务操作权限。建议将任务开发、任务处理的用户设置为开发者。 运维者:运维者具备工作空间内运维调度等业务的操作权限,但无法更改工作项及配置。建议将运维管理、状态监控的用户设置为运维者。 访客:访客可以查看工作空间内的数据,但无法操作业务。建议将只查看空间内容、不进行操作的用户设置为访客。 部署者:企业模式独有,具备工作空间内任务包发布的相关操作权限。在企业模式中,开发者提交脚本或作业版本后,系统会对应产生发布任务。开发者确认发包后,需要部署者审批通过,才能将修改后的作业同步到生产环境。 自定义角色:如果预置角色不能满足您的需求,您也可以创建自定义角色。自定义角色的权限可自由配置,实现业务操作权限最小化。 父主题: 咨询与计费
  • 为什么权限同步到 DLI 中,会提示权限不够? 权限同步到DLI的任务通过云服务委托(dlg_agency)完成,因此需要委托拥有IAM认证服务相关权限,具体所需权限如表1所示。 表1 待授予权限 权限名称 配置目的 是否必选 授权项/系统权限(二者选其一配置即可) IAM权限 系统获取用户或用户组、创建角色时,需要该权限。 例如用户同步时,如果无此权限会导致操作失败。 是 iam:users:listUsers iam:groups:listGroups iam:users:listUsersForGroup iam:roles:createRole iam:roles:deleteRole iam:roles:updateRole iam:permissions:grantRoleToGroup iam:permissions:listRoleAssignments iam:permissions:revokeRoleFromGroup Security Administrator DLI权限同步权限 DLI权限同步时,需要该权限。 例如DLI权限同步时,如果无此权限会导致同步失败,系统提示权限不足。 DLI权限管理时必选 dli:database:grantPrivilege dli:table:grantPrivilege dli:column:grantPrivilege dli:queue:grantPrivilege DLI FullAccess 如出现此提示,可参考如下示例完成委托授权(本例以授予系统权限为例): 登录IAM控制台。 在 统一身份认证 服务左侧导航窗格中,单击“委托”。 在搜索框中,搜索“dlg_agency”,找到dlg_agency委托项,单击“授权”。 图1 dlg_agency授权 在授权框中,分别搜索并勾选“Security Administrator”和“DLI FullAccess”,单击“下一步”。 图2 勾选Security Administrator 单击“确定”,给委托完成授权。授权后,等待15-30分钟,权限可正常同步到DLI。 父主题: 数据安全
  • 可能原因 DataArts Studio基于DAYU系统角色+工作空间角色实现授权的能力。为使IAM用户权限正常,IAM用户所在的用户组需要在IAM控制台中被授予DAYU User或DAYU Administrator的系统角色,另外也必须确保DAYU User角色的IAM用户已在对应的DataArts Studio工作空间中被设置为对应的工作空间角色。 如果您只给用户配置了DAYU User系统角色,未配置工作空间角色,则会出现无法查看工作空间的报错。
  • 解决方案 请确认当前Hive SQL和Spark SQL脚本使用的数据连接为“MRS API连接”还是“通过代理连接”。 “MRS API连接”模式下DataArts Studio通过API把脚本提交给MRS,然后查询是否执行完成;而MRS不会将具体的错误原因反馈到DataArts Studio,因此导致数据开发脚本执行界面只能显示执行成功还是失败。 “通过代理连接”模式下DataArts Studio提交脚本并运行,查看脚本是否执行完成,同时在数据开发脚本执行界面,日志中会显示具体错误信息和脚本执行的结果。 如果需要查看具体的错误原因,则需要到MRS的作业管理界面进行查看。
  • 如何选择区域? 选择区域时,您需要考虑以下几个因素: 地理位置 一般情况下,建议就近选择靠近您或者您的目标用户的区域,这样可以减少网络时延,提高访问速度。不过,在基础设施、BGP网络品质、资源的操作与配置等方面,中国大陆各个区域间区别不大,如果您或者您的目标用户在中国大陆,可以不用考虑不同区域造成的网络时延问题。 曼谷等其他地区和国家提供国际带宽,主要面向非中国大陆地区的用户。如果您或者您的目标用户在中国大陆,使用这些区域会有较长的访问时延,不建议使用。 云服务之间的关系 如果多个云服务一起搭配使用,需要注意不同区域的云服务内网不互通。 例如DataArts Studio(包括管理中心、CDM等组件)需要与MRS、OBS等服务互通时,如果DataArts Studio与其他云服务处于不同区域的情况下,需要通过公网或者专线打通网络;而在同区域情况下,同子网、同安全组的不同实例默认网络互通。 资源的价格 不同区域的资源价格可能有差异,请参见华为云服务价格详情。
  • 什么是区域、可用区? 我们用区域和可用区来描述数据中心的位置,您可以在特定的区域、可用区创建资源。 区域(Region):从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 可用区(AZ,Availability Zone)是同一区域内,电力和网络互相隔离的物理区域,一个可用区不受其他可用区故障的影响。一个区域内可以有多个可用区,不同可用区之间物理隔离,但内网互通,既保障了可用区的独立性,又提供了低价、低时延的网络连接。 图1阐明了区域和可用区之间的关系。 图1 区域和可用区 目前,华为云已在全球多个地域开放云服务,您可以根据需求选择适合自己的区域和可用区。更多信息请参见华为云全球站点。
  • 如何选择可用区? DataArts Studio实例中的数据集成CDM集群所在可用区。DataArts Studio实例通过数据集成CDM集群与其他服务实现网络互通。 第一次购买DataArts Studio实例或增量包时,可用区无要求。再次购买DataArts Studio实例或增量包时,是否将资源放在同一可用区内,主要取决于您对容灾能力和网络时延的要求。 如果您的应用需要较高的容灾能力,建议您将资源部署在同一区域的不同可用区内。 如果您的应用要求实例之间的网络延时较低,则建议您将资源创建在同一可用区内。
  • 操作步骤 找一台Windows机器作为网关机,该机器同时配置内网和外网IP。通过以下测试来确保网关机器的服务要求: 在该机器上ping内网MySQL地址可以ping通,例如:ping 192.168.1.8。 在另外一台可上网的机器上ping网关机的公网地址可以ping通,例如ping 202.xx.xx.10。 下载端口映射工具IPOP,在网关机上安装IPOP。 运行端口映射工具,选择“端口映射”,如图2所示。 本地地址、本地端口:配置为网关机的公网地址和端口(后续在CDM上创建MySQL连接时输入这个地址和端口)。 映射地址、映射端口:配置为内网MySQL的地址和端口。 图2 配置端口映射 单击“增加”,添加端口映射关系。 单击“开始映射”,这时才会真正开始映射,接收数据包。 至此,就可以在CDM上通过弹性IP读取本地内网MySQL的数据,然后导入到云服务DWS中。 CDM要访问本地数据源,也必须给CDM集群配置EIP。 一般云服务DWS默认也是只允许VPC内部访问,创建CDM集群时,必须将CDM的VPC与DWS配置一致,且推荐在同一个内网和安全组,如果不同,还需要配置允许两个安全组之间的数据访问。 端口映射不仅可以用于迁移内网数据库的数据,还可以迁移例如SFTP服务器上的数据。 Linux机器也可以通过IPTABLE实现端口映射。 内网中的FTP通过端口映射到公网时,需要检查是否启用了PASV模式。这种情况下客户端和服务端建立连接的时候是走的随机端口,所以除了配置21端口映射外,还需要配置PASV模式的端口范围映射,例如vsftp通过配置pasv_min_port和pasv_max_port指定端口范围。
  • 解决方案 CDM虽然不支持直接在不同集群间迁移作业,但是通过批量导出、批量导入作业的功能,可以间接实现集群间的作业迁移,方法如下: 将CDM集群1中的所有作业批量导出,将作业的JSON文件保存到本地。 由于安全原因,CDM导出作业时没有导出连接密码,连接密码全部使用“Add password here”替换。 在本地编辑JSON文件,将“Add password here”替换为对应连接的正确密码。 将编辑好的JSON文件批量导入到CDM集群2,实现集群1和集群2之间的作业同步。
  • 表达式转换 使用JSP表达式语言(Expression Language)对当前字段或整行数据进行转换。JSP表达式语言可以用来创建算术和逻辑表达式。在表达式内可以使用整型数,浮点数,字符串,常量true、false和null。 数据进行转换过程中,替换内容包含特殊字符时,需要先使用\将该字符转义成普通字符。 表达式支持以下两个环境变量: value:当前字段值。 row:当前行,数组类型。 表达式支持的工具类用法罗列如下,未列出即表示不支持: 如果当前字段为字符串类型,将字符串全部转换为小写,例如将“aBC”转换为“abc”。 表达式:StringUtils.lowerCase(value) 将当前字段的字符串全部转为大写。 表达式:StringUtils.upperCase(value) 如果想将第1个日期字段格式从“2018-01-05 15:15:05”转换为“20180105”。 表达式:DateUtils.format(DateUtils.parseDate(row[0],"yyyy-MM-dd HH:mm:ss"),"yyyyMMdd") 如果想将时间戳转换成“yyyy-MM-dd hh:mm:ss”格式的日期字符串的类型,例如字段值为“1701312046588”,转换后为“2023-11-30 10:40:46”。 表达式:DateUtils.format(NumberUtils.toLong(value),"yyyy-MM-dd HH:mm:ss") 如果想将“yyyy-MM-dd hh:mm:ss”格式的日期字符串转换成时间戳的类型。 表达式:DateUtils.getTime(DateUtils.parseDate(value,"yyyy-MM-dd hh:mm:ss")) 如果当前字段值为“yyyy-MM-dd”格式的日期字符串,需要截取年,例如字段值为“2017-12-01”,转换后为“2017”。 表达式:StringUtils.substringBefore(value,"-") 如果当前字段值为数值类型,转换后值为当前值的两倍。 表达式:value*2 如果当前字段值为“true”,转换后为“Y”,其它值则转换后为“N”。 表达式:value=="true"?"Y":"N" 如果当前字段值为字符串类型,当为空时,转换为“Default”,否则不转换。 表达式:empty value? "Default":value 如果想将日期字段格式从“2018/01/05 15:15:05”转换为“2018-01-05 15:15:05”。 表达式:DateUtils.format(DateUtils.parseDate(value,"yyyy/MM/dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss") 获取一个36位的UUID(Universally Unique Identifier,通用唯一识别码)。 表达式:CommonUtils.randomUUID() 如果当前字段值为字符串类型,将首字母转换为大写,例如将“cat”转换为“Cat”。 表达式:StringUtils.capitalize(value) 如果当前字段值为字符串类型,将首字母转换为小写,例如将“Cat”转换为“cat”。 表达式:StringUtils.uncapitalize(value) 如果当前字段值为字符串类型,使用空格填充为指定长度,并且将字符串居中,当字符串长度不小于指定长度时不转换,例如将“ab”转换为长度为4的“ab”。 表达式:StringUtils.center(value,4) 删除字符串末尾的一个换行符(包括“\n”、“\r”或者“\r\n”),例如将“abc\r\n\r\n”转换为“abc\r\n”。 表达式:StringUtils.chomp(value) 如果字符串中包含指定的字符串,则返回布尔值true,否则返回false。例如“abc”中包含“a”,则返回true。 表达式:StringUtils.contains(value,"a") 如果字符串中包含指定字符串的任一字符,则返回布尔值true,否则返回false。例如“zzabyycdxx”中包含“z”或“a”任意一个,则返回true。 表达式:StringUtils.containsAny(value,"za") 如果字符串中不包含指定的所有字符,则返回布尔值true,包含任意一个字符则返回false。例如“abz”中包含“xyz”里的任意一个字符,则返回false。 表达式:StringUtils.containsNone(value,"xyz") 如果当前字符串只包含指定字符串中的字符,则返回布尔值true,包含任意一个其它字符则返回false。例如“abab”只包含“abc”中的字符,则返回true。 表达式:StringUtils.containsOnly(value,"abc") 如果字符串为空或null,则转换为指定的字符串,否则不转换。例如将空字符转换为null。 表达式:StringUtils.defaultIfEmpty(value,null) 如果字符串以指定的后缀结尾(包括大小写),则返回布尔值true,否则返回false。例如“abcdef”后缀不为null,则返回false。 表达式:StringUtils.endsWith(value,null) 如果字符串和指定的字符串完全一样(包括大小写),则返回布尔值true,否则返回false。例如比较字符串“abc”和“ABC”,则返回false。 表达式:StringUtils.equals(value,"ABC") 从字符串中获取指定字符串的第一个索引,没有则返回整数-1。例如从“aabaabaa”中获取“ab”的第一个索引1。 表达式:StringUtils.indexOf(value,"ab") 从字符串中获取指定字符串的最后一个索引,没有则返回整数-1。例如从“aFkyk”中获取“k”的最后一个索引4。 表达式:StringUtils.lastIndexOf(value,"k") 从字符串中指定的位置往后查找,获取指定字符串的第一个索引,没有则转换为“-1”。例如“aabaabaa”中索引3的后面,第一个“b”的索引是5。 表达式:StringUtils.indexOf(value,"b",3) 从字符串获取指定字符串中任一字符的第一个索引,没有则返回整数-1。例如从“zzabyycdxx”中获取“z”或“a”的第一个索引0。 表达式:StringUtils.indexOfAny(value,"za") 如果字符串仅包含Unicode字符,返回布尔值true,否则返回false。例如“ab2c”中包含非Unicode字符,返回false。 表达式:StringUtils.isAlpha(value) 如果字符串仅包含Unicode字符或数字,返回布尔值true,否则返回false。例如“ab2c”中仅包含Unicode字符和数字,返回true。 表达式:StringUtils.isAlphanumeric(value) 如果字符串仅包含Unicode字符、数字或空格,返回布尔值true,否则返回false。例如“ab2c”中仅包含Unicode字符和数字,返回true。 表达式:StringUtils.isAlphanumericSpace(value) 如果字符串仅包含Unicode字符或空格,返回布尔值true,否则返回false。例如“ab2c”中包含Unicode字符和数字,返回false。 表达式:StringUtils.isAlphaSpace(value) 如果字符串仅包含ASCII可打印字符,返回布尔值true,否则返回false。例如“!ab-c~”返回true。 表达式:StringUtils.isAsciiPrintable(value) 如果字符串为空或null,返回布尔值true,否则返回false。 表达式:StringUtils.isEmpty(value) 如果字符串中仅包含Unicode数字,返回布尔值true,否则返回false。 表达式:StringUtils.isNumeric(value) 获取字符串最左端的指定长度的字符,例如获取“abc”最左端的2位字符“ab”。 表达式:StringUtils.left(value,2) 获取字符串最右端的指定长度的字符,例如获取“abc”最右端的2位字符“bc”。 表达式:StringUtils.right(value,2) 将指定字符串拼接至当前字符串的左侧,需同时指定拼接后的字符串长度,如果当前字符串长度不小于指定长度,则不转换。例如将“yz”拼接到“bat”左侧,拼接后长度为8,则转换后为“yzyzybat”。 表达式:StringUtils.leftPad(value,8,"yz") 将指定字符串拼接至当前字符串的右侧,需同时指定拼接后的字符串长度,如果当前字符串长度不小于指定长度,则不转换。例如将“yz”拼接到“bat”右侧,拼接后长度为8,则转换后为“batyzyzy”。 表达式:StringUtils.rightPad(value,8,"yz") 如果当前字段为字符串类型,获取当前字符串的长度,如果该字符串为null,则返回0。 表达式:StringUtils.length(value) 如果当前字段为字符串类型,删除其中所有的指定字符串,例如从“queued”中删除“ue”,转换后为“qd”。 表达式:StringUtils.remove(value,"ue") 如果当前字段为字符串类型,移除当前字段末尾指定的子字符串。指定的子字符串若不在当前字段的末尾,则不转换,例如移除当前字段“www.domain.com”后的“.com”。 表达式:StringUtils.removeEnd(value,".com") 如果当前字段为字符串类型,移除当前字段开头指定的子字符串。指定的子字符串若不在当前字段的开头,则不转换,例如移除当前字段“www.domain.com”前的“www.”。 表达式:StringUtils.removeStart(value,"www.") 如果当前字段为字符串类型,替换当前字段中所有的指定字符串,例如将“aba”中的“a”用“z”替换,转换后为“zbz”。 表达式:StringUtils.replace(value,"a","z") 替换内容包含特殊字符时,需要先把该字符转义成普通字符,例如,客户想通过该表达式把字符串中 \t 去掉时,需要配置为: StringUtils.replace(value,"\\t","")(即把 \ 再次转义)。 如果当前字段为字符串类型,一次替换字符串中的多个字符,例如将字符串“hello”中的“h”用“j”替换,“o”用“y”替换,转换后为“jelly”。 表达式:StringUtils.replaceChars(value,"ho","jy") 如果字符串以指定的前缀开头(区分大小写),则返回布尔值true,否则返回false,例如当前字符串“abcdef”以“abc”开头,则返回true。 表达式:StringUtils.startsWith(value,"abc") 如果当前字段为字符串类型,去除字段中首、尾处所有指定的字符,例如去除“abcyx”中首尾所有的“x”、“y”、“z”和“b”,转换后为“abc”。 表达式:StringUtils.strip(value,"xyzb") 如果当前字段为字符串类型,去除字段末尾所有指定的字符,例如去除当前字段末尾的“abc”字符串。 表达式:StringUtils.stripEnd(value,"abc") 如果当前字段为字符串类型,去除字段开头所有指定的字符,例如去除当前字段开头的所有空格。 表达式:StringUtils.stripStart(value,null) 如果当前字段为字符串类型,获取字符串指定位置后(索引从0开始,包括指定位置的字符)的子字符串,指定位置如果为负数,则从末尾往前计算位置,末尾第一位为-1。例如获取“abcde”索引为2的字符(即c)及之后的字符串,则转换后为“cde”。 表达式:StringUtils.substring(value,2) 如果当前字段为字符串类型,获取字符串指定区间(索引从0开始,区间起点包括指定位置的字符,区间终点不包含指定位置的字符)的子字符串,区间位置如果为负数,则从末尾往前计算位置,末尾第一位为-1。例如获取“abcde”第2个字符(即c)及之后、第4个字符(即e)之前的字符串,则转换后为“cd”。 表达式:StringUtils.substring(value,2,4) 如果当前字段为字符串类型,获取当前字段里第一个指定字符后的子字符串。例如获取“abcba”中第一个“b”之后的子字符串,转换后为“cba”。 表达式:StringUtils.substringAfter(value,"b") 如果当前字段为字符串类型,获取当前字段里最后一个指定字符后的子字符串。例如获取“abcba”中最后一个“b”之后的子字符串,转换后为“a”。 表达式:StringUtils.substringAfterLast(value,"b") 如果当前字段为字符串类型,获取当前字段里第一个指定字符前的子字符串。例如获取“abcba”中第一个“b”之前的子字符串,转换后为“a”。 表达式:StringUtils.substringBefore(value,"b") 如果当前字段为字符串类型,获取当前字段里最后一个指定字符前的子字符串。例如获取“abcba”中最后一个“b”之前的子字符串,转换后为“abc”。 表达式:StringUtils.substringBeforeLast(value,"b") 如果当前字段为字符串类型,获取嵌套在指定字符串之间的子字符串,没有匹配的则返回null。例如获取“tagabctag”中“tag”之间的子字符串,转换后为“abc”。 表达式:StringUtils.substringBetween(value,"tag") 如果当前字段为字符串类型,删除当前字符串两端的控制字符(char≤32),例如删除字符串前后的空格。 表达式:StringUtils.trim(value) 将当前字符串转换为字节,如果转换失败,则返回0。 表达式:NumberUtils.toByte(value) 将当前字符串转换为字节,如果转换失败,则返回指定值,例如指定值配置为1。 表达式:NumberUtils.toByte(value,1) 将当前字符串转换为Double数值,如果转换失败,则返回0.0d。 表达式:NumberUtils.toDouble(value) 将当前字符串转换为Double数值,如果转换失败,则返回指定值,例如指定值配置为1.1d。 表达式:NumberUtils.toDouble(value,1.1d) 将当前字符串转换为Float数值,如果转换失败,则返回0.0f。 表达式:NumberUtils.toFloat(value) 将当前字符串转换为Float数值,如果转换失败,则返回指定值,例如配置指定值为1.1f。 表达式:NumberUtils.toFloat(value,1.1f) 将当前字符串转换为Int数值,如果转换失败,则返回0。 表达式:NumberUtils.toInt(value) 将当前字符串转换为Int数值,如果转换失败,则返回指定值,例如配置指定值为1。 表达式:NumberUtils.toInt(value,1) 将字符串转换为Long数值,如果转换失败,则返回0。 表达式:NumberUtils.toLong(value) 将当前字符串转换为Long数值,如果转换失败,则返回指定值,例如配置指定值为1L。 表达式:NumberUtils.toLong(value,1L) 将字符串转换为Short数值,如果转换失败,则返回0。 表达式:NumberUtils.toShort(value) 将当前字符串转换为Short数值,如果转换失败,则返回指定值,例如配置指定值为1。 表达式:NumberUtils.toShort(value,1) 将当前IP字符串转换为Long数值,例如将“10.78.124.0”转换为Long数值是“172915712”。 表达式:CommonUtils.ipToLong(value) 从网络读取一个IP与物理地址映射文件,并存放到Map集合,这里的URL是IP与地址映射文件存放地址,例如“http://10.114.205.45:21203/sqoop/IpList.csv”。 表达式:HttpsUtils.downloadMap("url") 将IP与地址映射对象缓存起来并指定一个key值用于检索,例如“ipList”。 表达式:CommonUtils.setCache("ipList",HttpsUtils.downloadMap("url")) 取出缓存的IP与地址映射对象。 表达式:CommonUtils.getCache("ipList") 判断是否有IP与地址映射缓存。 表达式:CommonUtils.cacheExists("ipList") 根据IP取出对应的详细地址:国家_省份_城市_运营商,例如“1xx.78.124.0”对应的地址为“中国_广东_深圳_电信”,取不到对应地址则默认“**_**_**_**”。如果需要,可通过StringUtil类表达式对地址进行进一步拆分。 表达式:CommonUtils.getMapValue(CommonUtils.ipToLong(value),CommonUtils.cacheExists("ipLis")?CommonUtils.getCache("ipLis"):CommonUtils.setCache("ipLis",HttpsUtils.downloadMap("url"))) 根据指定的偏移类型(month/day/hour/minute/second)及偏移量(正数表示增加,负数表示减少),将指定格式的时间转换为一个新时间,例如将“2019-05-21 12:00:00”增加8个小时。 表达式:DateUtils.getCurrentTimeByZone("yyyy-MM-dd HH:mm:ss",value, "hour", 8) 如果value值为空或者null时,则返回字符串“aaa”,否则返回value。 表达式:StringUtils.defaultIfEmpty(value,"aaa")
  • 免费试用即将到期,如何续费? 当免费试用的DataArts Studio实例即将到期时,您可以购买DataArts Studio实例以继续使用。您可以登录DataArts Studio控制台,找到即将到期的免费试用的DataArts Studio实例,在试用的DataArts Studio实例上单击“购买DataArts Studio实例”进行购买。 购买DataArts Studio实例的具体操作,请参见购买DataArts Studio实例。在购买DataArts Studio实例时,如需保留原有DataArts Studio实例中的资源和数据,您需要注意以下几点: 购买DataArts Studio实例的区域需和免费试用的DataArts Studio实例的区域一致。 需购买同版本或更高版本的DataArts Studio实例。 试用实例的资源默认继承保留至第一个购买成功的实例中。 父主题: 咨询与计费
  • 试用初级版 您可以进入“大数据福利专场 0元试用”或“免费试用专区”活动页面,找到DataArts Studio的试用活动,配置DataArts Studio的区域后(不同区域的资源之间内网不互通,请根据您的实际需要慎重选择区域),单击购买即可进入DataArts Studio实例创建界面。 图1 试用初级版 试用初级版注意事项: 云产品体验名额有限,领完即止。 符合“参与对象”的同一用户仅能对同一产品申请一次。 试用产品的升级:用户试用过程中,主动进行升配等操作,将按照官网标准价格收费;如果进行降配或切换计费方式等,将不进行退费。 试用产品的续费:用户需要在试用期满后继续使用DataArts Studio的,应当在期满前按标准费用进行续费。
  • 使用免费版 您可以参考购买DataArts Studio基础包,直接购买DataArts Studio免费版。 图2 使用免费版 使用免费版注意事项: 免费版不自带数据集成集群,而是首次购买时赠送36小时cdm.large规格的CDM集群折扣套餐,1年内有效。使用折扣套餐包时,您需要在“ 云数据迁移 CDM”服务创建一个与DataArts Studio实例区域一致的cdm.large规格集群,集群运行时会自动扣除折扣套餐包时长,折扣套餐包时长到期后需要删除此集群,否则会产生相关费用。关于CDM服务的计费详情可参见CDM用户指南。 免费版不支持购买增量包,例如无法购买批量数据迁移增量包或作业节点调度次数/天增量包。 免费版数据开发组件的脚本数和作业数的配额限制分别为20。 免费版仅用于试用场景,在业务负荷大的场景下,无法保证免费版实例上业务的正常运行。 免费版不支持通过API调用的方式使用,仅支持控制台方式使用。 免费版受成本、资源等因素限制,提供的总数量有限。当全网免费版数量超过限额时,将无法继续创建免费版实例。 免费版支持升级到其他付费版本。升级到其他版本或删除当前免费版实例后,您可以再次购买免费版,但不能再勾选“CDM套餐包”,折扣套餐仅在首次购买免费版时赠送。
  • 解决方案 建议您通过以下措施解决此问题: 检查CDM集群是否被关机。 是,将CDM集群开机后,确认管理中心的数据连接恢复正常。 否,跳转至步骤2。 检查该CDM集群是否同时被用于数据迁移作业和管理中心连接代理。 是,您可以错开数据迁移作业和管理中心连接代理的使用时间,或再创建CDM集群,与原有CDM集群分开使用。 否,跳转至步骤3。 直接重启该CDM集群,释放连接池资源。确认管理中心的数据连接恢复正常。
  • DataArts Studio和ROMA有什么差异? 从数据运营方案(数据中台)的数据集成、 数据治理 以及数据开放三层结构来看,DataArts Studio和ROMA主要差别在于数据治理方面: ROMA作为连接各个系统的管道,对接入数据没有治理和规划的功能。 DataArts Studio支持对接入数据进行结构分析,重新建模,最终打破数据孤岛,帮助企业建立统一数据模型。 在实际使用中,经常需要DataArts Studio和ROMA的密切配合使用,支撑用户的数字化转型。 父主题: 咨询与计费
  • 数据服务SDK支持的语言? 数据服务SDK是基于DataArts Studio数据服务创建的数据API封装的SDK包。通过调用此SDK包提供的代码样例,即可进行数据服务中数据API的调用,帮助开发者简单、快速地通过数据API获取到开放数据。 数据服务SDK支持的语言有:C#、Python、Go、JavaScript、PHP、C++、C、Android、Java等,详见SDK参考手册。 父主题: 数据服务
  • 什么是数据血缘关系? 大数据时代,数据爆发性增长,海量的、各种类型的数据在快速产生。这些庞大复杂的数据信息,通过联姻融合、转换变换、流转流通,又生成新的数据,汇聚成数据的海洋。 数据的产生、加工融合、流转流通,到最终消亡,数据之间自然会形成一种关系。我们借鉴人类社会中类似的一种关系来表达数据之间的这种关系,称之为数据的血缘关系。与人类社会中的血缘关系不同,数据的血缘关系还包含了一些特有的特征: 归属性:一般来说,特定的数据归属特定的组织或者个人,数据具有归属性。 多源性:同一个数据可以有多个来源(多个父亲)。一个数据可以是多个数据经过加工而生成的,而且这种加工过程可以是多个。 可追溯性:数据的血缘关系,体现了数据的生命周期,体现了数据从产生到消亡的整个过程,具备可追溯性。 层次性:数据的血缘关系是有层次的。对数据的分类、归纳、总结等对数据进行的描述信息又形成了新的数据,不同程度的描述信息形成了数据的层次。 DataArts Studio生成的血缘关系图如图1所示,为数据表对象,为作业节点对象,通过对象和箭头的编排表示血缘信息。从血缘关系图中可以看到,wk_02表数据是由wk_01表数据经过hive_1作业节点加工而生成的,wk_02表数据经由hive_2作业节点加工又分别生成了wk_03、wk_04和wk_05的表数据。 图1 数据血缘关系示例 父主题: 数据目录
  • 数据目录支持采集哪些对象的资产? 数据目录目前支持采集数据湖的资产,例如MRS Hive、DLI、DWS等,除此之外也支持采集以下数据源的元数据: 关系型数据库,如MySQL/PostgreSQL等(可使用RDS类型连接,采集其元数据) 云搜索服务 CSS 图引擎服务GES 对象存储服务 OBS MRS Hudi组件(MRS Hudi作为一种数据格式,元数据存放在Hive中,操作通过Spark进行。在Hudi表开启“同步hive表配置”后,可通过采集MRS Hive元数据的方式采集Hudi表的元数据) 详情请参见支持的数据源。 父主题: 数据目录
共100000条