华为云用户手册

  • media-statistic 【事件说明】 媒体统计事件。此事件配合streamStatistic方法使用。 【回调参数】 StatisticInfo:StatisticInfo类型,媒体统计信息。 StatisticInfo定义为:{ video:{ codec: string; // 媒体格式 bitRate: number; // 码率 kbps packetsReceived?: number; // 累计接收包数 packetsLost?: number; // 累计丢包数 jitterBufferDelay?: number; // 抖动时延 ms frameRate: number; // 接收帧率 fps frameDecodedRate?: number; // 解码帧率 fps width: number; // 宽度 height: number; // 高度 framesReceived?: number; // 累计接收帧数 framesDecoded?: number; // 累计解码帧数 framesDropped?: number; // 累计丢帧数 nackCount?: number; // 累计重传数 firCount?: number; // 累计关键字请求数 pliCount?: number; // 累计帧请求数 frameDecodeAvgTime?: number; // 平均解码时延 freeze200Count: number; // 200ms卡顿次数 freeze200Duration: number; // 200ms卡顿时长 freeze600Count: number; // 600ms卡顿次数 freeze600Duration: number; // 600ms卡顿时长 } audio:{ codec: string; // 媒体格式 bitRate: number; // 码率 kbps packetsReceived?: number; // 累计接收包数 packetsLost?: number; // 累计丢包数 jitterBufferDelay?: number; // 抖动时延 ms audioLevel?: number; // 音量等级 freeze200Count: number; // 200ms卡顿次数 freeze200Duration: number; // 200ms卡顿时长 } }
  • network-quality 【事件说明】 网络质量报告事件。 【回调参数】 NetworkQualityTypes:NetworkQualityTypes类型,网络质量详情。 NetworkQualityTypes枚举值参考如下: NETWORK_QUALITY_UNKNOW = 0,网络质量未知。 NETWORK_QUALITY_GREAT = 1,网络质量极好。 NETWORK_QUALITY_GOOD = 2,用户主观感觉和极好差不多,但码率可能略低于极好。 NETWORK_QUALITY_DEFE CTS = 3,网络质量一般,用户主观感受有瑕疵但不影响观看。 NETWORK_QUALITY_WEAK = 4,网络质量差,勉强能观看但不流畅。 NETWORK_QUALITY_BAD = 5,网络质量很差,严重影响用户观看体验。 NETWORK_QUALITY_DISCONNECT = 6,网络质量非常差甚至链接断开,无法观看。
  • Error 【事件说明】 客户端错误事件,当出现不可恢复的错误后,Client会上报该事件通知。 【回调参数】 errorInfo:必选,HwLLSError类型,错误信息,详见错误码(HwLLSError)。 errorInfo定义为:{ code:必选,number类型,错误码。 message:必选,string类型,错误描述。 getCode(): number, 必选,返回错误码。 getMsg(): string,必选,返回错误描述。 } 在网络防火墙限制(UDP端口限制)或者低时延直播多次重试播放失败的场景下,可根据特定错误码(HWLLS_MEDIA_NETWORK_ERROR、HWLLS_PLAY_WEBRTC_RETRY_FAILED),进行播放降级,请参考SDK使用。
  • 合规使用指南 华为云Live云直播低时延直播场景SDK开发者合规指南 《中华人民共和国个人信息保护法》自2021年11月1日起正式施行后,监管部门、各行业参与方和终端消费者越来越关注用户的隐私保护问题。为了有效治理App、SDK违规收集使用个人信息的现象,监管部门也陆续出台相关标准规范。 您作为开发者为最终用户提供服务,知悉并确认将遵守适用的法律法规和相关的标准规范,履行个人信息保护义务,并遵循合法、正当、必要和诚信的原则处理用户个人信息,包括但不限于《中华人民共和国个人信息保护法》、《中华人民共和国网络安全法》、《中华人民共和国数据安全法》以及其他适用的法律法规和相关的标准规范。 此文档用于帮助您更好地了解【华为云低时延直播SDK】并合规的使用【华为云低时延直播SDK】服务,仅适用于开发者的业务区域为中国大陆地区的场景。 一、基本要求 您的产品及服务需要尊重用户隐私,遵守国家的数据保护法律和法规。禁止参与任何干扰、干涉、损害、未授权访问任何终端设备、服务器、网络的活动。 1. 隐私政策要求 您需根据法律要求以自身名义发布隐私政策,并就个人信息的处理行为获取用户同意或取得其他合法性基础。隐私政策的要求包括不限于如下: 有独立文本,不能作为用户协议的一部分。 App首次运行收集处理个人信息前需要以醒目方式提示用户阅读隐私政策。隐私政策需方便用户查看,例如用户在App主功能界面中通过4次以内的点击或滑动操作可访问。 描述语言需要清晰通俗,符合通用语言习惯,避免使用有歧义的语言。 隐私政策内容要包含产品及服务收集个人信息的目的、方式和范围,个人信息处理者的名称和联系方式等。 您的产品及服务如涉及向第三方共享个人信息或集成了第三方的SDK时,需要在隐私政策中向用户进行披露和说明,获取用户的授权或同意。 2. 处理个人信息要求 您的产品及服务在处理用户个人信息时,需要遵守的要求包括不限于如下: 处理个人信息需要基于使用目的所必需,满足最小化原则。 实际收集和处理的个人信息范围、使用目的需要与隐私政策的范围保持一致。 收集个人信息的频率需与隐私政策保持一致,禁止超频次收集个人信息。 有明确的个人信息到期删除机制,个人信息的存留期与隐私政策保持一致,到期按时删除个人信息或对个人信息进行匿名化处理。 如涉及处理不满十四周岁未成年人个人信息前,应取得未成年人的父母或其他监护人的同意。 如涉及处理个人信息用于个性化推荐功能或大数据分析业务的,应告知并取得最终用户的授权同意情况下方可开展相关业务功能。 如涉及处理敏感个人信息前,应取得最终用户的单独同意。 如涉及跨境传输个人信息,需要按照国家网信部门会同国务院有关部门制定的办法和相关标准进行安全评估,并符合其要求。同时您还取得最终用户的单独同意。 支持用户方便的行使数据主体权利,例如查阅、复制、更正、删除个人信息等权利。 二、声明SDK处理的个人信息 在您接入、使用【华为云低时延直播SDK】服务前,我们要求您在隐私政策中向用户告知我们SDK的名称、SDK提供方名称、收集个人信息类型、使用目的、隐私政策链接,并获取用户的同意或取得其他合法性基础。您可以参考如下方式提供条款内容: 1. 以文字方式向用户告知 第三方SDK名称:华为云低时延直播SDK 第三方公司名称: 华为云计算 技术有限公司 收集个人信息类型: 音视频流、IP地址、运营商信息、WiFi状态、浏览器信息、操作系统信息、设备型号。 使用目的:为您提供音 视频直播 服务,向您提供低时延直播体验指标功能,以及方便问题定位。 隐私政策链接:隐私声明 2. 以表格方式向用户告知 第三方SDK名称 第三方公司名称 收集个人信息类型 使用目的 隐私政策链接 华为云低时延直播SDK 华为云计算技术有限公司 音视频流、IP地址、运营商信息、WiFi状态、浏览器信息、操作系统信息、设备型号 为您提供音视频直播服务,向您提供低时延直播体验指标功能,以及方便问题定位。 隐私声明 三、权限使用要求 我们SDK在提供服务时会最小化的使用系统权限,您需要根据实际使用的功能申请对应的系统权限并向用户告知征得其同意。 权限 权限描述 使用目的 无 无 无 四、延迟初始化要求 为了避免您的应用在未获取用户的同意前SDK提前处理用户的个人信息。我们提供了SDK初始化的接口createClient(type: string),请保证您的应用获取用户同意后才能调用此接口初始化SDK。 五、最小化使用功能要求 我们的SDK针对扩展功能和可选的个人信息的处理提供了配置能力,您可以基于业务诉求选择开启或关闭相关功能,低时延直播SDK提供开关上报日志的方法。 1. setReportConfig(reportConfig:ReportConfig)接口中reportConfig包含enable参数,设置为false时,不会进行日志上报,设置为true时,才会进行日志上报。 2. setLogLevel(level: string)接口中level设置为none,则关闭日志打印,设置为error、warn、info或者debug,则会输出对应日志打印。
  • SDK维护周期 低时延直播客户端SDK提供一年的维护周期,当前各版本的维护周期详情,如表1所示。 2.6.3之前的版本已经不提供维护,如果使用中有问题,请升级到最新版本。 表1 SDK维护周期 SDK版本号 发布时间 维护结束时间 2.10.9 2025-02-17 2026-02-17 2.10.3 2024-12-02 2025-12-02 2.6.9 2024-06-27 2025-06-27 2.6.3 2024-06-12 2025-06-12
  • 软件包完整性校验 用户可对下载的SDK包进行完整性校验,判断下载过程中是否存在篡改和丢包现象。 详细操作如下所示: 在表1中下载SDK包及其完整性校验sha256包至本地。 打开本地命令提示符框,输入如下命令,在本地生成已下载SDK包的SHA256值。 其中,“D:\HWLLS_SDK_Web_2.6.0.tar.gz”为SDK包本地存放路径和SDK包名,请根据实际情况修改。 certutil -hashfile D:\HWLLS_SDK_Web_2.6.0.tar.gz SHA256 命令执行结果示例,如下所示: SHA256 的 D:\HWLLS_SDK_Web_2.6.0.tar.gz 哈希: 3ac83be852e8dcc9e90f236801fd4c494983073543e1ae66ee4d0c29043dccd1 CertUtil: -hashfile 命令成功完成。 比对查询出的SDK包SHA256值和下载后的SDK包SHA256值。 如果一致,说明下载过程中不存在篡改和丢包现象。
  • 新建MySQL到 MRS Hive迁移作业 正式业务流程中,需要将MySQL中的原始样例数据需要导入MRS Hive中,并标准化为点数据集和边数据集。 在 DataArts Studio 数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图21 表/文件迁移 按照如下步骤将MySQL中的4张原始数据表,依次迁移到MRS Hive中。 配置作业vertex_user_rds2hive。 源端的“表名”选择在新建OBS到MySQL迁移作业中迁移到MySQL的vertex_user,目的端的“表名”选择在创建MRS Hive标准数据表中创建的vertex_user表。其他参数配置如图所示,无需配置高级属性,然后单击“下一步”。 图22 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, … 图23 vertex_user_rds2hive新增字段映射 调整字段顺序,点文件中将label调整至第2列,边文件将label调整至第3列。调整完成后如图25所示,然后单击下一步。 图24 vertex_user_rds2hive调整字段顺序 图25 vertex_user_rds2hive字段映射 任务配置无需修改,直接保存并运行即可。 图26 任务配置 等待作业运行完成后,如果作业成功,则vertex_user表已成功迁移到MRS Hive中。 图27 vertex_user_rds2hive作业运行成功 参考2到4,完成vertex_movie_rds2hive、edge_friends_rds2hive和edge_rate_rds2hive作业的创建,将4张原始表从MySQL标准化到MRS Hive中。
  • 新建MySQL到OBS迁移作业 正式业务流程中,需要将MySQL中的原始样例数据需要导入OBS中,并标准化为点数据集和边数据集。 在DataArts Studio数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图13 表/文件迁移 按照如下步骤将MySQL中的4张原始数据表,依次迁移到OBS桶中。 配置作业vertex_user_rds2obs。 源端的“表名”选择在新建OBS到MySQL迁移作业中迁移到MySQL的vertex_user。目的端的“写入目录”注意选择非原始数据所在目录以避免文件覆盖,“文件格式”按照GES图导入格式要求设置为“ CS V格式”,由于表中有中文字符还需额外配置高级属性“编码类型”为“GBK”。 注意:目的端高级属性需要额外配置“自定义文件名”,取值为“${tableName}”。如果不配置,则迁移到OBS的CSV文件名会带上时间戳等额外字段,导致每次运行迁移作业获取的文件名不一致,无法每次迁移后自动导入GES图数据。 其他高级属性无需配置,单击“下一步”。 图14 vertex_user_rds2obs作业基础配置 图15 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, … 图16 vertex_user_rds2obs新增字段映射 调整字段顺序,点数据集将label调整至第2列,边数据集将label调整至第3列。调整完成后如图18所示,然后单击下一步。 图17 vertex_user_rds2obs调整字段顺序 图18 vertex_user_rds2obs字段映射 任务配置无需修改,直接保存并运行即可。 图19 任务配置 等待作业运行完成后,如果作业成功,则vertex_user.csv表已成功写入到OBS桶中。 图20 vertex_user_rds2obs作业运行成功 参考2到4,完成vertex_movie_rds2obs、edge_friends_rds2obs和edge_rate_rds2obs作业的创建,将4张原始表从MySQL标准化到OBS桶中。
  • 新建OBS到MySQL迁移作业 为方便演示,需要将OBS中的CSV格式的样例数据导入到MySQL数据库中。 在DataArts Studio数据集成控制台,进入“集群管理”页面,在集群列表中找到所需要的集群,单击“作业管理”。 在“作业管理”页面,单击“表/文件迁移”,再单击“新建作业”。 图8 表/文件迁移 按照如下步骤将数据源准备中的4张原始数据表,依次从OBS迁移到MySQL数据库中。 配置作业vertex_user_obs2rds。 源端的“源目录或文件”选择在数据源准备中上传到OBS的vertex_user.csv,由于表中有中文字符还需额外配置高级属性“编码类型”为“GBK”。目的端的“表名”选择在创建MySQL原始数据表中创建的vertex_user表。然后单击“下一步”。 图9 vertex_user_obs2rds作业配置 在字段映射中,检查字段映射顺序是否正确。如果字段映射顺序正确,单击下一步即可。 图10 vertex_user_obs2rds字段映射 任务配置无需修改,直接保存并运行即可。 图11 任务配置 等待作业运行完成后,如果作业成功,则vertex_user表已成功迁移到MySQL数据库中。 图12 vertex_user_obs2rds作业运行成功 参考2到4,完成vertex_movie_obs2rds、edge_friends_obs2rds和edge_rate_obs2rds作业的创建,将4张原始表从OBS迁移到MySQL中。
  • 表达式转换 使用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")
  • 约束限制 作业源端开启“使用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会默认第一列作为分布列,可能会有数据倾斜风险。
  • 创建数据表 本例中为了方便演示,我们需要通过数据集成将CSV格式的样例数据导入到MySQL数据库中,之后MySQL数据库即作为案例场景中的原始数据源端。因此在数据导入中,需要在MySQL数据库中预先创建原始数据表。 正式业务流程中,MySQL数据库源端数据需要导入OBS数据库作为点数据集和边数据集,这种到OBS的数据集成场景无需提前创建表。但MySQL数据库源端数据导入到MRS Hive时,需要在MRS Hive数据库中预先创建标准数据表。 因此,本例共涉及MySQL数据库创建原始数据表和在MRS Hive数据库中创建标准数据表。本例以执行SQL方式建表为例进行说明。 创建MySQL原始数据表。在MySQL中选择原始表所在的数据库后,执行如下SQL语句,按照数据源准备中的原始数据结构创建4个原始数据表。 DROP TABLE IF EXISTS `edge_friends`; CREATE TABLE `edge_friends` ( `user1` varchar(32) DEFAULT NULL, `user2` varchar(32) DEFAULT NULL ); DROP TABLE IF EXISTS `edge_rate`; CREATE TABLE `edge_rate` ( `user` varchar(32) DEFAULT NULL, `movie` varchar(64) DEFAULT NULL, `score` int(11) unsigned DEFAULT NULL, `datatime` varchar(32) DEFAULT NULL ); DROP TABLE IF EXISTS `vertex_movie`; CREATE TABLE `vertex_movie` ( `movie` varchar(64) DEFAULT NULL, `year` varchar(32) DEFAULT NULL, `genres` varchar(64) DEFAULT NULL ); DROP TABLE IF EXISTS `vertex_user`; CREATE TABLE `vertex_user` ( `user` varchar(32) DEFAULT NULL, `gender` varchar(32) DEFAULT NULL, `age` varchar(32) DEFAULT NULL, `occupation` varchar(32) DEFAULT NULL, `zip-code` varchar(32) DEFAULT NULL ); 创建MRS Hive标准数据表。 将原始数据结构根据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, … 您可以在DataArts Studio数据开发模块,选择在管理中心创建数据连接中创建的MRS Hive数据连接,并选择数据库后,执行如下SQL语句,在MRS Hive数据库中创建一个标准数据表。 图4 创建MRS Hive标准数据表 DROP TABLE IF EXISTS `edge_friends`; CREATE TABLE test_ges.`edge_friends` ( `user1` STRING COMMENT '', `user2` STRING COMMENT '', `label` STRING COMMENT '' ); DROP TABLE IF EXISTS `edge_rate`; CREATE TABLE test_ges.`edge_rate` ( `user` STRING COMMENT '', `movie` STRING COMMENT '', `label` STRING COMMENT '', `score` INT COMMENT '', `datatime` STRING COMMENT '' ); DROP TABLE IF EXISTS `vertex_movie`; CREATE TABLE test_ges.`vertex_movie` ( `movie` STRING COMMENT '', `label` STRING COMMENT '', `year` STRING COMMENT '', `genres` STRING COMMENT '' ); DROP TABLE IF EXISTS `vertex_user`; CREATE TABLE test_ges.`vertex_user` ( `user` STRING COMMENT '', `label` STRING COMMENT '', `gender` STRING COMMENT '', `age` STRING COMMENT '', `occupation` STRING COMMENT '', `zip-code` STRING COMMENT '' );
  • 路径和表名的时间宏变量 如图1所示,如果将: 源端的“表名”配置为“CDM_/${dateformat(yyyy-MM-dd)}”。 目的端的“写入目录”配置为“/opt/ttxx/${timestamp()}”。 经过宏定义转换,这个作业表示:将Oracle数据库的“SQOOP.CDM_20171016”表中数据,迁移到HDFS的“/opt/ttxx/1508115701746”目录中。 图1 源表名和写入目录配置为时间宏变量 目前也支持一个表名或路径名中有多个宏定义变量,例如“/opt/ttxx/${dateformat(yyyy-MM-dd)}/${timestamp()}”,经过转换后为“/opt/ttxx/2017-10-16/1508115701746”。
  • Where子句中的时间宏变量 以SQOOP.CDM_20171016表为例,该表中存在表示时间的列DS,如图2所示。 图2 表数据 假设当前时间为“2017-10-16”,要导出前一天的数据(即DS=‘2017-10-15’),则可以在创建作业时配置“Where子句”为DS='${dateformat(yyyy-MM-dd,-1,DAY)}',即可将符合DS=‘2017-10-15’条件的数据导出。
  • timestamp timestamp支持两种形式的参数: timestamp() 返回当前时间的时间戳,即从1970年到现在的毫秒数,如1508078516286。 timestamp(dateOffset, dateType) 返回经过时间偏移后的时间戳,“dateOffset”和“dateType”表示日期的偏移量以及偏移量的类型。 例如当前日期为“2017-10-16 09:00:00”,则“timestamp(-10, MINUTE)”返回当前时间点10分钟前的时间戳,即“1508115000000”。
  • 时间宏变量和定时任务配合完成增量同步 这里列举两个简单的使用场景: 数据库表中存在表示时间的列DS,类型为“varchar(30)”,插入的时间格式类似于“2017-xx-xx”。 定时任务中,重复周期为1天,每天的凌晨0点执行定时任务。配置“Where子句”为DS='${dateformat(yyyy-MM-dd,-1,DAY)}',这样就可以在每天的凌晨0点导出前一天产生的所有数据。 数据库表中存在表示时间的列time,类型为“Number”,插入的时间格式为时间戳。 定时任务中,重复周期为1天,每天的凌晨0点执行定时任务。配置“Where子句”为time between ${timestamp(-1,DAY)} and ${timestamp()},这样就可以在每天的凌晨0点导出前一天产生的所有数据。 其它的配置方式原理相同。
  • 时间变量宏定义具体展示 假设当前时间为“2017-10-16 09:00:00”,时间变量宏定义具体如表1所示。 表中示例实际使用时必须嵌在''中使用,比如需要以yyyy-MM-dd格式返回当前时间时,参数为'${dateformat(yyyy-MM-dd)}'。 表1 时间变量宏定义具体展示 宏变量 含义 实际显示效果 ${dateformat(yyyy-MM-dd)} 以yyyy-MM-dd格式返回当前时间。 2017-10-16 ${dateformat(yyyy/MM/dd)} 以yyyy/MM/dd格式返回当前时间。 2017/10/16 ${dateformat(yyyy_MM_dd HH:mm:ss)} 以yyyy_MM_dd HH:mm:ss格式返回当前时间。 2017_10_16 09:00:00 ${dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)} 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天。 2017-10-15 09:00:00 ${dateformat(yyyy-MM-dd, -1, DAY)} 00:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天0点。 2017-10-15 00:00:00 ${dateformat(yyyy-MM-dd, -1, DAY)} 12:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天12点。 2017-10-15 12:00:00 ${dateformat(yyyy-MM-dd, -N, DAY)} 00:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前N天的0点。 N为3时: 2017-10-13 00:00:00 ${dateformat(yyyy-MM-dd, -N, DAY)} 12:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前N天的12点。 N为3时: 2017-10-13 12:00:00 ${timestamp()} 返回当前时间的时间戳,即1970年1月1日(00:00:00 GMT)到当前时间的毫秒数。 1508115600000 ${timestamp(-10, MINUTE)} 返回当前时间点10分钟前的时间戳。 1508115000000 ${timestamp(dateformat(yyyyMMdd))} 返回今天0点的时间戳。 1508083200000 ${timestamp(dateformat(yyyyMMdd,-1,DAY))} 返回昨天0点的时间戳。 1507996800000 ${timestamp(dateformat(yyyyMMddHH))} 返回当前整小时的时间戳。 1508115600000
  • dateformat dateformat支持两种形式的参数: dateformat(format) format表示返回日期的格式,格式定义参考"java.text.SimpleDateFormat.java"中的定义。 例如当前日期为“2017-10-16 09:00:00”,则"yyyy-MM-dd HH:mm:ss"表示“2017-10-16 09:00:00”。 dateformat(format, dateOffset, dateType) format表示返回日期的格式。 dateOffset表示日期的偏移量。 dateType表示日期的偏移量的类型。 目前dateType支持以下几种类型:SECOND(秒),MINUTE(分钟),HOUR(小时),DAY(天),MONTH(月),YEAR(年)。 其中MONTH(月),YEAR(年)的偏移量类型存在特殊场景: 对于年、月来说,若进行偏移后实际没有该日期,则按照日历取该月最大的日期。 不支持在源端和目的端的“时间过滤”参数中的起始时间、终止时间使用年、月的偏移。 例如当前日期为"2023-03-01 09:00:00",则: "dateformat(yyyy-MM-dd HH:mm:ss, -1, YEAR)"表示当前时间的前一年,也就是"2022-03-01 09:00:00"。 "dateformat(yyyy-MM-dd HH:mm:ss, -3, MONTH)"表示当前时间的前三月,也就是"2022-12-01 09:00:00"。 "dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)"表示当前时间的前一天,也就是"2023-02-28 09:00:00"。 "dateformat(yyyy-MM-dd HH:mm:ss, -1, HOUR)"表示当前时间的前一小时,也就是"2023-03-01 08:00:00"。 "dateformat(yyyy-MM-dd HH:mm:ss, -1, MINUTE)"表示当前时间的前一分钟,也就是"2023-03-01 08:59:00"。 "dateformat(yyyy-MM-dd HH:mm:ss, -1, SECOND)"表示当前时间的前一秒,也就是"2023-03-01 08:59:59"。
  • 事务模式迁移 CDM的事务模式迁移,是指当CDM作业执行失败时,将数据回滚到作业开始之前的状态,自动清理目的表中的数据。 参数位置:创建表/文件迁移的作业时,如果目的端为关系型数据库,在目的端作业配置的高级属性中,可以通过“先导入阶段表”参数选择是否启用事务模式。 参数原理:如果启用,在作业执行时CDM会自动创建临时表,先将数据导入到该临时表,导入成功后再通过数据库的事务模式将数据迁移到目标表中;导入失败则将目的表回滚到作业开始之前的状态。 图1 事务模式迁移 如果“导入开始前”选择“清除部分数据”或“清除全部数据”,CDM的事务模式不会回滚已经删除的数据。 父主题: 数据集成(CDM作业)进阶实践
  • 新空间导入数据 请您登录控制台首页,选择并进入新工作空间的“数据开发”模块,然后执行如下操作依次导入资源、导入环境变量、导入脚本、导入作业。 导入资源 在数据开发主界面,单击左侧导航上的“资源管理”,进入资源管理页面。 单击资源目录中的,选择“导入资源”。 图8 选择导入资源 在弹出的导入资源窗口中,“文件位置”选择为“本地”,选择从旧空间导出的资源文件,“重名处理策略”默认选择“覆盖”,单击下一步。 图9 导入资源 资源开始导入,导入成功后系统会显示导入的资源名。 图10 导入资源成功 导入环境变量 单击左侧导航上的“配置”,进入环境变量页面。 单击环境变量配置下的“导入”,导入环境变量。 图11 选择导入环境变量 在弹出的导入环境变量窗口中,“文件位置”选择为“本地”,选择从旧空间导出的环境变量文件,“重名处理策略”默认选择“覆盖”,单击下一步。 图12 导入环境变量 环境变量开始导入,导入前系统会提示是否要修改变量值,确定后环境变量即可导入成功。 图13 导入结果确认 导入脚本 单击左侧导航上的“脚本开发”,进入脚本目录。 单击脚本目录中的,选择“导入脚本”。 图14 选择导入脚本 在弹出的导入脚本窗口中,“文件位置”选择为“本地”,选择从旧空间导出的脚本文件,“重名处理策略”默认选择“覆盖”,单击下一步。 图15 导入脚本 脚本开始导入,导入成功后系统会显示导入的脚本名。 图16 导入脚本成功 导入作业 单击脚本目录树上方的,切换到作业界面。 单击作业目录中的,选择“导入作业”。 图17 选择导入作业 在弹出的导入作业窗口中,“文件位置”选择为“本地”,选择从旧空间导出的作业文件,单击下一步。 图18 导入作业 作业开始导入,导入成功后系统会显示导入的作业名。 图19 导入作业成功
  • 新空间导入资源 请您登录控制台首页,选择并进入新工作空间的“管理中心”模块,然后执行如下操作进行资源导入。 在管理中心页面,单击“资源迁移”,进入资源迁移页面。 图6 资源迁移 单击“导入文件”,选择导入方式后,配置待导入资源的OBS或本地路径。待导入的资源应为通过导出获取的zip文件。 图7 配置待导入的资源存储路径 单击“导入文件”,上传待导入资源。待导入的资源应为通过导出获取的zip文件 单击“下一步”,勾选导入的资源类型。 图8 勾选导入的资源类型 如果选择导入数据源,则单击“下一步”需要配置数据连接。 图9 配置数据连接 单击“下一步”,等待导入任务下发,导入任务成功下发后系统提示“导入开始”。 图10 导入开始 系统提示“导入开始”后,单击“确定”,可在资源迁移任务列表中查看导入结果。 其中存在子任务失败时,可单击红色子任务名,查看失败原因。 图11 查看导入结果
  • 旧空间导出资源 请您登录控制台首页,选择并进入旧工作空间的“管理中心”模块,然后执行如下操作进行资源导出。 参考访问DataArts Studio实例控制台,登录DataArts Studio管理控制台。 在DataArts Studio控制台首页,选择对应工作空间的“管理中心”模块,进入管理中心页面。 在管理中心页面,单击“资源迁移”,进入资源迁移页面。 图1 资源迁移 单击“导出文件”,配置文件的OBS存储位置和文件名称。 图2 选择导出文件 单击“下一步”,勾选导出的模块。 图3 勾选导出的模块 单击“下一步”,等待导出完成,资源包导出到所设置的OBS存储位置。 图4 导出完成 导出资源耗时1分钟仍未显示结果则表示导出失败,请重试。如果仍然无法导出,请联系客服或技术支持人员协助解决。 导出完成后可在资源迁移任务列表中,单击对应任务的“下载”按钮,本地获取导出的资源包。 图5 下载导出结果
  • 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
  • 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
  • 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
  • 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
  • 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
  • 创建表/文件迁移作业 在创建表/文件迁移作业时,选择已创建的源端连接器、目的端连接器。 图1 配置作业 单击“下一步”,进入“字段映射”配置页面后,单击源字段图标。 图2 配置字段映射 选择“自定义字段”页签,填写字段名称及字段值后单击“确认”按钮,例如: 名称:InputTime。 值:${timestamp()},更多时间宏变量请参见表1。 图3 添加字段 表1 时间变量宏定义具体展示 宏变量 含义 实际显示效果 ${dateformat(yyyy-MM-dd)} 以yyyy-MM-dd格式返回当前时间。 2017-10-16 ${dateformat(yyyy/MM/dd)} 以yyyy/MM/dd格式返回当前时间。 2017/10/16 ${dateformat(yyyy_MM_dd HH:mm:ss)} 以yyyy_MM_dd HH:mm:ss格式返回当前时间。 2017_10_16 09:00:00 ${dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)} 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天。 2017-10-15 09:00:00 ${dateformat(yyyy-MM-dd, -1, DAY)} 00:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天0点。 2017-10-15 00:00:00 ${dateformat(yyyy-MM-dd, -1, DAY)} 12:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前一天12点。 2017-10-15 12:00:00 ${dateformat(yyyy-MM-dd, -N, DAY)} 00:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前N天的0点。 N为3时: 2017-10-13 00:00:00 ${dateformat(yyyy-MM-dd, -N, DAY)} 12:00:00 以yyyy-MM-dd HH:mm:ss格式返回时间,时间为当前时间的前N天的12点。 N为3时: 2017-10-13 12:00:00 ${timestamp()} 返回当前时间的时间戳,即1970年1月1日(00:00:00 GMT)到当前时间的毫秒数。 1508115600000 ${timestamp(-10, MINUTE)} 返回当前时间点10分钟前的时间戳。 1508115000000 ${timestamp(dateformat(yyyyMMdd))} 返回今天0点的时间戳。 1508083200000 ${timestamp(dateformat(yyyyMMdd,-1,DAY))} 返回昨天0点的时间戳。 1507996800000 ${timestamp(dateformat(yyyyMMddHH))} 返回当前整小时的时间戳。 1508115600000 添加完字段后,新增的字段在界面不显示样值,不会影响字段值的传输,CDM会将字段值直接写入目的端。 这里“添加字段”中“自定义字段”的功能,要求源端连接器为JDBC连接器、HBase连接器、MongoDB连接器、ElasticSearch连接器、Kafka连接器,或者目的端为HBase连接器。 添加完字段后,请确保自定义入库时间字段与目的端表字段类型相匹配。 单击“下一步”配置任务参数,一般情况下全部保持默认即可。 单击“保存并运行”,回到作业管理的表/文件迁移界面,在作业管理界面可查看作业执行进度和结果。 作业执行成功后,单击作业操作列的“历史记录”,可查看该作业的历史执行记录、读取和写入的统计数据。 在历史记录界面单击“日志”,可查看作业的日志信息。 前往目的端数据源查看数据迁移的入库时间。
  • 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加密。 父主题: 数据集成(CDM作业)进阶实践
  • 操作步骤 修改CDM迁移作业,通过使用SQL语句的方式迁移。 SQL语句格式为:“select id,cast(原字段名 as INT) as 新字段名可以和原字段名一样 from schemaName.tableName;” 例如:select `id`, `name`, cast(`gender` AS char(255) ) AS `gender` from `test_1117869`.`test_no_support_type`; 转换后的字段就转换为CDM支持的数据类型。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全