华为云用户手册

  • 什么是数据湖? 在企业内部,数据是一类重要资产已经成为了共识。随着企业的持续发展,数据不断堆积,企业希望把生产经营中的所有相关数据都完整保存下来,进行有效管理与集中治理,挖掘和探索数据价值。 数据湖就是在这种背景下产生的。数据湖是一个集中存储各类结构化和非结构化数据的大型数据仓库,它可以存储来自多个数据源、多种数据类型的原始数据,数据无需经过结构化处理,就可以进行存取、处理、分析和传输。数据湖能帮助企业快速完成异构数据源的联邦分析、挖掘和探索数据价值。 数据湖的本质,是由“数据存储架构+数据处理工具”组成的解决方案。 数据存储架构:要有足够的扩展性和可靠性,可以存储海量的任意类型的数据,包括结构化、半结构化和非结构化数据。 数据处理工具,则分为两大类: 第一类工具,聚焦如何把数据“搬到”湖里。包括定义数据源、制定数据同步策略、移动数据、编制数据目录等。 第二类工具,关注如何对湖中的数据进行分析、挖掘、利用。数据湖需要具备完善的数据管理能力、多样化的数据分析能力、全面的数据生命周期管理能力、安全的数据获取和数据发布能力。如果没有这些数据治理工具,元数据缺失,湖里的数据质量就没法保障,最终会由数据湖变质为数据沼泽。 随着大数据和AI的发展,数据湖中数据的价值逐渐水涨船高,价值被重新定义。数据湖能给企业带来多种能力,例如实现数据的集中式管理,帮助企业构建更多优化后的运营模型,也能为企业提供其他能力,如预测分析、推荐模型等,这些模型能刺激企业能力的后续增长。 对于数据仓库与数据湖的不同之处,可以类比为仓库和湖泊的区别:仓库存储着来自特定来源的货物;而湖泊的水来自河流、溪流和其他来源,并且是原始数据。 表2 数据湖与数据仓库的对比 维度 数据湖 数据仓库 应用场景 可以探索性分析所有类型的数据,包括机器学习、数据发现、特征分析、预测等 通过历史的结构化数据进行数据分析 使用成本 起步成本低,后期成本较高 起步成本高,后期成本较低 数据质量 包含大量原始数据,使用前需要清洗和标准化处理 质量高,可作为事实依据 适用对象 数据科学家、数据开发人员为主 业务分析师为主
  • 华为智能数据湖方案 华为数据使能服务DAYU,为大型政企客户量身定制跨越孤立系统、感知业务的数据资源智能管理解决方案,实现全域数据入湖,帮助政企客户从多角度、多层次、多粒度挖掘数据价值,实现数据驱动的数字化转型。 DAYU的核心主要是华为智能数据湖FusionInsight,包含数据库、数据仓库、数据湖等各计算引擎和数据治理中心DataArts Studio平台,提供了数据使能的全套能力,支持数据的采集、汇聚、计算、资产管理、数据开放服务的全生命周期管理。 华为FusionInsight解决方案,对应的各服务如下: 数据库: 关系型数据库包括:云数据库RDS、云数据库 GaussDB(for MySQL)、云数据库 GaussDB、云数据库 PostgreSQL、云数据库 SQL Server等。 非关系型数据库包括:文档数据库服务DDS、云数据库 GeminiDB(兼容Influx、Redis、Mongo以及Cassandra多种协议)等。 数据仓库:数据仓库服务DWS。 数据湖:云原生大数据MRS、数据湖探索DLI等。 数据治理平台:数据治理中心DataArts Studio。
  • 什么是数据仓库? 随着数据库的大规模应用,使信息行业的数据爆炸式的增长。为了研究数据之间的关系,挖掘数据隐藏的价值,人们越来越多的需要使用联机分析处理OLAP(On-Line Analytical Processing)进行数据分析,探究一些深层次的关系和信息。但是不同的数据库之间很难做到数据共享,数据之间的集成与分析也存在非常大的挑战。 为解决企业的数据集成与分析问题,数据仓库之父比尔·恩门于1990年提出数据仓库(Data Warehouse)。数据仓库主要功能是将OLTP经年累月所累积的大量数据,通过数据仓库特有的数据储存架构进行OLAP,最终帮助决策者能快速有效地从大量数据中,分析出有价值的信息,提供决策支持。自从数据仓库出现之后,信息产业就开始从以关系型数据库为基础的运营式系统慢慢向决策支持系统发展。 数据仓库相比数据库,主要有以下两个特点: 数据仓库是面向主题集成的。数据仓库是为了支撑各种业务而建立的,数据来自于分散的操作型数据。因此需要将所需数据从多个异构的数据源中抽取出来,进行加工与集成,按照主题进行重组,最终进入数据仓库。 数据仓库主要用于支撑企业决策分析,所涉及的数据操作主要是数据查询。因此数据仓库通过表结构优化、存储方式优化等方式提高查询速度、降低开销。 表1 数据仓库与数据库的对比 维度 数据仓库 数据库 应用场景 OLAP OLTP 数据来源 多数据源 单数据源 数据标准化 非标准化Schema 高度标准化的静态Schema 数据读取优势 针对读操作进行优化 针对写操作进行优化
  • Hive SQL和Spark SQL脚本执行失败,界面只显示执行失败,没有显示具体的错误原因? 请确认当前Hive SQL和Spark SQL脚本使用的数据连接为“MRS API连接”还是“通过代理连接”。 “MRS API连接”模式下DataArts Studio通过API把脚本提交给MRS,然后查询是否执行完成;而MRS不会将具体的错误原因反馈到DataArts Studio,因此导致数据开发脚本执行界面只能显示执行成功还是失败。 “通过代理连接”模式下DataArts Studio提交脚本并运行,查看脚本是否执行完成,同时在数据开发脚本执行界面,日志中会显示具体错误信息和脚本执行的结果。 如果需要查看具体的错误原因,则需要到MRS的作业管理界面进行查看。 父主题: 数据开发
  • 解决方法 用python3解释器,在主机上做一个软连接,如下图所示。 图2 主机上做软连接 在文件中设置标准编码方式。 # -*- coding: utf-8 -*-;或者设置主机的编码格式:在python安装目录的Lib\site-packages文件夹下新建一个sitecustomize.py文件,在文件中写入如下内容。 # encoding=utf8 #import sys #reload(sys) #sys.setdefaultencoding('utf8') 重启python,通过sys.getdefaultencoding()查看默认编码,这时为'utf8'。
  • 各个数据迁移服务区别 表1 各个数据迁移服务区别 服务名 主要功能 与其他服务的区别 云数据迁移CDM 大数据迁移上云 多种数据源到数据湖的迁移 与DRS的区别: 数据库迁移使用DRS;到大数据系统的迁移使用CDM。 对象存储迁移服务 OMS 对象存储迁移 他云对象存储数据迁移到华为云 华为云各Region间的数据迁移 与CDM的区别: OMS用于他云到华为云的数据迁移;CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。 数据复制服务 DRS 支持主流数据库到华为云的入云和出云迁移 数据库在线迁移 数据库实时同步 与CDM的区别: 数据库迁移使用DRS;到大数据系统的迁移使用CDM。 与UGO的区别: DRS支持同构和异构的数据库迁移/同步;UGO用于异构数据库的结构迁移、数据库迁移前评估、语法迁移等。 主机迁移服务 SMS 主机迁移 含物理机到华为云、其他自建或他云虚拟机到华为云 - 数据库和应用迁移 UGO 数据库结构迁移 数据库迁移前评估 语法迁移 与DRS的区别: DRS支持同构和异构的数据库迁移/同步;UGO用于异构数据库的结构迁移、数据库迁移前评估、语法迁移等。 数据快递服务 DES 海量数据,支持TB级到PB级数据上云 使用物理介质 -
  • 什么是对象存储迁移服务(OMS)? 对象存储迁移服务(Object Storage Migration Service,简称OMS)是一种线上数据迁移服务,帮助您将其他云服务商对象存储服务中的数据在线迁移至华为云的对象存储服务(Object Storage Service,OBS)中。简言之,入云迁移、对象存储迁移。更多详情请参见对象存储迁移服务。 OMS主要功能有以下两个: 线上数据迁移服务:帮助用户把对象存储数据从其他云服务商的公有云轻松、平滑地迁移上云。 跨区域的复制:指的是华为云各个Region之间的数据复制和备份。 目前支持以下他云对象存储数据的入云迁移:亚马逊云、阿里云、微软云、百度云、华为云、金山云、青云、七牛云、腾讯云。 云数据迁移CDM服务也同样支持对象存储数据迁移,两者的区别为: OMS用于他云到华为云的数据迁移。 CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。
  • 什么是数据库和应用迁移(UGO)? 数据库和应用迁移 UGO(Database and Application Migration UGO,简称UGO)是专注于异构数据库结构迁移的专业服务。可将数据库中的DDL、业务程序中封装的数据库SQL一键自动将语法转换为华为云GaussDB/RDS的SQL语法,通过预迁移评估、结构迁移两大核心功能和自动化语法转换,提前识别可能存在的改造工作、提高转化率、最大化降低用户数据库迁移成本。更多详情请参见数据库和应用迁移。 简言之,UGO用于异构数据库迁移前的数据库评估、结构迁移、语法转化。
  • 什么是云数据迁移服务(CDM)? 云数据迁移(Cloud Data Migration,简称CDM)是一种高效、易用的数据集成服务。CDM围绕大数据迁移上云和智能数据湖解决方案,提供了简单易用的迁移能力和多种数据源到数据湖的集成能力,降低了客户数据源迁移和集成的复杂性,有效的提高您数据迁移和集成的效率。更多详情请参见云数据迁移服务。 CDM进行数据迁移时,目标端为数据湖或其他大数据系统;源端可以是数据库也可以是对象存储。 CDM与DRS的区别: 目的端是大数据系统时,推荐使用CDM。 目的端是OLTP数据库或DWS时,推荐使用DRS迁移。 CDM与OMS的区别: OMS用于入云迁移,支持以下源端云服务商:亚马逊云、阿里云、微软云、百度云、青云、七牛云、腾讯云。 CDM主要用于OBS数据迁移到数据湖或其他大数据系统,以便对数据进行开发、清洗、治理等。同时,整桶迁移建议使用OMS。
  • 什么是主机迁移服务(SMS)? 主机迁移服务(Server Migration Service,简称SMS)是一种P2V/V2V迁移服务,可以帮您把X86物理服务器或者私有云、公有云平台上的虚拟机迁移到华为云弹性云服务器云主机上,从而帮助您轻松地把服务器上的应用和数据迁移到华为云。更多详情请参见主机迁移服务。 主机迁移服务 SMS 是一种P2V/V2V迁移服务,可以把X86物理服务器、私有云或公有云平台上的虚拟机迁移到华为ECS上。
  • Spark Python脚本如何引用Python脚本? 下图为一个Python脚本: def hello1(odps): sql_str="""select date_ptn ( to_char ( TO_DATE('20231008', 'yyyyMMdd'), 'yyyy-mm-dd hh:mm:ss' ), 'm' )""" odps.sql(sql_str).show() 创建一个Spark Python脚本: 图1 Spark Python脚本 ## SparkPython ## ******************************************************************** ## ## author: Huawei-readonly ## create time: 2023/10/08 15:22:36 GMT+08:00 ## ******************************************************************** ## ## SparkPython ## ******************************************************************** ## ## author: Huawei-readonly ## create time: 2023/09/26 10:42:37 GMT+08:00 ## ******************************************************************** ## import subprocess import time from pyspark import SparkConf, SparkContext from pyspark.sql import SparkSession,SQLContext import hello def execute_sql(sql_query): return odps.sql(sql_query) def create_spark_session(): conf = SparkConf().setAppName("myj").setMaster("yarn").set("spark.executor.memory", "8g").set("spark.executor.cores", "4") spark = SparkSession \ .builder \ .config(conf=conf) \ .getOrCreate() return spark if __name__ == '__main__': # 创建一个名为"myj"的SparkSession对象 odps = create_spark_session() odps.execute_sql=execute_sql # 执行sql # sql_str="""select week_datepart('2013-01-08 01:10:00', 'mwm');""" # odps.execute_sql(sql_str) .show() hello.hello1(odps) # print("xxx") --py-files hdfs:///tmp/pyspark/hello.py 在作业算子MRS Spark Python中引用Python脚本: 在运行程序参数中配置参数--py-files和参数值hdfs:///tmp/pyspark/hello.py。 图2 算子MRS Spark Python中引用Python脚本 该示例是将脚本上传到HDFS路径,上传到OBS路径也适用。 父主题: 数据开发
  • 解决办法 编辑ECS的/etc/ssh/sshd_config文件,添加或者更新如下两个值。 ClientAliveInterval 300 ClientAliveCountMax 3 ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔,默认是0,不发送请求。然而ClientAliveInterval 300表示五分钟发送一次,然后客户端响应,这样就保持长连接了。ClientAliveCountMax的默认值3。ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值,就自动断开,正常情况下,客户端会正常响应。 修改后,重启ECS的sshd,执行如下命令: restart sshd.service 检查sshd是否启动成功(下图为成功):
  • 原因分析 获取Shell节点的运行日志。 [2021/11/17 02:00:36 GMT+0800] [INFO] No job-level agency is set, Workspace-level agency is dlg_agency, Execute job use agency dlg_agency, job id is 07572F197E4642E5BE549C2B656F157Ctm7cHkHd [2021/11/17 02:00:36 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:00:36 GMT+0800] [INFO] Get response from agent when try to submit shell running job : [2021/11/17 02:00:36 GMT+0800] [INFO] { "jobResultList":[ { "jobId":"a567f7f5-3c9e-4dfc-a464-bd477ac5b1ea", "status":"created", "errorCode":0, "failCount":0, "result":[ ] } ], "agentId":"614853ee-c1c6-456d-9aa6-fc84ad1281ed" } [2021/11/17 02:00:36 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [INFO] Job Run finish , the raw output is : [2021/11/17 02:05:56 GMT+0800] [INFO] { "jobId":"a567f7f5-3c9e-4dfc-a464-bd477ac5b1ea", "status":"failed", "errorCode":3427, "errorMessage":"Shell script job execute failed.", "failCount":0, "result":[ { "is_success":false, "exeTime":300.609 } ] } [2021/11/17 02:05:56 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [INFO] The return code is : [-1]. [2021/11/17 02:05:56 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [INFO] Execute shell script job finished. [2021/11/17 02:05:56 GMT+0800] [ERROR] Shell exit code is not 0 [2021/11/17 02:05:56 GMT+0800] [DEBUG] =============================================== [2021/11/17 02:05:56 GMT+0800] [ERROR] Shell script job execute failed. Please contact ECS Service. [2021/11/17 02:05:56 GMT+0800] [ERROR] Exception message: RuntimeException: Shell script job execute failed. Please contact ECS Service. [2021/11/17 02:05:56 GMT+0800] [ERROR] Root Cause message:RuntimeException: Shell script job execute failed. Please contact ECS Service. 确认其ECS的sshd_config参数如下。 原因分析:由于ssh session超时断开了,因此Shell节点失败。
  • 用户在执行质量作业时提示无MRS权限怎么办? 用户在执行质量作业时报错,查看质量作业的日志,提示“ The current user does not exist on MRS Manager. Grant the user sufficient permissions on IAM and then perform IAM user synchronization on the Dashboard tab page. !” 此类问题一般是由于用户不具备MRS集群操作权限导致的。 对于租户下新增的用户,需要在MRS集群列表的界面找到对应的MRS集群实例,手动单击同步。 操作如下: 进入MRS控制台,查看现有集群,单击对应的集群名称进入概览页。 图1 MRS集群实例 在“IAM用户同步”处,单击同步。 图2 单击同步 在操作日志处查看操作结果。 图3 操作日志 如果经过上述步骤,账号已同步。但还是提示MRS权限不足的话,则需要登录到Manger管理页面中创建一个与当前主账号同名的账号。 在步骤4中,需要创建一个与当前主账号同名的账号。 父主题: 数据质量
  • 表达式转换 使用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")
  • 在ECS上调试好的shell脚本,在DLF中shell脚本执行异常,如何处理? 问题现象:在ECS上调试好的shell脚本,在DLF中shell脚本执行异常。 脚本内容是通过gsql连接dws查询某库表数据行数的。 ECS调试结果: DLF脚本运行结果: 处理方法: 添加如下两条命令: export LD_LIBRARY_PATH=/usr/local/dws_client_8.1.x_x64/lib:${LD_LIBRARY_PATH} export PATH=/usr/local/dws_client_8.1.x_x64/bin:${PATH} 其中,/usr/local/dws_client_8.1.x_x64是安装的dws客户端的路径。 父主题: 数据开发
  • 解决方法 如果是作为DataArts Studio服务CDM组件使用: 检查用户是否添加DAYU Administrator或DAYU User角色,参考DataArts Studio权限管理。 是否有对应工作空间的权限,如开发者、访客等,参考DataArts Studio权限列表。 如果是独立CDM服务使用: 检查是否开启IAM细粒度鉴权。 如果未开启,检查用户组是否添加CDM Administrator角色。 如果已开启,请继续执行步骤2继续检查。 检查用户是否添加CDM访问策略,包含自定义策略或预设策略,如CDM FullAccess、CDM ReadOnlyAccess等,参考CDM权限管理。 检查对应企业项目是否添加拒绝访问策略。
  • 创建并执行数据迁移作业 登录DataArts Studio控制台,单击相应工作空间后的“数据集成”。 在“集群管理”页面,单击所创建集群操作列“作业管理”,进入“作业管理”页面。 在表/文件迁移页签中,单击新建作业,创建数据迁移作业。 配置DWS源端作业参数、MRS Hive目的端作业参数,参数说明请参见配置DWS源端参数、配置MRS Hive目的端作业参数。 图4 作业配置 配置作业字段映射及任务配置,单击“保存并运行”,执行CDM作业。 在“表/文件迁移”作业列表中,查看作业执行情况。 图5 查看作业运行情况
  • 创建数据迁移连接 登录DataArts Studio控制台,单击相应工作空间后的“数据集成”。 在集群管理页面,单击所创建集群操作列“作业管理”,进入“作业管理”页面。 图1 作业管理页面 在连接管理页签中,单击“新建连接”,创建DWS数据连接,参数说明请参见配置DWS连接。 图2 配置DWS连接 同上述步骤,创建MRS Hive数据连接,参数说明请参见配置MRS Hive连接。 图3 配置MRS Hive连接
  • 新建MySQL到OBS迁移作业 正式业务流程中,需要将MySQL中的原始样例数据需要导入OBS中,并标准化为点数据集和边数据集。 在DataArts Studio数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图14 表/文件迁移 按照如下步骤将MySQL中的4张原始数据表,依次迁移到OBS桶中。 配置作业vertex_user_rds2obs。 源端的“表名”选择在新建OBS到MySQL迁移作业中迁移到MySQL的vertex_user。目的端的“写入目录”注意选择非原始数据所在目录以避免文件覆盖,“文件格式”按照GES图导入格式要求设置为“CSV格式”,由于表中有中文字符还需额外配置高级属性“编码类型”为“GBK”。 注意:目的端高级属性需要额外配置“自定义文件名”,取值为“${tableName}”。如果不配置,则迁移到OBS的CSV文件名会带上时间戳等额外字段,导致每次运行迁移作业获取的文件名不一致,无法每次迁移后自动导入GES图数据。 其他高级属性无需配置,单击“下一步”。 图15 vertex_user_rds2obs作业基础配置 图16 vertex_user_rds2obs作业高级配置 在字段映射中,根据GES图数据的要求,此处需要新增字段label,作为图文件的标签。 vertex_user:label取值为user,并将此字段调整至第2列。 vertex_movie:label取值为movie,并将此字段调整至第2列。 edge_friends:label取值为friends,并将此字段调整至第3列。 edge_rate:label取值为rate,并将此字段调整至第3列。 将原始数据结构根据GES图导入的要求标准化。则点表vertex_user和vertex_movie需要在第二列补充标签label,边表edge_rate和edge_friends需要在第三列补充标签label。 点数据集和边数据集应符合GES图数据格式要求。图数据格式要求简要介绍如下,详情可参见一般图数据格式。 点数据集罗列了各个点的数据信息。一行为一个点的数据。格式如下所示,id是点数据的唯一标识。 id,label,property 1,property 2,property 3,… 边数据集罗列了各个边的数据信息,一行为一条边的数据。GES中图规格是以边的数量进行定义的,如一百万边。格式如下所示,id 1、id 2是一条边的两个端点的id。 id 1, id 2, label, property 1, property 2, … 图17 vertex_user_rds2obs新增字段映射 调整字段顺序,点数据集将label调整至第2列,边数据集将label调整至第3列。调整完成后如图19所示,然后单击下一步。 图18 vertex_user_rds2obs调整字段顺序 图19 vertex_user_rds2obs字段映射 任务配置无需修改,直接保存并运行即可。 图20 任务配置 等待作业运行完成后,如果作业成功,则vertex_user.csv表已成功写入到OBS桶中。 图21 vertex_user_rds2obs作业运行成功 参考2到4,完成vertex_movie_rds2obs、edge_friends_rds2obs和edge_rate_rds2obs作业的创建,将4张原始表从MySQL标准化到OBS桶中。
  • 新建MySQL到MRS Hive迁移作业 正式业务流程中,需要将MySQL中的原始样例数据需要导入MRS Hive中,并标准化为点数据集和边数据集。 在DataArts Studio数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图22 表/文件迁移 按照如下步骤将MySQL中的4张原始数据表,依次迁移到MRS Hive中。 配置作业vertex_user_rds2hive。 源端的“表名”选择在新建OBS到MySQL迁移作业中迁移到MySQL的vertex_user,目的端的“表名”选择在创建MRS Hive标准数据表中创建的vertex_user表。其他参数配置如图所示,无需配置高级属性,然后单击“下一步”。 图23 vertex_user_rds2hive作业基础配置 在字段映射中,根据GES图数据的要求,此处需要新增字段label,作为图文件的标签。 vertex_user:label取值为user,并将此字段调整至第2列。 vertex_movie:label取值为movie,并将此字段调整至第2列。 edge_friends:label取值为friends,并将此字段调整至第3列。 edge_rate:label取值为rate,并将此字段调整至第3列。 将原始数据结构根据GES图导入的要求标准化。则点表vertex_user和vertex_movie需要在第二列补充标签label,边表edge_rate和edge_friends需要在第三列补充标签label。 点数据集和边数据集应符合GES图数据格式要求。图数据格式要求简要介绍如下,详情可参见一般图数据格式。 点数据集罗列了各个点的数据信息。一行为一个点的数据。格式如下所示,id是点数据的唯一标识。 id,label,property 1,property 2,property 3,… 边数据集罗列了各个边的数据信息,一行为一条边的数据。GES中图规格是以边的数量进行定义的,如一百万边。格式如下所示,id 1、id 2是一条边的两个端点的id。 id 1, id 2, label, property 1, property 2, … 图24 vertex_user_rds2hive新增字段映射 调整字段顺序,点文件中将label调整至第2列,边文件将label调整至第3列。调整完成后如图26所示,然后单击下一步。 图25 vertex_user_rds2hive调整字段顺序 图26 vertex_user_rds2hive字段映射 任务配置无需修改,直接保存并运行即可。 图27 任务配置 等待作业运行完成后,如果作业成功,则vertex_user表已成功迁移到MRS Hive中。 图28 vertex_user_rds2hive作业运行成功 参考2到4,完成vertex_movie_rds2hive、edge_friends_rds2hive和edge_rate_rds2hive作业的创建,将4张原始表从MySQL标准化到MRS Hive中。
  • 新建OBS到MySQL迁移作业 为方便演示,需要将OBS中的CSV格式的样例数据导入到MySQL数据库中。 在DataArts Studio数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图9 表/文件迁移 按照如下步骤将数据源准备中的4张原始数据表,依次从OBS迁移到MySQL数据库中。 配置作业vertex_user_obs2rds。 源端的“源目录或文件”选择在数据源准备中上传到OBS的vertex_user.csv,由于表中有中文字符还需额外配置高级属性“编码类型”为“GBK”。目的端的“表名”选择在创建MySQL原始数据表中创建的vertex_user表。然后单击“下一步”。 图10 vertex_user_obs2rds作业配置 在字段映射中,检查字段映射顺序是否正确。如果字段映射顺序正确,单击下一步即可。 图11 vertex_user_obs2rds字段映射 任务配置无需修改,直接保存并运行即可。 图12 任务配置 等待作业运行完成后,如果作业成功,则vertex_user表已成功迁移到MySQL数据库中。 图13 vertex_user_obs2rds作业运行成功 参考2到4,完成vertex_movie_obs2rds、edge_friends_obs2rds和edge_rate_obs2rds作业的创建,将4张原始表从OBS迁移到MySQL中。
  • 新空间导入作业和连接 请您登录控制台首页,选择并进入新工作空间的“数据集成”模块,然后执行如下操作进行批量导入。 在CDM主界面,单击左侧导航上的“集群管理”,单击集群“操作”列的“作业管理”,进入到“表/文件迁移”界面。 单击作业列表上方的“导入”按钮,准备导入JSON文件。 图3 批量导入 在弹出的窗口中,选择导出作业获取的JSON文件,上传JSON文件。 图4 选择JSON文件 JSON文件上传成功后,单击“设置密码”,配置数据连接的密码或SK。 图5 进入设置密码 在设置密码弹窗中,依次输入各数据连接的密码或SK,完成后单击确认,回到导入作业界面。 图6 设置密码 在导入作业界面,单击确认,开始导入。 图7 开始导入 导入完成后,界面会显示导入情况。如果存在导入失败的情况,请您根据系统报错原因提示,调整后重新导入。
  • 旧空间导出作业和连接 请您登录控制台首页,选择并进入旧工作空间的“数据集成”模块,然后执行如下操作进行批量导出。 在CDM主界面,单击左侧导航上的“集群管理”,单击集群“操作”列的“作业管理”,进入到“表/文件迁移”界面。 单击作业列表上方的“导出”按钮,准备导出连接和作业。 图1 批量导出 在弹出的窗口中,选择“全部作业和连接”,单击“确认”,导出所有作业和连接。 图2 全部导出 导出成功后,通过浏览器下载地址,获取到导出的JSON文件。
  • 配置方法(Kafka Client) 登录DataArts Studio控制台,找到所需要的DataArts Studio实例,单击实例卡片上的“进入控制台”,进入概览页面。 单击第一个工作空间A的“数据开发”,系统跳转至数据开发页面,新建数据开发作业job1。分别选择Dummy节点和Kafka Client节点,选中连线图标并拖动,编排如图7所示的作业。 Dummy节点不执行任何操作,本例选择Dummy节点仅为演示操作,实际使用中您可以用其他作业节点替代。 Kafka Client节点用于发送消息。您需要选择Kafka连接和Topic名称,并将发送数据配置为EL表达式job1,#{DateUtil.getDay(Job.startTime)}。则当本作业执行完成后,将使用Kafka Client发送一条字符串消息:job1,作业执行日期。例如2月15日作业job1执行,实际的消息则为:job1,15。 作业调度等其他作业参数无需配置,保持默认即可。 图7 job1作业Kafka Client节点配置 在另一个工作空间B,新建数据开发作业job_agent。分别选择Dummy节点和Subjob节点,选中连线图标并拖动,编排图8所示的作业。 图8 job_agent作业调度配置 Dummy节点不执行任何操作,本例选择Dummy节点用于设置Dummy节点到Subjob节点之间连线的IF条件。 Subjob节点用于将需要后续执行的作业job2作为子作业引用执行。实际使用中您可以引用已有作业,也可以使用其他作业节点替代Subjob节点。 作业的调度方式设置为“事件驱动调度”,连接名称和Topic选择为工作空间B中的Kafka连接和Topic,需要与工作空间A中job1作业中Kafka Client节点所选择的Kafka连接和Topic相对应,用于通过Kafka消息触发作业运行。 IF判断条件设置,用于校验Kafka Client节点发送的消息是否符合预期,符合才会继续执行Subjob节点,否则跳过。 右键单击连线,选择“设置条件”,在弹出的“编辑参数表达式”文本框中输入IF判断条件,失败策略保持默认即可。IF判断条件为通过EL表达式语法填写三元表达式,当三元表达式结果为true的时候,才会执行连线后面的节点,否则后续节点将被跳过。 #{StringUtil.equals(StringUtil.split(Job.eventData,',')[1],'21')} 该IF判断条件表示,仅当从Kafka通道获取的消息逗号后的部分为“21”时,即每月21日时,才执行后续的作业节点。 如果您需要匹配多条消息记录,可以添加多个Dummy节点并分别添加到Subjob节点的IF条件,然后将数据开发组件配置项中的“多IF策略”设置为“逻辑或”即可。 图9 编辑参数表达式 测试运行作业job_agent,在工作空间A的作业job1未运行的情况下,前往实例监控中查看执行结果是否符合预期。 由于作业job1未运行即未发送消息,则job_agent作业中的Subjob节点被跳过,证明IF条件判断生效。 图10 Subjob节点被跳过 启动调度job_agent。然后测试运行工作空间A作业job1,待job1实例运行成功后,前往工作空间B实例监控中查看作业运行结果是否符合预期。 job_agent被触发运行。 如果当天日期和IF条件中的日期匹配,则job_agent作业中的Subjob节点成功运行、子作业job2也执行完成。否则Subjob节点被跳过。 图11 Subjob节点成功运行
  • 方案说明 DataArts Studio数据开发模块支持以事件触发的方式运行作业,因此通过DIS或者MRS Kafka作为作业依赖纽带,可以跨空间实现作业调度。 如下图,工作空间A中的job1运行完成后,可以使用DIS Client或Kafka Client发送消息触发中继作业job_agent;job_agent配置事件触发调度,根据DIS Client或Kafka Client发送的消息触发运行后,判断消息是否符合预期,符合则触发job2作业运行,否则不再触发job2运行。 图1 调度方案
  • 配置方法(DIS Client) 登录DataArts Studio控制台,找到所需要的DataArts Studio实例,单击实例卡片上的“进入控制台”,进入概览页面。 单击第一个工作空间A的“数据开发”,系统跳转至数据开发页面,新建数据开发作业job1。分别选择Dummy节点和DIS Client节点,选中连线图标并拖动,编排如图2所示的作业。 Dummy节点不执行任何操作,本例选择Dummy节点仅为演示操作,实际使用中您可以用其他作业节点替代。 DIS Client节点用于发送消息。您需要选择DIS所属Region和通道,并将发送数据配置为EL表达式job1,#{DateUtil.getDay(Job.startTime)}。则当本作业执行完成后,将使用DIS Client发送一条字符串消息:job1,作业执行日期。例如2月15日作业job1执行,实际的消息则为:job1,15。 作业调度等其他作业参数无需配置,保持默认即可。 图2 job1作业DIS Client节点配置 在另一个工作空间B,新建数据开发作业job_agent。分别选择Dummy节点和Subjob节点,选中连线图标并拖动,编排图3所示的作业。 图3 job_agent作业调度配置 Dummy节点不执行任何操作,本例选择Dummy节点用于设置Dummy节点到Subjob节点之间连线的IF条件。 Subjob节点用于将需要后续执行的作业job2作为子作业引用执行。实际使用中您可以引用已有作业,也可以使用其他作业节点替代Subjob节点。 作业的调度方式设置为“事件驱动调度”,DIS通道名称选择为工作空间A中job1作业中DIS Client节点所选择的通道,用于通过DIS消息触发作业运行。 IF判断条件设置,用于校验DIS Client节点发送的消息是否符合预期,符合才会继续执行Subjob节点,否则跳过。 右键单击连线,选择“设置条件”,在弹出的“编辑参数表达式”文本框中输入IF判断条件,失败策略保持默认即可。IF判断条件为通过EL表达式语法填写三元表达式,当三元表达式结果为true的时候,才会执行连线后面的节点,否则后续节点将被跳过。 #{StringUtil.equals(StringUtil.split(Job.eventData,',')[1],'21')} 该IF判断条件表示,仅当从DIS通道获取的消息逗号后的部分为“21”时,即每月21日时,才执行后续的作业节点。 如果您需要匹配多条消息记录,可以添加多个Dummy节点并分别添加到Subjob节点的IF条件,然后将数据开发组件配置项中的“多IF策略”设置为“逻辑或”即可。 图4 编辑参数表达式 测试运行作业job_agent,在工作空间A的作业job1未运行的情况下,前往实例监控中查看执行结果是否符合预期。 由于作业job1未运行即未发送消息,则job_agent作业中的Subjob节点被跳过,证明IF条件判断生效。 图5 Subjob节点被跳过 启动调度job_agent。然后测试运行工作空间A作业job1,待job1实例运行成功后,前往工作空间B实例监控中查看作业运行结果是否符合预期。 job_agent被触发运行。 如果当天日期和IF条件中的日期匹配,则job_agent作业中的Subjob节点成功运行、子作业job2也执行完成。否则Subjob节点被跳过。 图6 Subjob节点成功运行
  • 天依赖天 规则:按自然天内的实例进行依赖,不会跨天向前推找依赖实例。在同自然天内A依赖B ,无论A、B设置在什么时间点执行,A永远在B之后执行。 天区间为[00:00:00, 23:59:59] 举例1:A依赖B,A在2:00执行,B在3:00执行,A会等B在3:00执行完成后执行。 图13 天依赖天举例一 举例2:A依赖B,A在5:00执行,B在3:00执行,A在B执行完成后,在5:00执行。 图14 天依赖天举例二
  • 小时依赖分钟 规则:小时作业依赖分钟作业,往前推到上一个自然小时范围内的所有分钟级实例。区间是前开后闭。 举例1:A依赖B,A为小时作业,每个小时0分执行,B为15m分钟作业;B执行完后执行A。 图6 小时依赖分钟举例一 举例2:A依赖B,A为小时作业,启动时间3:20,B为15m作业,会依赖往前推一个小时内的所有B实例。 图7 小时依赖分钟举例二 如果勾选“最近”的按钮,小时作业只依赖所选作业最近的一个运行实例,比如A在3:20开始调度,A依赖B最近的3:00调度的一个运行实例。 如果作业A在零点进行调度,所依赖作业B可以是昨天的分钟任务。
  • 天依赖小时 规则:按自然天,天周期作业实例依赖一天内所有小时作业的实例。A为天作业,依赖B小时作业,A依赖所有B在自然天内的实例,A会在最后一个B小时作业实例执行完成后执行。 举例:A依赖B,A配置的调度时间为每天17点执行一次,B从0点开始,每5个小时执行一次,那么A实际执行时间为JobB在20点的实例运行完之后开始运行。 图12 天依赖小时 如果勾选“最近”的按钮,天作业只依赖所选作业最近的一个运行实例,比如A在每天17点开始调度,A依赖B最近的15:00调度的一个运行实例。
共100000条