华为云用户手册

  • 简单模式与企业模式介绍 简单模式:传统的DataArts Studio工作空间模式。简单模式工作空间下,DataArts Studio数据开发组件以及对应管理中心组件无法设置开发环境和生产环境,只能进行简单的数据开发,无法对数据开发流程和表权限进行强管控。一个数据湖作为DataArts Studio的生产环境。 图5 简单模式工作空间 企业模式:为解决简单模式存在的风险,DataArts Studio工作空间新增支持企业模式。企业模式下,DataArts Studio数据开发组件以及对应管理中心组件的数据连接支持设置开发环境和生产环境,有效隔离开发者对生产环境业务的影响。需要两个数据湖中,其中一个数据湖作为DataArts Studio开发环境,另一个作为DataArts Studio生产环境。其中: 开发环境只针对开发人员开放,只用于脚本或作业开发,开发完后发布到生产环境中。 生产环境内不能做任何修改,只对最终用户开放,任何修改必须回退到开发环境中重新修改发布。 图6 企业模式工作空间 您可选择创建任意模式工作空间体验DataArts Studio,使用企业模式工作空间实现DataArts Studio开发环境与生产环境代码隔离、不同环境计算资源隔离、权限隔离、任务发布流程管控等需求。 若您已在使用简单模式工作空间,并且希望保留当前简单模式工作空间的代码时,可选择工作空间模式升级,详情请参见创建企业模式工作空间。
  • 企业模式对使用流程的影响 简单模式工作空间下,DataArts Studio数据开发组件以及对应管理中心组件无法设置开发环境和生产环境,只能进行简单的数据开发,无法对数据开发流程和表权限进行强管控。提交脚本或作业后,您无需发布,脚本或作业即可进入调度系统周期性执行,产出结果数据。 图7 简单模式流程 企业模式下,DataArts Studio数据开发组件以及对应管理中心组件的数据连接支持设置开发环境和生产环境,有效隔离开发者对生产环境业务的影响。其中:开发环境只针对开发人员开放,只用于脚本或作业开发,开发完后发布到生产环境中。生产环境内不能做任何修改,只对最终用户开放,任何修改必须回退到开发环境中重新修改发布。 图8 企业模式流程
  • 注意事项 不同工作空间模式对于数据湖引擎存在一定的要求,企业模式工作空间需要分别为开发环境和生产环境进行数据湖引擎配置,才可以实现开发生产环境隔离。配置开发生产环境隔离包含以下三种方式: 图1 配置开发生产环境隔离 配置两套数据湖服务,进行开发与生产环境隔离。 对于集群化的数据源(例如MRS、DWS、RDS、MySQL、Oracle、DIS、ECS等),DataArts Studio通过管理中心的创建数据连接区分开发环境和生产环境的数据湖服务,在开发和生产流程中自动切换对应的数据湖。因此您需要准备两套数据湖服务,且两套数据湖服务的版本、规格、组件、区域、VPC、子网以及相关配置等信息,均应保持一致,详细操作请参见新建数据连接。 创建数据连接时,通过不同的集群来进行开发与生产环境的隔离,如图2所示。 图2 创建数据连接时选择不同集群 配置DLI环境隔离。 配置企业模式环境隔离,包含DLI队列配置和DB配置。 对于Serverless服务(例如DLI),DataArts Studio通过管理中心的环境隔离来配置生产环境和开发环境数据湖服务的对应关系,在开发和生产流程中自动切换对应的数据湖。因此您需要在Serverless数据湖服务中准备两套队列、两套数据库资源,建议通过名称后缀进行区分,详细操作请参见配置企业模式环境隔离。 配置DB,在同一个数据湖服务下配置两套数据库,进行开发与生产环境隔离。 对于DWS、MRS Hive和MRS Spark这三种数据源,如果在创建数据连接时选择同一个集群,如图3所示,则需要配置数据源资源映射的DB数据库映射关系进行开发生产环境隔离,如图4所示。详细操作请参见DB配置。 图3 创建数据连接时选择同一个集群 图4 DB配置 企业模式工作空间下,开发环境的数据开发作业默认不进行调度,仅发布至生产环境后可进行调度。
  • 不同模式工作空间的优劣势对比 表3 不同模式工作空间的优劣势对比 对比 简单模式 企业模式 优势 简单、方便、易用。 仅需要授权数据开发人员“开发者”角色即可完成所有数据开发工作。 提交脚本或作业后,您无需发布,脚本或作业即可进入调度系统周期性执行,产出结果数据。 安全、规范。 具备安全、规范的代码发布管控流程(包含代码评审、代码DIFF查看等功能),保障生产环境稳定性,避免不必要的因代码逻辑引起的脏数据蔓延或任务报错等非预期情况。 数据访问得到有效管控,数据安全得以保障。 所有脚本或作业仅支持在开发环境编辑,开发者无法修改生产环境的脚本或作业。 开发环境和生产环境的数据隔离,开发者无法影响生产环境的数据。 开发环境下,脚本、作业以当前开发者的身份执行;生产环境下,脚本、作业则使用空间级的公共IAM账号或公共委托执行。 如果需要对生产环境进行变更,必须在开发环境通过开发者的发布操作才能将变更提交到生产环境,需要管理者或部署者审批通过,才能发布成功。 劣势 存在不稳定、不安全的风险。 无法设置开发环境和生产环境隔离,只能进行简单的数据开发。 无法对生产表权限进行控制。 说明: 开发调测阶段,开发者可直接访问生产数据湖的数据,随意对表进行增加、删除和修改等操作,存在数据安全风险。 无法对数据开发流程进行管控。 说明: 开发者可以不经过任何人审批,随时新增、修改脚本或作业并提交至调度系统,给业务带来不稳定因素。 流程相对复杂,一般情况下无法一人完成所有数据开发、生产流程。
  • 背景信息 本文内容由以下几部分构成,从不同角度分别为您解决企业模式不同的问题。 表1 了解企业模式 分类 说明 简单模式与企业模式介绍 不同工作空间模式的介绍。 不同模式工作空间对生产任务开发与运维的影响 DataArts Studio建立于对应工作空间物理属性之上的任务开发与运维机制介绍。 不同模式工作空间的优劣势对比 不同工作空间模式的优劣势对比。 企业模式对使用流程的影响 介绍企业模式工作空间下的流程管控。 不同工作空间模式下,DataArts Studio模块对应操作 简单模式仅有生产环境,企业模式有开发环境和生产环境,此部分为您介绍各个环境与DataArts Studio模块的对应关系。
  • 导出资源 参考访问DataArts Studio实例控制台登录DataArts Studio管理控制台。 在DataArts Studio控制台首页,选择对应工作空间的“管理中心”模块,进入管理中心页面。 在管理中心页面,单击“资源迁移”,进入资源迁移页面。 图1 资源迁移 单击“新建导出”,配置文件的OBS存储位置和文件名称。 图2 选择导出文件 单击“下一步”,勾选导出的模块。 图3 勾选导出的模块 单击“下一步”,等待导出完成,资源包导出到所设置的OBS存储位置。 图4 导出完成 导出资源耗时1分钟仍未显示结果则表示导出失败,请重试。如果仍然无法导出,请联系客服或技术支持人员协助解决。 导出完成后可在资源迁移任务列表中,单击对应任务的“下载”按钮,本地获取导出的资源包。 图5 下载导出结果
  • 导入资源 参考访问DataArts Studio实例控制台登录DataArts Studio管理控制台。 在DataArts Studio控制台首页,选择对应工作空间的“管理中心”模块,进入管理中心页面。 在管理中心页面,单击“资源迁移”,进入资源迁移页面。 图6 资源迁移 单击“新建导入”,选择导入方式后,配置待导入资源的OBS或本地路径。待导入的资源应为通过导出获取的zip文件。 图7 配置待导入的资源存储路径 单击“新建导入”,上传待导入资源。待导入的资源应为通过导出获取的zip文件 单击“下一步”,勾选导入的资源类型。 图8 勾选导入的资源类型 如果选择导入数据源,则单击“下一步”需要配置数据连接。 图9 配置数据连接 单击“下一步”,等待导入任务下发,导入任务成功下发后系统提示“导入开始”。 图10 导入开始 系统提示“导入开始”后,单击“确定”,可在资源迁移任务列表中查看导入结果。 其中存在子任务失败时,可单击红色子任务名,查看失败原因。 图11 查看导入结果
  • 创建数据识别规则组 在DataArts Studio控制台首页,选择实例,单击“进入控制台”,选择对应工作空间的“数据安全”模块,进入数据安全页面。 图1 选择数据安全 单击左侧导航树中的“数据识别规则”,进入数据识别规则页面。 单击页面上方“规则分组”页签,进入分组列表页面。 图2 新建数据识别规则组 单击“新建”,输入新建分组名称和描述,参数设置参考表1,并勾选左侧列表中的识别规则。配置完成后单击“确定”即可。 图3 新建分组参数配置 您所勾选的规则将显示在右侧列表中,右侧已选列表中,已选规则可以通过单击操作来取消勾选。 表1 参数配置表 配置 说明 *分组名称 规则组名称只能包含中文、英文字母、数字和下划线。 建议包含规则含义,避免无意义的描述,以便于使用中能快速选择需要的规则组。 分组描述 为更好地识别规则组,此处加以描述信息。
  • 相关操作 编辑规则分组:在规则分组页面,单击对应规则分组操作栏中的“编辑”,即可修改规则分组的名称、描述和关联的识别规则。 删除规则分组:在规则分组页面,单击对应规则分组操作栏中的“删除”,即可删除识别规则。当需要批量删除时,可以在勾选规则分组后,在列表上方单击“批量删除”。 被引用的规则分组不可删除。如果要删除引用的规则分组,需要先解除规则分组关联的敏感数据发现任务后再删除。解除关联任务请参考发现敏感数据编辑任务,修改“识别规则组”即可。 删除操作无法撤销,请谨慎操作。
  • 配置作业参数 作业参数为全局参数,可用于作业中的任意节点。操作方法如下: 单击编辑器右侧的“参数”,展开配置页面,配置如表4所示的参数。 表4 作业参数配置 功能 说明 变量 新增 单击“新增”,在文本框中填写作业参数的名称和参数值。 参数名称 名称只能包含字符:英文字母、数字、中划线和下划线。 参数值 字符串类的参数直接填写字符串,例如:str1 数值类的参数直接填写数值或运算表达式。 参数配置完成后,在作业中的引用格式为:${参数名称} 编辑参数表达式 在参数值文本框后方,单击,编辑参数表达式,更多表达式请参见表达式概述。 修改 在参数名和参数值的文本框中直接修改。 掩码显示 在参数值为密钥等情况下,从安全角度,请单击将参数值掩码显示。 删除 在参数值文本框后方,单击,删除作业参数。 常量 新增 单击“新增”,在文本框中填写作业常量的名称和参数值。 参数名称 名称只能包含字符:英文字母、数字、中划线和下划线。 参数值 字符串类的参数直接填写字符串,例如:str1 数值类的参数直接填写数值或运算表达式。 参数配置完成后,在作业中的引用格式为:${参数名称} 编辑参数表达式 在参数值文本框后方,单击,编辑参数表达式,更多表达式请参见表达式概述。 修改 在参数名和参数值的文本框中直接修改,修改完成后,请保存。 删除 在参数值文本框后方,单击,删除作业常量。 工作空间环境变量 查看工作空间已配置的变量和常量。 单击“作业参数预览”页签,展开预览页面,配置如表5所示的参数。 表5 作业参数预览 功能 说明 当前时间 仅单次调度才显示。系统默认为当前时间。 事件触发时间 仅事件驱动调度才显示。系统默认为事件触发时间。 周期调度 仅周期调度才显示。系统默认为调度周期。 具体时间 仅周期调度才显示。周期调度配置的具体运行时间。 起始日期 仅周期调度才显示。周期调度的生效时间。 后N个实例 作业运行调度的实例个数。 单次调度场景默认为1。 事件驱动调度场景默认为1。 周期调度场景 当实例数大于10时,系统最多展示10个日期实例,系统会自动提示“当前参数预览最多支持查看10个实例”。 在作业参数预览中,如果作业参数配置存在语法异常情况系统会给出提示信息。 如果参数配置了依赖作业实际运行时产生的数据,参数预览功能中无法模拟此类数据,则该数据不展示。
  • 约束限制 作业源端开启“使用SQL语句”参数时不支持配置转换器。 如果在字段映射界面,CDM通过获取样值的方式无法获得所有列(例如从HBase/CloudTable/MongoDB导出数据时,CDM有较大概率无法获得所有列),则可以单击后选择“添加新字段”来手动增加,确保导入到目的端的数据完整。 关系数据库、Hive、MRS Hudi及DLI做源端时,不支持获取样值功能。 SQLServer作为目的端数据源时,不支持timestamp类型字段的写入,需修改为其他时间类型字段写入(如datetime)。 当作业源端为OBS、迁移CSV文件时,并且配置“解析首行为列名”参数的场景下显示列名。 当使用二进制格式进行文件到文件的迁移时,没有配置字段转换器这一步。 自动创表场景下,需在目的端表中提前手动新增字段,再在字段映射里新增字段。 添加完字段后,新增的字段在界面不显示样值,不会影响字段值的传输,CDM会将字段值直接写入目的端。 如果字段映射关系不正确,您可以通过拖拽字段、单击对字段批量映射两种方式来调整字段映射关系。 创建表达式转换器时,表达式的功能是对该字段的数据进行处理,故不建议使用时间宏,如需使用,请根据以下场景处理(源端是文件类的配置时仅支持方式一): 方式一:新建表达式转换器时,表达式需要用''包围。 ${dateformat(yyyy-MM-dd)}不加引号使用时,解析成2017-10-16之后还会进行运算,将'-'识别为减号,导致结果为1991,须使用'${dateformat(yyyy-MM-dd)}',即'2017-10-16'。 图2 使用''包围表达式 方式二:源字段中新增自定义字段,在样值中填写时间宏变量,重新进行字段映射处理。 图3 源字段新增自定义字段 如果是导入到数据仓库服务(DWS),则还需在目的字段中选择分布列,建议按如下顺序选取分布列: 有主键可以使用主键作为分布列。 多个数据段联合做主键的场景,建议设置所有主键作为分布列。 在没有主键的场景下,如果没有选择分布列,DWS会默认第一列作为分布列,可能会有数据倾斜风险。
  • 表达式转换 使用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")
  • 约束与限制 仅DAYU Administrator、Tenant Administrator用户或者数据安全管理员可以创建、修改或删除密级权限管控策略,其他普通用户无权限操作。 密级权限管控仅支持对数据地图中已标记密级的字段在数据预览时进行权限管控,不支持对已标记密级的表进行权限管控。 用户/用户组和密级共同唯一标识一条密级权限管控策略,因此不支持创建同用户/用户组、同密级的策略。 同用户/用户组如果对应多个密级,则以最高密级为准进行密级权限管控。
  • 创建敏感数据管控策略 在DataArts Studio控制台首页,选择实例,单击“进入控制台”,选择对应工作空间的“数据安全”模块,进入数据安全页面。 图1 选择数据安全 单击左侧导航树中的“敏感数据管控”,进入敏感数据管控页面。 敏感数据管控页面的策略列表中,已有数据安全预置的默认策略,该策略默认给所有用户最大的密级访问权限。 图2 进入敏感数据管控页面 单击“新建”,新建密级权限管控策略页面,参数配置参考表1。 图3 新建密级权限管控策略参数配置 创建密级权限管控策略参数配置说明: 表1 配置策略参数 参数名 参数说明 *用户类型 选择为用户或用户组进行密级权限管控。 *用户名称 选择当前实例所有工作空间成员中的用户或用户组。 *密级 选择指定用户/用户组的指定密级,则指定用户/用户组仅能访问资产密级小于等于指定密级的资产。 *权限类别 当前仅支持数据地图中的数据预览权限。 单击“保存”,完成密级权限管控策略创建。 密级权限管控策略创建完成后,需要删除默认策略,以使新建的策略生效。
  • 相关操作 编辑识别规则:在识别规则页面,单击对应识别规则操作栏中的“编辑”,即可修改识别规则关联的密级、分类和描述。如果为自定义规则,还支持修改识别规则和正则表达式。 编辑识别规则状态:新增的识别规则默认为启用状态。当识别规则为关闭状态时,表示该规则将不可被添加到识别规则组。 需要修改识别规则状态时,在识别规则页面单击对应识别规则中的或,即可启用或关闭对应规则。 删除识别规则:在识别规则页面,单击对应识别规则操作栏中的“删除”,即可删除识别规则。当需要批量删除时,可以在勾选识别规则后,在列表上方单击“批量删除”。 注意,已在识别规则分组或脱敏策略中引用的识别规则无法删除。若要删除,需要先修改引用关系,再进行删除操作。 删除操作无法撤销,请谨慎操作。 测试内置规则模板:在“内置规则模板”页签可查看所有内置规则模板,并且根据输入的自定义样例数据,测试验证内置规则模板的识别结果。
  • 创建数据识别规则 在DataArts Studio控制台首页,选择实例,单击“进入控制台”,选择对应工作空间的“数据安全”模块,进入数据安全页面。 图1 选择数据安全 在数据安全控制台左侧的导航树中单击“数据识别规则”,进入数据识别规则页面。 在“识别规则”页面单击“新建”,创建识别规则。 图2 新建识别规则 新建规则参数配置请参考表1,参数配置完成单击“确定”即可。 图3 规则配置 表1 配置识别规则参数说明 配置 说明 *规则类型 即规则所属分类,支持按模板添加内置规则和自定义规则。 *数据密级 对配置的数据进行等级划分。如果现有的分级不满足需求,请进入数据密级页面进行设置,详情请参见定义数据密级。 数据分类 对配置的数据进行分类划分。如果现有的分类不满足需求,请进入数据分类页面进行设置,详情请参见定义数据分类。 规则描述 对当前规则进行简单描述。 内置 *规则模板 规则类型选择“内置”,呈现此参数。 如果选择按模板添加,系统内置了70+条敏感数据识别和脱敏规则,可对个人敏感信息(手机号码、电话号码、银行卡、信用卡等)、企业敏感信息(财政资产信息、企业交付信息等)、密钥敏感信息(DSA密钥、RSA密钥等)、设备敏感信息(IPv4地址、IPv6地址等)、位置敏感信息(省份、城市、GPS位置、地址等)和通用敏感信息(日期)等敏感信息进行识别和脱敏。 *规则名称 规则类型选择“内置”,规则名称自动关联分类模板生成。 自定义 *规则名称 规则类型选择“自定义”,您可以自行填写分类名称,名称为必填项。建议包含规则含义,避免无意义的描述,以便于使用中能快速选择需要的规则。 说明: 定义数据识别规则,名称必须唯一。 *识别规则 规则类型选择“自定义”,呈现此参数,支持正则表达式。 当选择“无”,表示关联了该规则的敏感数据发现任务不生效。无法自动为数据资产分类,需要您手动添加分类。 *正则表达式 识别规则选择“正则表达式”时,呈现此参数。 内容识别:勾选此项后输入自定义正则表达式,该表达式将用于数据内容识别。内容识别正则表达式举例:“^男$|^女&”。 列名识别:勾选此项后输入自定义正则表达式,该表达式将用于字段名精确匹配和模糊匹配两种方式,当前支持多个字段匹配。列名识别正则表达式举例:“sex|gender”。 备注识别:勾选此项后输入自定义正则表达式,例如“.*comment.*”代表模糊匹配备注。
  • 数据开发操作列表 云审计服务(Cloud Trace Service,简称CTS)为用户提供了云账户下资源的操作记录,可以帮您记录相关的操作事件,便于日后的查询、审计和回溯。 表1 支持云审计的关键操作列表 操作名称 资源类型 事件名称 创建作业 job createJob(api) 修改作业 job editJob(api) 保存作业 job saveJob 删除作业 job deleteJob 重命名作业 job renameJob 导入作业 job importPipeline/importJob(api) 导出作业 job exportPipeline/exportJob(api) 批量导出作业 job exportJobs(api) 提交作业版本 job addNewVersion 抢作业锁 job acquireEditLock 解作业锁 job releaseLock 批量解作业锁 job batchReleaseEditLock 测试运行 job testRun 执行调度 job startJob 执行调度 job startJobByName 停止调度 job stopJob 批量停止调度 job stopJobs 暂停调度 job pauseJob 作业复制另存为 job copyAndSaveJob 批量删除作业 job deleteDirectoryList 移动作业 job move 停止实例 task stopTask/stop(api) 强制成功实例 task forceTaskSuccess 继续执行实例 task continueExecute 重跑实例 task retryTask/restart(api) 节点暂停 task pauseJob 节点恢复 task resumeJob 节点手工重试 task redoJobs 节点跳过 task skipJob 节点强制成功 task forceJobSuccess 新建脚本 script addScript/createScript(api) 执行脚本 script executeScript 修改脚本 script saveScript/editScript(api) 导出脚本 script exportScripts 导入脚本 script importScript 脚本语法校验 script checkSyntax 提交脚本版本 script addNewVersion 抢脚本锁 script acquireScriptLock 解脚本锁 script releaseScriptLock 批量解脚本锁 script batchReleaseScriptLock 批量删除脚本 script deleteDirectoryList 移动脚本 script move 创建目录 directory createDirectory 修改目录 directory modifyDirectory 删除目录 directory deleteDirectoryByPath 移动目录 directory move 批量删除目录 directory deleteDirectoryList 创建数据连接 dataWarehouse createDataWarehouse 测试数据连接 dataWarehouse testDataWarehouseConnectivity 更新数据连接 dataWarehouse updateDataWarehouse 删除数据连接 dataWarehouse deleteDataWarehouse 导出数据连接 dataWarehouse exportConnection 导入数据连接 dataWarehouse importConnection 创建数据库 dataWarehouse createDatabase 更新数据库 dataWarehouse updateDatabase 删除数据库 dataWarehouse deleteDatabase 创建数据表 dataWarehouse createDataTable 更新数据表 dataWarehouse updateDataTable 删除数据表 dataWarehouse deleteDataTable 创建schema dataWarehouse createSchema 删除schema dataWarehouse deleteSchema 更新schema dataWarehouse updateSchema 创建通知 alarmRule createAlarmRules 创建并更新通知 alarmRule createAndUpdateAlarmRules 删除通知 alarmRule deleteAlarmRules 更新通知 alarmRule updateAlarmRules 创建资源 dataResource createResource 更新资源 dataResource updateResource 删除资源 dataResource deleteResources 导出资源 dataResource exportResource 导入资源 dataResource importResource 批量删除资源 dataResource deleteDirectoryList 新建标签 tag create 删除标签 tag delete 导出标签 tag exportJobTags OBS导入标签 tag importJobTag 本地导入标签 tag importJobTag2 保存环境变量 environmentVariable saveEnvParams 删除环境变量 environmentVariable deleteEnvParams 导出环境变量 environmentVariable exportEnvParams 导入环境变量 environmentVariable importEnvParams 更新空间配置项 workspaceConfig updateWorkSpaceConfigs 上传文件 file uploadFile 配置空间委托 agency saveAgency 保存敏感变量 sensitiveParam saveSensitiveParam 更新敏感变量 sensitiveParam updateSensitiveParam 删除敏感变量 sensitiveParam deleteSensitiveParam 新建cdm连接 createConnection cdmConnection 更新cdm连接 updateConnection cdmConnection 删除cdm连接 deleteConnection cdmConnection 发送httpTrigger消息 sendMessage httpTriggerMessage 父主题: 支持云审计的关键操作
  • 前提条件 元数据采集支持丰富的数据源类型,对于DWS、DLI、MRS HBase、MRS Hive、RDS(MySQL)、RDS(PostgreSQL)和ORACLE类型的数据源,首先需要在管理中心创建数据连接。如需采集其他数据源(如OBS、CSS、GES等)元数据,无需在管理中心创建数据连接。 采集Hudi元数据前,需要先在Hudi表开启“同步hive表配置”,然后才能通过采集MRS Hive元数据的方式采集Hudi表的元数据。
  • 新建转换器 CDM支持字段内容转换,如果需要可单击操作列下,进入转换器列表界面,再单击“新建转换器”。 图2 新建转换器 CDM可以在迁移过程中对字段进行转换,目前支持以下字段转换器: 脱敏 隐藏字符串中的关键信息,例如要将“12345678910”转换为“123****8910”,则配置如下: “起始保留长度”为“3”。 “结尾保留长度”为“4”。 “替换字符”为“*”。 去前后空格 自动去字符串前后的空值,不需要配置参数。 字符串反转 自动反转字符串,例如将“ABC”转换为“CBA”,不需要配置参数。 字符串替换 替换字符串,需要用户配置被替换的对象,以及替换后的值。 去换行 将字段中的换行符(\n、\r、\r\n)删除。 表达式转换 数据进行转换过程中,替换内容包含特殊字符时,需要先使用\将该字符转义成普通字符。 表达式支持以下两个环境变量: 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")
  • 新增字段 您可以单击字段映射界面的选择“添加新字段”自定义新增字段,通常用于标记数据库来源,以确保导入到目的端数据的完整性。 图1 字段映射 目前支持以下类型自定义字段: 常量 常量参数即参数值是固定的参数,不需要重新配置值。例如“lable”=“friends”用来标识常量值。 变量 您可以使用时间宏、表名宏、版本宏等变量来标记数据库来源信息。变量的语法:${variable},其中“variable”指的是变量。例如“input_time”=“${timestamp()}”用来标识当前时间的时间戳。 表达式 您可以使用表达式语言根据运行环境动态生成参数值。表达式的语法:#{expr},其中“expr”指的是表达式。例如“time”=“#{DateUtil.now()}”用来标识当前日期字符串。
  • 操作场景 作业参数配置完成后,将进行字段映射的配置,您可以通过字段映射界面的可自定义新增字段,也可单击操作列下创建字段转换器。 如果是文件类数据源(FTP/SFTP/HDFS/OBS)之间相互迁移数据,且源端“文件格式”配置为“二进制格式”(即不解析文件内容直接传输),则没有字段映射这一步骤。 其他场景下,CDM会自动匹配源端和目的端数据表字段,需用户检查字段映射关系和时间格式是否正确,例如:源字段类型是否可以转换为目的字段类型。 自动创表场景下,需在目的端表中提前手动新增字段,再在字段映射里新增字段。
  • 约束限制 作业源端开启“使用SQL语句”参数时不支持配置转换器。 如果在字段映射界面,CDM通过获取样值的方式无法获得所有列(例如从HBase/CloudTable/MongoDB导出数据时,CDM有较大概率无法获得所有列),则可以单击后选择“添加新字段”来手动增加,确保导入到目的端的数据完整。 关系数据库、Hive、MRS Hudi及DLI做源端时,不支持获取样值功能。 SQLServer作为目的端数据源时,不支持timestamp类型字段的写入,需修改为其他时间类型字段写入(如datetime)。 当作业源端为OBS、迁移CSV文件时,并且配置“解析首行为列名”参数的场景下显示列名。 当使用二进制格式进行文件到文件的迁移时,没有字段映射这一步。 自动创表场景下,需在目的端表中提前手动新增字段,再在字段映射里新增字段。 添加完字段后,新增的字段在界面不显示样值,不会影响字段值的传输,CDM会将字段值直接写入目的端。 如果字段映射关系不正确,您可以通过拖拽字段、单击对字段批量映射两种方式来调整字段映射关系。 如果是导入到数据仓库服务(DWS),则还需在目的字段中选择分布列,建议按如下顺序选取分布列: 有主键可以使用主键作为分布列。 多个数据段联合做主键的场景,建议设置所有主键作为分布列。 在没有主键的场景下,如果没有选择分布列,DWS会默认第一列作为分布列,可能会有数据倾斜风险。 如CDM不支持源端迁移字段类型,请参见不支持数据类型转换规避指导将字段类型转换为CDM支持的类型。
  • 创建动态水印策略 在DataArts Studio控制台首页,选择实例,单击“进入控制台”,选择对应工作空间的“数据安全”模块,进入数据安全页面。 图1 选择数据安全 单击左侧导航树中的“动态水印”,进入动态水印页面。 图2 进入动态水印页面 单击,开启数据开发动态水印功能。然后单击“新建”,进入新建动态水印策略页面,参数配置参考表1。 图3 新建动态水印策略参数配置 创建动态水印策略参数配置说明: 表1 配置策略参数 参数名 参数说明 *策略名称 动态水印策略的唯一标识,DataArts Studio实例内的名称唯一。 为便于策略管理,建议名称中标明要添加水印的对象和水印内容。 *数据源类型 从下拉列表中选择MRS Hive数据源或MRS Spark数据源。 *数据连接 从下拉列表中选择数据连接类型中已创建的数据连接,若未创建请参考新建数据连接新建连接。 *集群名称 无需选择,自动匹配数据连接中的数据源集群。 *数据库 选择敏感数据所在的数据库。 *数据表 选择敏感数据所在的数据表。 *用户组/角色 指定当前工作空间成员中的用户、用户组或角色。当指定对象在数据开发组件中查询或导出敏感数据时,系统会对敏感数据添加动态水印,保护敏感数据不被泄露。 单击“确定”,完成动态水印策略创建。
  • 相关操作 水印提取:获得从数据开发下载的动态水印CSV数据文件后,参考水印提取进行水印溯源。 配置策略:在动态水印页面,单击对应任务操作栏中的“配置”,即可配置动态水印策略。 编辑策略状态:新增的水印策略默认为启用状态。当水印策略为关闭状态时,表示该策略将不生效。 需要修改水印策略状态时,在动态水印页面单击对应水印策略中的或,即可启用或关闭水印策略。 删除策略:在动态水印页面,单击对应任务操作栏中的“删除”,即可删除策略。当需要批量删除时,可以在勾选策略后,在列表上方单击“删除”。 删除操作无法撤销,请谨慎操作。 查看策略详情:在动态水印页面,找到需要查看的策略,单击策略名即可查看策略详情。 图4 查看策略详情
  • 约束与限制 仅DAYU Administrator、Tenant Administrator用户或者数据安全管理员可以开启或关闭数据开发动态水印功能,至少为工作空间管理员角色才可以创建动态水印策略,其他普通用户无权限操作。 当前动态水印策略仅支持MRS Hive和MRS Spark数据源。 新增、删除或修改动态水印策略后,需要约5分钟后才能生效。 仅当转储或下载数据量大于500行时,系统才会进行水印嵌入。如果数量小于等于500行,即使嵌入水印后也难以溯源。
  • 查看监控指标数据 以采集弹性云服务器的监控指标为例,查看弹性云服务器对应的命名空间、指标ID、维度的Key和Value。 在支持监控的服务列表页面查看对应的监控指标参考文档。 在参考文档中查看命名空间,弹性云服务器对应的命名空间为“SYS.ECS”。 查看监控指标的指标ID和测量对象(维度),例如监控指标CPU使用率的指标ID为“cpu_util”,测量对象为“云服务器”。 查看维度的Key和Value,云服务器维度的Key和Value分别为instance_id和云服务器ID。
  • 操作流程 具体操作流程如图1所示。 图1 操作流程 服务环境配置 (可选)账号录入:如果需要将其他账号下的华为云资源接入至AppStage进行管理,可以将华为云账号录入AppStage。 环境配置:创建并启用环境,并通过环境配置将服务与环境进行关联。 企业项目配置:通过AppStage平台申请对应服务华为云账号下的资源时,需要获取租户的EPS。 资源接入 VPC接入:资源接入AppStage前需要先打通网络,通过纳管VPC实现VPC下资源的网络连通。 主机接入:AppStage运维中心支持纳管主机,对主机进行统一管理,包括主机资源发放/回收/操作、OS管理、密码密钥管理等。 数据库接入:AppStage运维中心支持纳管数据库,对数据库进行统一管理,包括数据库台账、自动化SQL变更、数据查询、自动化数据提取、性能分析、负载分析、数据库风险诊断等。 容器集群接入:AppStage运维中心支持纳管CCE容器集群,对CCE容器集群进行统一管理,包括资源池监控、访问安全控制、任务调度、业务负载弹性伸缩和多种K8s扩展等。 数据接入 虚拟机日志接入:支持通过部署filebeat完成虚拟机日志采集。日志接入后,可以对日志进行检索,查看已接入日志,具体操作请参见日志检索。 容器日志接入:支持将容器日志接入AppStage运维中心。日志接入后,可以对日志进行检索,查看已接入日志,具体操作请参见日志检索。 主机监控接入:支持定义服务的监控模板,然后通过为主机绑定监控模板,采集主机监控数据。 CES指标接入:支持将云监控服务CES采集的监控指标数据接入至AppStage运维中心,如需将CES生成的告警接入AppStage运维中心,可参考CES告警接入操作。 运维监控 指标开发:对已产生或接入的数据进行指标开发。 监控报表开发:对已创建的指标或视图数据进行业务报表开发,配置后可以查看业务报表监控,具体操作请参见查看业务报表。 告警配置:支持对虚拟机监控数据或业务数据配置告警,及时掌握虚拟机状态,容器接入并安装监控插件后会自动生成告警。告警配置后可以查看告警,并及时处理告警问题,具体操作请参见查看告警。
  • 调优策略 最常见告警 长时间低(高)于阈值线告警,如图1所示。 图1 常见告警 告警进入条件:一般8分钟内有7个点异常告警进入。 告警退出条件:20分钟内有18个点正常则告警退出。 调优方法: 调节sensitivity敏感度参数,可以使小幅度下降的异常不告警,针对阈值线过紧的情况,图1的异常通过敏感度调节不了,因为阈值线相对是合理的 配置count_threshold参数,如果不关注请求量很少的异常,可以配置该参数,建议非必要情况下不要配置该参数,可能会出现遗漏告警的情况。 毛刺告警 两三个显著的毛刺点异常,如图2所示。 图2 毛刺告警 告警进入条件:穿过阈值线的毛刺异常程度,最快在第2个毛刺点告警。 告警退出条件:20分钟内有18个点正常则告警退出。 调优方法: 如果对请求量很少的接口,毛刺异常不关注,可以配置low_count_threshold参数,如图2中告警的曲线请求量不超过30,可以配置改参数为30。 如果不管请求量多少,都不需要毛刺类告警,则可以配置alert_by_spikes参数。毛刺类告警最快可以将告警时间缩短为2分钟,如果屏蔽掉这类告警,则按照其他的告警类型会有一定的延迟(一般7分钟)。 突变告警 突变告警只针对请求量类指标,特点是请求量曲线发生突变(突增或者突降)同时指标曲线没有触及阈值线,如图3所示。 图3 突变告警 告警进入条件:局部看曲线发生突变(默认突变20%),或者长期看相比历史降低或升高。 告警退出条件:数据平稳后告警退出,一般会持续18分钟。 调优方法: 通过配置alert_by_chain参数可以控制是否加入突变检测。突变告警可以防止阈值线学习宽松条件下指标突变的漏告警,但对于不关注阈值线之上数据突变的指标会产生一些不必要的告警。 波动性告警 波动性告警只针对非请求量类指标,这类告警的特点是指标曲线没有触及阈值线,如图4所示。 图4 波动性告警 告警进入条件:局部看曲线波动变大,或者长期看相比历史数据持续降低或升高。 告警退出条件:数据恢复到历史同期水平,持续18分钟则告警退出。 调优方法: 对于小幅度的波动和下降(上升)告警可以通过调节sensitivity敏感度来减少部分告警。 如果不关注这类异常,可以通过配置alert_by_std参数来实现。波动性告警可以防止阈值线学习宽松条件下指标小幅波动的漏告警,但对于不关注阈值线之上数据波动的指标会产生一些不必要的告警。 长时间掉0告警 长时间掉0告警只针对请求量类指标,特点是阈值线为0,测量值长时间掉0,如图5所示。 图5 长时间掉0告警 告警进入条件:历史同时期没有掉0,或者掉0时间持续28分钟。 告警退出条件:数据恢复到正常水平则告警退出。 调优方法: 如果这类告警频繁出现,可以通过配置alert_by_drop_to_0参数屏蔽。长时间掉0告警可以防止阈值线为零的情况下指标长时间掉零的漏告警。
  • 配置方法 在“异常检测”页面,单击异常检测任务所在行“操作”列的“模型”,默认显示“算法配置”页签,参考表1配置参数。 表1 算法配置参数说明 参数名称 参数含义 取值范围 参数说明 配置建议 metric_type 指标类型 success_rate(成功率) fail_rate(失败率) count(请求量,做上下限告警) speed(速率) delay(时延) count_lowerlimit(请求量,做下限告警) count_upperlimit(请求量,做上限告警) 按照实际的指标类型选择该参数,对于请求量类指标,做下限告警的选择count_lowerlimit,不要选择count。 - sensitivity 敏感度 0-10 默认值5 敏感度参数越高,阈值线越紧;敏感度参数越低,阈值线越松。 敏感度参数最高不超过5.5,最低不低于3.5;一般配置4.5或者5。 请求量指标因为使用了新的算法,敏感度可以在0.5—5之间调节。 时延、请求量、速率类指标敏感度每降低0.5,阈值线相对浮动3%,绝对浮动3。 成功率、失败率指标敏感度每降低0.5,阈值线相对浮动0.3%,绝对浮动0.3%。 low_count_threshold 小请求量 0- 100000000 默认值0 请求量低于此参数值时毛刺告警、波动性不生效;其他类型的告警依然生效。 如果毛刺告警较多,可以配置该参数。 count_threshold 请求量保护 0-100000000 默认值0 请求量低于此参数值时,完全不告警。 一般情况下不建议配置,请谨慎配置,且对请求量类指标不生效。 no_model_threshold_upper 无模型阈值上限 0-100000000 默认值100000000 无模型时配置的阈值上限(固定阈值线)。 对于新增的接口,因为没有历史数据,无法训练出该接口的模型,此时可以配置合适的值用来监控此类接口。 no_model_threshold_lower 无模型阈值下限 0-100000000 默认值0 无模型时配置的阈值下限(固定阈值线)。 对于新增的接口,因为没有历史数据,无法训练出该接口的模型,此时可以配置合适的值用来监控此类接口。 alert_by_std 波动性告警 True/False 默认为True 非请求量类指标参数,通过该参数设置是否引入波动性告警。 - alert_by_chain 突变告警 True/False 默认为True 请求量类指标参数,通过该参数设置是否引入突变告警。 - alert_by_drop_to_0 长时间掉0告警 True/False 默认为True 请求量类指标参数,通过该参数设置是否引入长时间掉0告警。 - alert_by_spikes 毛刺告警 True/False 默认为True 所有指标参数,通过该参数设置是否引入毛刺告警。 -
  • 更多操作 您还可以对Druid汇聚任务进行以下操作。 表1 Druid汇聚任务管理 操作名称 操作步骤 编辑任务 在Druid汇聚任务列表中,单击待编辑的任务所在行“操作”列的“编辑”。 编辑任务后,单击“更新任务”。 撤销申请 在Druid汇聚任务列表中,单击待撤销申请的任务所在行“操作”列的“编辑”。 单击“撤销申请”。 停止任务 在Druid汇聚任务列表中,单击待停止的任务所在行“操作”列的“停止”。 删除任务 在Druid汇聚任务列表中,单击待删除的任务所在行“操作”列的“删除”。 补数据 在Druid汇聚任务列表中,单击待补数据的任务所在行“操作”列的“补数据”。 查看操作历史 在Druid汇聚任务列表中,单击待查看操作历史的任务所在行“操作”列的“操作历史”。 查看历史记录 在Druid汇聚任务列表中,单击待查看历史记录的任务所在行“操作”列的“历史记录”。 查看执行计划 在Druid汇聚任务列表中,单击待查看执行计划的任务所在行“操作”列的“执行计划”。 查看任务详情 在Druid汇聚任务列表中,单击待查看详情的任务所在行“操作”列的“详情”。
共100000条