华为云用户手册

  • 背景信息 原子指标来源于事实表和维度表: 原子指标是为了构建应用统计分析所需的衍生指标,而定义的数据组件,因此可以基于事实逻辑表明细数据表来创建,也可以基于维度表来创建。 衍生指标无来源表,它归属于每个组合成它的原始的原子指标的来源表。 原子指标与衍生指标的关系: 原子指标的计算逻辑修改生效后,会直接更新应用于相关的衍生指标。 原子指标删除英文名,需要校验下游是否有衍生指标使用,如果有,则无法删除。 目前原子指标在被下游使用的情况下,支持变更英文名。 原子指标的更改会影响下游衍生指标。
  • 函数说明 新建原子指标时,需要按照函数设定表达式。以聚合函数的部分函数为例,函数说明如表3所示: 表3 聚合函数说明 函数名 表达式 函数说明 avg(col) avg() 求平均值。 corr(col1, col2) corr() 返回两列数值的相关系数。 count(*) count() 返回记录条数。 covar_pop(col1, col2) covar_pop() 返回两列数值协方差。 covar_samp(col1, col2) covar_samp() 返回两列数值样本协方差。 max(col) max() 返回最大值。 min(col) min() 返回最小值。 stddev_pop(col) stddev_pop() 返回指定列的偏差。 stddev_samp(col) stddev_samp() 返回指定列的样本偏差。 sum(col) sum() 求和。 var_samp(col) var_samp() 返回指定列的样本方差。 如果想要查询更多函数的功能及说明,可以在新建原子指标页面的基本信息中的设定表达式项,单击对应函数,在页面右侧的函数说明框中会显示对应的函数说明。 图4 函数说明
  • 编辑复合指标 在数据架构控制台,单击左侧导航树的“技术指标”,然后选择“复合指标”页签,进入复合指标页面。 图2 复合指标 在复合指标列表中,找到需要编辑的复合指标,单击“编辑”,进入“编辑复合指标”页面。 根据实际需要修改配置参数。参数说明请参见表1。 在页面下方,单击“试运行”按钮,然后在弹出框中单击“试运行”按钮,测试所设置的复合指标是否可以正常运行。 如果试运行失败,请根据错误提示定位错误原因,将配置修改正确后,再单击“试运行”按钮进行重试。 如果试运行成功,单击“发布”,提交发布审核。 在弹出框中单击“确认提交”,提交审核。
  • 通过逆向数据库导入事实表 通过逆向数据库,您可以从其他数据源中将一个或多个已创建的数据库表导入到事实表目录中,使其变成事实表。 在数据架构控制台,单击左侧导航树中的“维度建模”,进入维度建模页面。 在事实表的列表上方,单击“逆向数据库”。 在“逆向数据库”对话框中,配置如下参数,然后单击“确定”。 表4 逆向数据库配置 参数名称 说明 *所属主题 在下拉列表中选择所属主题。 *数据连接类型 在下拉列表中将显示逆向数据库支持的数据连接类型,请选择所需要的数据连接类型。 *数据连接 选择数据连接。 如需从其他数据源逆向数据库到事实表目录中,需要先在 DataArts Studio 管理中心创建一个数据连接,以便连接数据源。创建数据连接的操作,请参见配置DataArts Studio数据连接参数。 *数据库 选择数据库。 *Schema 下拉选择Schema。该参数仅DWS和POSTGRESQL模型的表有效。 队列 DLI 队列。仅当“数据连接类型”选择“DLI”时,该参数有效。 更新已有表 如果从其他数据源逆向过来的表,在事实表中已存在同名的表,选择是否更新已有的事实表。 名称来源 逆向后表名称/字段名称的来源,可以是描述或者是相应英文名,如表/字段未指定描述则固定使用英文名。 来自描述 来自英文名称 *数据表 选择全部或部分需导入的数据表。 图15 逆向配置 逆向数据库的结果会在“上次逆向”页面中显示。如果逆向成功,单击“关闭”。如果逆向失败,您可以查看失败原因,问题解决后,选中失败的表,然后单击“重新逆向”进行重试。 图16 逆向结果
  • 逆向数据库导入表到维度模型中 在DataArts Studio控制台首页,选择对应工作空间的“数据架构”模块,进入数据架构页面。 在DataArts Studio数据架构控制台,单击左侧导航栏的“维度建模”进入维度建模页面。 打开需要逆向数据库导入的维度或表的页签,从下拉列表选择需要逆向数据库的维度或表,然后单击列表上方的“逆向数据库”。 图1 选中对象 在“逆向数据库”对话框中配置参数。 表1 逆向数据库 参数名称 说明 所属主题 单击“选择主题”按钮选择所属的主题信息。 数据连接类型 选择维度建模的逆向数据库。 数据连接 选择所需要的数据连接。 如需从其他数据源逆向数据库到关系模型中,需要先在DataArts Studio管理中心创建一个数据连接,以便连接数据源。创建数据连接的操作,请参见配置DataArts Studio数据连接参数。 数据库 选择数据库。 队列 仅限DLI连接类型,需选择DLI队列。 Schema DWS或POSTGRESQL的模式。该参数在DWS或POSTGRESQL连接类型有效。 更新已有表 在导入时,只有创建或更新操作,不会删除已有的表。 不更新:如果表已存在,将直接跳过,不更新。 更新:如果表已存在,更新已有的表信息。如果表处于“已发布”状态,表更新后,您需要重新发布表,才能使更新后的表生效。 名称来源 逆向后表名称/字段名称的来源,可以是描述或者是相应英文名,如表/字段未指定描述则固定使用英文名。 来自描述 来自英文名称 数据表 选择“全部”时,将数据库中的所有的表都导入。 选择“部分”时,请选择需要导入的表。 单击“确定”开始执行逆向数据库操作。等待操作执行完成,即可在“上次逆向”中查看结果或者执行重新逆向操作。
  • 管理码表 建立好码表后,可以对码表进行查找、编辑、下线或发布等操作。 在数据架构控制台,单击左侧导航树中的“码表管理”,进入码表管理页面。您可以对码表进行管理。 普通空间均可查询到“公共层空间”目录下创建的码表,“公共层空间”无法反向查询到普通空间目录下创建的码表。 普通空间仅对本空间内创建的码表和目录有编辑权限,不支持对“公共层空间”的码表和其所属的目录进行操作,仅能查看引用。 图13 码表管理 编辑 在码表列表中,找到所需要的码表,单击其所在行的“编辑”,即可编辑指定的码表。 发布 在码表列表中,对于状态为“草稿”或“已驳回”的码表,单击其所在行的“发布”,并在弹出框中选择审核人并单击“确认提交”,即可发布该码表提交审核。等待审核人员审核通过后,码表就发布成功了。如果当前用户已被添加为审核人,则可以勾选“自助审批”,单击“确认提交”后,码表状态显示为“已发布”。 下线 在码表列表中,对于状态为“已发布”的码表,单击其所在行的“更多-下线”,并在弹出框中选择审核人并单击“确认提交”,即可提交下线申请。等待审核人员审核通过后,码表就下线成功了。 填写数值 在码表列表中,找到所需要的码表,单击其所在行的“更多-填写数值”,可以快速设置各字段的值。 发布历史 在码表列表中,找到所需要的码表,单击其所在行的“更多-发布历史”,可以查看码表的发布历史和变更详情,并支持进行版本对比。
  • 通过逆向数据库导入码表 通过逆向数据库,您可以从其他数据源中将一个或多个已创建的数据库表导入到码表目录中,使其变成码表。 在数据架构控制台,单击左侧导航树中的“码表管理”,进入码表管理页面。 在左侧的码表目录树中,选中一个目录,然后在码表列表上方,单击“逆向数据库”。 在“逆向数据库”对话框中,配置如下参数,然后单击“确定”。 表5 逆向数据库配置 参数名称 说明 *数据连接类型 在下拉列表中将显示逆向数据库支持的数据连接类型,请选择所需要的数据连接类型。 *数据连接 选择数据连接。 如需从其他数据源逆向数据库到码表目录中,需要先在DataArts Studio管理中心创建一个数据连接,以便连接数据源。创建数据连接的操作,请参见配置DataArts Studio数据连接参数。 *数据库 选择数据库。 *Schema 下拉选择Schema。该参数仅DWS和POSTGRESQL模型的表有效。 队列 DLI队列。仅当“数据连接类型”选择“DLI”时,该参数有效。 更新已有表 如果从其他数据源逆向过来的表,在码表中已存在同名的表,选择是否更新已有的码表。 名称来源 逆向后表名称/字段名称的来源,可以是描述或者是相应英文名,如表/字段未指定描述则固定使用英文名。 来自描述 来自英文名称 逆向表数据 不逆向:逆向数据库时,将表导入到码表目录中,但是不导入表数据。您可以在完成逆向数据库后,参考填写数值到码表中添加记录到码表中。 覆盖:逆向数据库时,将表导入到码表目录中,同时将表数据导入到该码表中。 *数据表 选择一个或多个需导入的数据表。 图8 逆向配置 逆向数据库的结果会在“上次逆向”页面中显示。如果逆向成功,单击“关闭”。如果逆向失败,您可以查看失败原因,问题解决后,选中失败的表,然后单击“重新逆向”进行重试。 图9 逆向结果
  • 模型设计方法概述 根据业务需求抽取信息的主要特征,模拟和抽象出一个能够反映业务信息(对象)之间关联关系的模型,即数据模型。数据模型也是可视化的展现企业内部信息如何组织的蓝图。数据模型应满足三方面要求:能比较真实地模拟业务(场景);容易被人所理解;便于在IT系统中实现。 在DataArts Studio数据架构的数据建模过程中,用到的建模方法主要有以下三种: 关系建模 关系建模是用实体关系(Entity Relationship,ER)模型描述企业业务,它在范式理论上符合3NF,出发点是整合数据,将各个系统中的数据以整个企业角度按主题进行相似性组合和合并,并进行一致性处理,为数据分析决策服务,但是并不能直接用于分析决策。 用户在关系建模过程中,可以从数仓规划去设计物理模型。 物理模型:是在逻辑数据模型的基础上,考虑各种具体的技术实现因素,进行数据库体系结构设计,真正实现数据在数据库中的存放,例如:所选的 数据仓库 是DWS或 MRS _Hive。 维度建模 维度建模是从分析决策的需求出发构建模型,它主要是为分析需求服务,因此它重点关注用户如何更快速地完成需求分析,同时具有较好的大规模复杂查询的响应性能。 多维模型是由数字型度量值组成的一张事实表连接到一组包含描述属性的多张维度表,事实表与维度表通过主/外键实现关联。典型的维度模型有星形模型,以及在一些特殊场景下使用的雪花模型。 数据集市 又称为DM(Data Mart),DM面向展现层,数据有多级汇总,由一个特定的分析对象及其相关的统计指标组成的,向用户提供了以统计粒度为主题的所有统计数据。 在DataArts Studio数据架构中,维度建模是以维度建模理论为基础,抽象出事实和维度,构建维度模型和事实模型,同时对报表需求进行抽象整理出相关指标体系,通过数据集市构建出汇总模型。
  • 数据架构总览 在DataArts Studio控制台首页,选择对应工作空间的“数据架构”模块,进入数据架构页面,查看“总览”,如图1所示。 图1 数据架构总览 我的待办 显示“我的申请”和“待我审核”的数量。 单击每一项上面统计数量将分别跳转到“我的申请”和“待我审核”页面。 资产概览 显示数据架构中所有对象的总量。 单击每个对象名称后的统计数量将跳转到该对象的管理页面。 快捷入口 显示数据架构 数据治理 方法的整体流程。单击流程下的具体操作,可以跳转到对应的界面。 数据架构流程 显示数据架构流程以及与DataArts Studio其他模块间的交互关系。关于数据架构流程的详细描述,请参见数据架构使用流程。 将鼠标移至流程图上的对象名称之上,页面上将显示对象的描述信息。 对于DataArts Studio已支持的对象,单击对象名称,可跳转至该对象的管理页面。
  • Tomcat日志 日志样例: 11-Jan-2018 09:00:06.907 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux 正则表达式为: ^(\d.*\d) (\w*) \[(.*)\] ([\w\.]*) (\w.*).* 解析结果如下: 表3 Tomcat日志解析结果 列号 样值 1 11-Jan-2018 09:00:06.907 2 INFO 3 main 4 org.apache.catalina.startup.VersionLoggerListener.log 5 OS Name:Linux
  • Apache server日志 日志样例: [Mon Jan 08 20:43:51.854334 2018] [mpm_event:notice] [pid 36465:tid 140557517657856] AH00489: Apache/2.4.12 (Unix) OpenSSL/1.0.1t configured -- resuming normal operations 正则表达式为: ^\[(.*)\] \[(.*)\] \[(.*)\] (.*).* 解析结果如下: 表5 Apache server日志解析结果 列号 样值 1 Mon Jan 08 20:43:51.854334 2018 2 mpm_event:notice 3 pid 36465:tid 140557517657856 4 AH00489: Apache/2.4.12 (Unix) OpenSSL/1.0.1t configured -- resuming normal operations
  • Django日志 日志样例: [08/Jan/2018 20:59:07 ] settings INFO Welcome to Hue 3.9.0 正则表达式为: ^\[(.*)\] (\w*) (\w*) (.*).* 解析结果如下: 表4 Django日志解析结果 列号 样值 1 08/Jan/2018 20:59:07 2 settings 3 INFO 4 Welcome to Hue 3.9.0
  • Log4J日志 日志样例: 2018-01-11 08:50:59,001 INFO [org.apache.sqoop.core.SqoopConfiguration.configureClassLoader(SqoopConfiguration.java:251)] Adding jars to current classloader from property: org.apache.sqoop.classpath.extra 正则表达式为: ^(\d.*\d) (\w*) \[(.*)\] (\w.*).* 解析出的结果如下: 表1 Log4J日志解析结果 列号 样值 1 2018-01-11 08:50:59,001 2 INFO 3 org.apache.sqoop.core.SqoopConfiguration.configureClassLoader(SqoopConfiguration.java:251) 4 Adding jars to current classloader from property: org.apache.sqoop.classpath.extra
  • Log4J审计日志 日志样例: 2018-01-11 08:51:06,156 INFO [org.apache.sqoop.audit.FileAuditLogger.logAuditEvent(FileAuditLogger.java:61)] user=sqoop.anonymous.user ip=189.xxx.xxx.75 op=show obj=version objId=x 正则表达式为: ^(\d.*\d) (\w*) \[(.*)\] user=(\w.*) ip=(\w.*) op=(\w.*) obj=(\w.*) objId=(.*).* 解析结果如下: 表2 Log4J审计日志解析结果 列号 样值 1 2018-01-11 08:51:06,156 2 INFO 3 org.apache.sqoop.audit.FileAuditLogger.logAuditEvent(FileAuditLogger.java:61) 4 sqoop.anonymous.user 5 189.xxx.xxx.75 6 show 7 version 8 x
  • 指定文件名迁移 从FTP/SFTP/OBS导出文件时, CDM 支持指定文件名迁移,用户可以单次迁移多个指定的文件(最多50个),导出的多个文件只能写到目的端的同一个目录。 在创建表/文件迁移作业时,如果源端数据源为FTP/SFTP/OBS,CDM源端的作业参数“源目录或文件”支持输入多个文件名(最多50个),文件名之间默认使用“|”分隔,您也可以自定义文件分隔符,从而实现文件列表迁移。 迁移文件或对象时支持文件级增量迁移(通过配置跳过重复文件实现),但不支持断点续传。 例如要迁移3个文件,第2个文件迁移到一半时由于网络原因失败,再次启动迁移任务时,会跳过第1个文件,从第2个文件开始重新传,但不能从第2个文件失败的位置重新传。 文件迁移时,单个任务支持千万数量的文件,如果待迁移目录下文件过多,建议拆分到不同目录并创建多个任务。 父主题: 关键操作指导
  • MD5校验文件一致性 CDM数据迁移以抽取-写入模式进行,CDM首先从源端抽取数据,然后将数据写入到目的端。在迁移文件到OBS时,迁移模式如图1所示。 图1 迁移文件到OBS 在这个过程中,CDM支持使用MD5检验文件一致性。 抽取时 该功能支持源端为OBS、HDFS、FTP、SFTP、HTTP。可校验CDM抽取的文件,是否与源文件一致。 该功能由源端作业参数“MD5文件名后缀”控制(“文件格式”为“二进制格式”时生效),配置为源端文件系统中的MD5文件名后缀。 当源端数据文件同一目录下有对应后缀的保存md5值的文件,例如build.sh和build.sh.md5在同一目录下。若配置了“MD5文件名后缀”,则只迁移有MD5值的文件至目的端,没有MD5值或者MD5不匹配的数据文件将迁移失败,MD5文件自身不被迁移。 若未配置“MD5文件名后缀”,则迁移所有文件。 写入时 该功能目前只支持目的端为OBS。可校验写入OBS的文件,是否与CDM抽取的文件一致。 该功能由目的端作业参数“校验MD5值”控制,读取文件后写入OBS时,通过HTTP Header将MD5值提供给OBS做写入校验,并将校验结果写入OBS桶(该桶可以不是存储迁移文件的桶)。如果源端没有MD5文件则不校验。 迁移文件到文件系统时,目前只支持校验CDM抽取的文件是否与源文件一致(即只校验抽取的数据)。 迁移文件到OBS时,支持抽取和写入文件时都校验。 如果选择使用MD5校验,则无法使用KMS加密。 父主题: 关键操作指导
  • AES-256-GCM加密 目前只支持AES-256-GCM(NoPadding)。该加密算法在目的端为加密,在源端为解密,支持的源端与目的端数据源如下。 源端支持的数据源:HDFS(使用二进制格式传输时支持)。 目的端支持的数据源:HDFS(使用二进制格式传输时支持)。 下面分别以HDFS导出加密文件时解密、导入文件到HDFS时加密为例,介绍AES-256-GCM加解密的使用方法。 源端配置解密 创建从HDFS导出文件的CDM作业时,源端数据源选择HDFS、文件格式选择二进制格式后,在“源端作业配置”的“高级属性”中,配置如下参数。 加密方式:选择“AES-256-GCM”。 数据加密 密钥:这里的密钥必须与加密时配置的密钥一致,否则解密出来的数据会错误,且系统不会提示异常。 初始化向量:这里的初始化向量必须与加密时配置的初始化向量一致,否则解密出来的数据会错误,且系统不会提示异常。 这样CDM从HDFS导出加密过的文件时,写入目的端的文件便是解密后的明文文件。 目的端配置加密 创建CDM导入文件到HDFS的作业时,目的端数据源选择HDFS、文件格式选择二进制格式后,在“目的端作业配置”的“高级属性”中,配置如下参数。 加密方式:选择“AES-256-GCM”。 数据加密密钥:用户自定义密钥,密钥由长度64的十六进制数组成,不区分大小写但必须64位,例如“DD0AE00DFECD78BF051BCFDA25BD4E320DB0A7AC75A1F3FC3D3C56A457DCDC1B”。 初始化向量:用户自定义初始化向量,初始化向量由长度32的十六进制数组成,不区分大小写但必须32位,例如“5C91687BA886EDCD12ACBC3FF19A3C3F”。 这样在CDM导入文件到HDFS时,目的端HDFS上的文件便是经过AES-256-GCM算法加密后的文件。
  • KMS加密 源端解密不支持KMS。 CDM目前只支持导入文件到OBS时,目的端使用KMS加密,表/文件迁移和整库迁移都支持。在“目的端作业配置”的“高级属性”中配置。 KMS密钥需要先在数据加密服务创建,具体操作请参见《数据加密服务 用户指南》。 当启用KMS加密功能后,用户上传对象时,数据会加密成密文存储在OBS。用户从OBS下载加密对象时,存储的密文会先在OBS服务端解密为明文,再提供给用户。 如果选择使用KMS加密,则无法使用MD5校验一致性。 如果这里使用其它项目的KMS ID,则需要修改“项目ID”参数为KMS ID所属的项目ID;如果KMS ID与CDM在同一个项目下,“项目ID”参数保持默认即可。 使用KMS加密后,OBS上对象的加密状态不可以修改。 使用中的KMS密钥不可以删除,如果删除将导致加密对象不能下载。
  • 事务模式迁移 CDM的事务模式迁移,是指当CDM作业执行失败时,将数据回滚到作业开始之前的状态,自动清理目的表中的数据。 参数位置:创建表/文件迁移的作业时,如果目的端为关系型数据库,在目的端作业配置的高级属性中,可以通过“先导入阶段表”参数选择是否启用事务模式。 参数原理:如果启用,在作业执行时CDM会自动创建临时表,先将数据导入到该临时表,导入成功后再通过数据库的事务模式将数据迁移到目标表中;导入失败则将目的表回滚到作业开始之前的状态。 图1 事务模式迁移 如果“导入开始前”选择“清除部分数据”或“清除全部数据”,CDM的事务模式不会回滚已经删除的数据。 父主题: 关键操作指导
  • 操作步骤 登录CDM管理控制台。单击左侧导航上的“集群管理”,进入集群管理界面。 图1 集群列表 “创建来源”列仅通过DataArts Studio服务进入数据集成界面可以看到。 单击集群名称后,选择“标签”页签。 图2 修改集群配置 单击“添加/编辑标签”,通过添加、修改标签为CDM集群设置资源标识。 图3 添加标签 一个集群最多可添加10个标签。 标签键(key)的最大长度为36个字符,标签值(value)的最大长度为43个字符。 (可选)在标签列表中,单击标签操作列“删除”,删除CDM集群标签。 通过以下两种方式筛选出所配置标签的资源。 在标签管理服务中,选择资源搜索条件,单击“搜索”即可筛选出所配置标签的资源。 在集群列表中,单击标签搜索,筛选出所配置标签的资源。
  • 查看集群基本信息 登录CDM管理控制台。单击左侧导航上的“集群管理”,进入集群管理界面。 或参考访问DataArts Studio实例控制台,登录DataArts Studio管理控制台。在DataArts Studio控制台首页,选择对应工作空间的“数据集成”模块,进入CDM首页。 图1 集群列表 “创建来源”列仅通过DataArts Studio服务进入数据集成界面可以看到。 单击集群名称,可查看集群的基本信息。 图2 CDM集群的配置信息
  • 操作场景 CDM集群已经创建成功后,您可以查看集群基本信息,并修改集群的配置。 查看集群基本信息: 集群信息:集群版本、创建时间、项目ID、实例ID和集群ID等。 节点配置:集群规格、CPU和内存配置等信息。 网络信息:网络配置。 支持修改集群的以下配置: 消息通知 :CDM的迁移作业(目前仅支持表/文件迁移的作业)失败时,或者EIP异常时,会发送短信或邮件通知用户。该功能产生的消息通知不会计入收费项。 用户隔离:控制其他用户是否能够查看、操作该集群中的迁移作业和连接。 开启该功能时,该集群中的迁移作业、连接会被隔离,华为账号下的其他 IAM 用户无法查看、操作该集群中的迁移作业和连接。 按组批量启动作业会运行组内所有作业。如果开启了用户隔离功能,即使华为账号下的其他IAM用户无法查看到组内作业,按组批量启动作业依然会将组内作业运行,因此在用户隔离场景不建议使用按组批量启动作业功能。 关闭该功能时,该集群中的迁移作业、连接信息可以用户共享,华为账号下的所有拥有相应权限的IAM用户可以查看、操作迁移作业和连接。 注意,用户隔离关闭后需要重启集群VM才能生效。 最大抽取并发数:限制作业运行的总抽取并发数,如果当前所有作业总并发数超出限制,超出部分将排队等待。 注意,最大抽取并发数取值范围为1-1000,建议根据集群规格进行配置,建议值详见最大抽取并发数。过高的并发数可能导致内存溢出,请谨慎修改。 此处的“最大抽取并发数”参数与作业配置管理处的“最大抽取并发数”参数同步,在任意一处修改即可生效。
  • 操作场景 CDM集群创建完成后,支持解绑或绑定EIP。EIP即弹性公网IP,由虚拟私有云(Virtual Private Cloud,简称VPC)负责其计费。 如果CDM需要访问本地数据源、Internet的数据源,或者跨VPC的云服务,则必须要为CDM集群绑定一个弹性IP,或者使用NAT网关让CDM集群与其他弹性云服务器共享弹性IP访问Internet,具体操作请见添加SNAT规则。 如果用户对本地数据源的访问通道做了SSL加密,则CDM无法通过弹性IP连接数据源。
  • 适用场景 在某项目搬迁场景下,当您需要补充以前时间段内的历史业务数据,需要查看历史数据的详细信息时,可以使用补数据特性。 补数据是指作业执行一个调度任务,在过去某一段时间里生成一系列的实例。用户可以通过补数据,修正历史中出现数据错误的作业实例,或者构建更多的作业记录以便调试程序等。 补数据作业除了支持SQL脚本,其他节点也支持。 如果SQL脚本的内容有变化,补数据作业运行的是最新版本的脚本。 使用补数据功能时,如SQL中变量是DATE,脚本中就写${DATE},在作业参数中会自动增加脚本参数DATE,脚本参数DATE的值支持使用EL表达式。如果是变量时间的话,需要使用DateUtil内嵌对象的表达式,平台会自动转换成历史日期。EL表达式用法可参考EL表达式。 补数据作业除了支持作业参数,脚本参数或者全局环境变量也支持。
  • 通过For Each节点提取输出结果值 场景说明 结合For Each节点及其支持的Loop内嵌对象EL表达式#{Loop.current[0]},循环获取前一节点输出的结果值。 本例中,MRS Hive SQL节点返回多字段的二维数组,选择For Each节点和EL表达式#{Loop.current[]},再通过For Each循环调用Kafka Client节点子作业,Kafka Client节点发送的数据也定义为#{Loop.current[]},通过此配置即可获取MRS Hive SQL节点输出的结果值。 为便于查看最终获得的结果值,本例中For Each节点子作业选择Kafka Client节点进行演示。在实际使用中,您可以根据您的业务需求选择子作业节点类型,在节点任务中应用Loop内嵌对象EL表达式,即可获取For Each前一节点返回的结果值。 For Each节点主作业编排如图5所示。其中,For Each节点的关键配置如下: 数据集:数据集就是HIVE SQL节点的Select语句的执行结果。使用EL表达式#{Job.getNodeOutput("select95")},其中select95为前一个节点的名称。 子作业参数:子作业参数是子作业中定义的参数名,然后在主作业中定义的参数值,传递到子作业以供使用。此处子作业参数名定义为name和score,其值为分别为数据集中的第一列和第二列数值,使用EL表达式#{Loop.current[0]}和#{Loop.current[1]}。 图5 主作业样例 而For Each节点中所选的子作业,则需要定义For Each节点中的子作业参数名,以便让主作业识别参数定义,作业如图6所示。 图6 子作业样例 配置方法 开发子作业 登录DataArts Studio控制台,找到所需要的DataArts Studio实例,单击实例卡片上的“进入控制台”,进入概览页面。 选择“空间管理”页签,在工作空间列表中,找到所需要的工作空间,单击工作空间的“数据开发”,系统跳转至数据开发页面。 在“作业开发”页面,新建数据开发子作业EL_test_slave。选择一个Kafka Client节点,并配置作业参数,编排图6所示的作业。 此处需将参数名填写为name和score,仅用于主作业的For Each节点识别子作业参数;参数值无需填写。 配置Kafka Client节点参数。发送数据定义为:${name}: ${score},选择Kafka连接和Topic名称。 此处不能使用EL表达式#{Job.getParam("job_param_name")} ,因为此表达式只能直接获取当前作业里配置的参数的value,并不能获取到父作业传递过来的参数值,也不能获取到工作空间里面配置的全局变量,作用域仅为本作业。 而表达式${job_param_name},既可以获取到父作业传递过来的参数值,也可以获取到全局配置的变量。 图7 配置Kafka Client节点参数 配置完成后提交子作业。
  • 场景说明 使用EL表达式#{Job.getNodeOutput("前一节点名")}获取的前一节点的输出结果时,输出结果为二维数组形式 ,形如[["Dean",...,"08"],...,["Smith",...,"53"]]所示。为获取其中的值,本案例提供了如表1所示的两个常见方法示例。 表1 获取结果值常见方法 方法 关键配置 适用场景要求 通过StringUtil提取输出结果值 当SQL节点的输出结果只有一个字段,形如[["11"]]所示时,可以通过StringUtil内嵌对象EL表达式分割二维数组,获取前一节点输出的字段值: #{StringUtil.split(StringUtil.split(StringUtil.split(Job.getNodeOutput("前一节点名"),"]")[0],"[")[0],"\\"")[0]} 通过StringUtil提取输出结果值配置简单,但对适用场景有如下要求: 前一SQL节点的输出结果只有一个字段,形如[["11"]]所示。 输出结果值数据类型为String,需要应用场景支持String数据类型。例如当需要使用IF条件判断输出结果值的数值大小时,不支持String类型,则不能使用本方法。 通过For Each节点提取输出结果值 通过For Each节点,循环获取数据集中二维数组的值: For Each节点数据集:#{Job.getNodeOutput('前一节点名')} For Each节点子作业参数:#{Loop.current[索引]} 通过For Each节点输出结果值适用场景更广泛,但需将作业拆分为主作业和子作业。
  • 根据前一个节点的执行状态进行IF条件判断 场景说明 根据前一个CDM节点是否执行成功,决定执行哪一个IF条件分支。基于图1的样例,说明如何设置IF条件。 图1 作业样例 配置方法 登录DataArts Studio控制台,找到所需要的DataArts Studio实例,单击实例卡片上的“进入控制台”,进入概览页面。 选择“空间管理”页签,在工作空间列表中,找到所需要的工作空间,单击工作空间的“数据开发”,系统跳转至数据开发页面。 在“作业开发”页面,新建数据开发作业,然后分别选择CDM节点和两个Dummy节点,选中连线图标并拖动,编排图1所示的作业。 其中CDM节点的失败策略需要设置为“继续执行下一节点”。 图2 配置CDM节点的失败策略 右键单击连线,选择“设置条件”,在弹出的“编辑EL表达式”文本框中输入IF条件。 每一个条件分支都需要填写IF条件,IF条件为通过EL表达式语法填写三元表达式。当三元表达式结果为true的时候,才会执行连线后面的节点,否则后续节点将被跳过。 此Demo中使用的EL表达式为“#{Job.getNodeStatus("node_name")}”,这个表达式的作用为获取指定节点的执行状态,成功状态返回success,失败状态返回fail。本例使用中,IF条件表达式分别为: 上面的A分支IF条件表达式为: #{(Job.getNodeStatus("CDM")) == "success" ? "true" : "false"} 下面的B分支IF条件表达式为:#{(Job.getNodeStatus("CDM")) == "fail" ? "true" : "false"} 输入IF条件表达式后,配置IF条件匹配失败策略,可选择仅跳过相邻的下一个节点,或者跳过该IF分支后续所有节点。配置完成后单击确定,保存作业。 图3 配置失败策略 测试运行作业,并前往实例监控中查看执行结果。 待作业运行完成后,从实例监控中查看作业实例的运行结果,如图4所示。可以看到运行结果是符合预期的,当前CDM执行的结果为fail的时候,跳过A分支,执行B分支。 图4 作业运行结果
  • 使用案例 案例场景 因数据规整要求,需要周期性地将多组DLI源数据表数据导入到对应的DLI目的表,如表1所示。 表1 需要导入的列表情况 源数据表名 目的表名 a_new a b_2 b c_3 c d_1 d c_5 e b_1 f 如果通过SQL节点分别执行导入脚本,需要开发大量脚本和节点,导致重复性工作。在这种情况下,我们可以使用For Each节点进行循环作业,节省开发工作量。 配置方法 准备源表和目的表。为了便于后续作业运行验证,需要先创建DLI源数据表和目的表,并给源数据表插入数据。 创建DLI表。您可以在DataArts Studio数据开发中,新建DLI SQL脚本执行以下SQL命令,也可以在 数据湖探索 (DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 创建数据表 */ CREATE TABLE a_new (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b_2 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c_3 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d_1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c_5 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b_1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE a (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d (name STRING, score INT) STORED AS PARQUET; CREATE TABLE e (name STRING, score INT) STORED AS PARQUET; CREATE TABLE f (name STRING, score INT) STORED AS PARQUET; 给源数据表插入数据。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令,也可以在 数据湖 探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 源数据表插入数据 */ INSERT INTO a_new VALUES ('ZHAO','90'),('QIAN','88'),('SUN','93'); INSERT INTO b_2 VALUES ('LI','94'),('ZHOU','85'); INSERT INTO c_3 VALUES ('WU','79'); INSERT INTO d_1 VALUES ('ZHENG','87'),('WANG','97'); INSERT INTO c_5 VALUES ('FENG','83'); INSERT INTO b_1 VALUES ('CEHN','99'); 准备数据集数据。您可以通过以下方式之一获取数据集: 您可以将表1数据导入到DLI表中,然后将SQL脚本读取的结果作为数据集。 您可以将表1数据保存在OBS的 CS V文件中,然后通过DLI SQL或DWS SQL创建OBS外表关联这个CSV文件,然后将OBS外表查询的结果作为数据集。DLI创建外表请参见OBS输入流,DWS创建外表请参见创建外表。 您可以将表1数据保存在HDFS的CSV文件中,然后通过HIVE SQL创建Hive外表关联这个CSV文件,然后将HIVE外表查询的结果作为数据集。MRS创建外表请参见创建表。 本例以方式1进行说明,将表1中的数据导入到DLI表(Table_List)中。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令导入数据,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 创建数据表TABLE_LIST,然后插入表1数据,最后查看生成的表数据 */ CREATE TABLE Table_List (Source STRING, Destination STRING) STORED AS PARQUET; INSERT INTO Table_List VALUES ('a_new','a'),('b_2','b'),('c_3','c'),('d_1','d'),('c_5','e'),('b_1','f'); SELECT * FROM Table_List; 生成的Table_List表数据如下: 图2 Table_List表数据 创建要循环运行的子作业ForeachDemo。在本次操作中,定义循环执行的是一个包含了DLI SQL节点的任务。 进入DataArts Studio数据开发模块选择“作业开发”页面,新建作业ForeachDemo,然后选择DLI SQL节点,编排图3所示的作业。 DLI SQL的语句中把要替换的变量配成${}这种参数的形式。在下面的SQL语句中,所做的操作是把${Source}表中的数据全部导入${Destination}中,${fromTable}、${toTable} 就是要替换的变量参数。SQL语句为: INSERT INTO ${Destination} select * from ${Source}; 此处不能使用EL表达式#{Job.getParam("job_param_name")} ,因为此表达式只能直接获取当前作业里配置的参数的value,并不能获取到父作业传递过来的参数值,也不能获取到工作空间里面配置的全局变量,作用域仅为本作业。 而表达式${job_param_name},既可以获取到父作业传递过来的参数值,也可以获取到全局配置的变量。 图3 循环执行子作业 配置完成SQL语句后,在子作业中配置作业参数。此处仅需要配置参数名,用于主作业ForeachDemo_master中的For Each节点识别子作业参数;参数值无需填写。 图4 配置子作业参数 配置完成后保存作业。 创建For Each节点所在的主作业ForeachDemo_master。 进入DataArts Studio数据开发模块选择“作业开发”页面,新建数据开发主作业ForeachDemo_master。选择DLI SQL节点和For Each节点,选中连线图标并拖动,编排图5所示的作业。 图5 编排作业 配置DLI SQL节点属性,此处配置为SQL语句,语句内容如下所示。DLI SQL节点负责读取DLI表Table_List中的内容作为数据集。 SELECT * FROM Table_List; 图6 DLI SQL节点配置 配置For Each节点属性。 子作业:子作业选择步骤2已经开发完成的子作业“ForeachDemo”。 数据集:数据集就是DLI SQL节点的Select语句的执行结果。使用EL表达式#{Job.getNodeOutput('preDLI')},其中preDLI为前一个节点的名称。 子作业参数:用于将数据集中的数据传递到子作业以供使用。Source对应的是数据集Table_List表的第一列,Destination是第二列,所以配置的EL表达式分别为#{Loop.current[0]}、#{Loop.current[1]}。 图7 配置For Each节点 配置完成后保存作业。 测试运行主作业。 单击主作业画布上方的“测试运行”按钮,测试作业运行情况。主作业运行后,会通过For Each节点自动调用运行子作业。 单击左侧导航栏中的“实例监控”,进入实例监控中查看作业运行情况。等待作业运行成功后,就能查看For Each节点生成的子作业实例,由于数据集中有6行数据,所以这里就对应产生了6个子作业实例。 图8 查看作业实例 查看对应的6个DLI目的表中是否已被插入预期的数据。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令导入数据,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 查看表a数据,其他表数据请修改命令后运行 */ SELECT * FROM a; 将查询到的表数据与给源数据表插入数据步骤中的数据进行对比,可以发现数据插入符合预期。 图9 目的表数据
  • For Each节点与EL表达式 要想使用好For Each节点,您必须对EL表达式有所了解。EL表达式用法请参考EL表达式。 下面为您展示For Each节点常用的一些EL表达式。 #{Loop.dataArray} :For循环节点输入的数据集,是一个二维数组。 #{Loop.current}:由于For循环节点在处理数据集的时候,是一行一行进行处理的,那Loop.current就表示当前处理到的某行数据,Loop.current是一个一维数组,一般定义格式为#{Loop.current[0]}、#{Loop.current[1]}或其他,0表示遍历到当前行的第一个值。 #{Loop.offset}:For循环节点在处理数据集时当前的偏移量,从0开始。 #{Job.getNodeOutput('preNodeName')}:获取前面节点的输出。
  • 适用场景 当您进行作业开发时,如果某些任务的参数有差异、但处理逻辑全部一致,在这种情况下您可以通过For Each节点避免重复开发作业。 For Each节点可指定一个子作业循环执行,并通过数据集对子作业中的参数进行循环替换。关键参数如下: 子作业:选择需要循环执行的作业。 数据集:即不同子任务的参数值的集合。可以是给定的数据集,如“[['1'],['3'],['2']]”;也可以是EL表达式如“#{Job.getNodeOutput('preNodeName')}”,即前一个节点的输出值。 子作业参数:参数名即子作业中定义的变量;参数值一般配置为数据集中的某组数据,每次运行中会将参数值传递到子作业以供使用。例如参数值填写为:#{Loop.current[0]},即将数据集中每行数据的第一个数值遍历传递给子作业。 For Each节点举例如图1所示 。从图中可以看出,子作业“foreach”中的参数名为“result”,参数值为一维数组数据集“[['1'],['3'],['2']] ”的遍历(即第一次循环为1,第二次循环为3,第三次循环为2)。 图1 for each节点
共100000条