华为云用户手册

  • str_translate 函数格式 str_translate(value, replace_string, mapping_string) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被替换的原字符串。 replace_string 任意(自动转为String) 是 需要替换的字符集合。 mapping_string 任意(自动转为String) 是 替换后的字符集合。 返回结果 处理后的字符串。 函数示例 测试数据:无 加工规则 e_set("str_translate", str_translate("lts", "ts", "34")) 加工结果 str_translate: l34
  • str_reverse 函数格式 str_reverse(value) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被反转的值 返回结果 反转后的字符串。 函数示例 测试数据 { "data": "switch" } 加工规则 e_set("reverse_data", str_reverse(v("data"))) 加工结果 data: switch reverse_data: hctiws
  • str_join 函数格式 str_join(connector, str1, str2, ...) 参数说明 参数名称 参数类型 是否必填 说明 connector 任意(自动转为string) 是 连接符,比如#,$,%等 str1 任意(自动转为string) 是 待连接的值1 str2 任意(自动转为string) 是 待连接的值2 返回结果 连接后的字符串。 函数示例 测试数据:无 加工规则 e_set("email", str_join("@", "lts", "aa", "com")) 加工结果 email: lts@aa@com
  • str_zip 函数格式 str_zip(value1,value2,combine_sep=None,sep=None,quote=None,lparse=None,rparse=None) 参数说明 参数名称 参数类型 是否必填 说明 value1 任意(自动转为String) 是 需要被合并的值。 value2 任意(自动转为String) 是 需要被合并的值。 combine_sep 任意(自动转为String) 否 合并时元素之间的合并标识,默认为# sep 任意(自动转为String) 否 合并后元素之间的分隔符,仅支持单个字符,默认为, quote 任意(自动转为String) 否 将合并后的元素括起来的字符,当值包含分隔符时需要使用,默认为" lparse 任意(自动转为String) 否 指定value1中元素之间的分隔符和引用符,默认分隔符为,,默认引用符为"。格式为lparse=(',', '"')。 说明 引用符优先级高于分隔符。 rparse 任意(自动转为String) 否 指定value2中元素之间的分隔符和引用符,默认分隔符为,,默认引用符为"。格式为rparse=(',', '"')。 说明 引用符优先级高于分隔符。 返回结果 合并后的字符串。 函数示例 示例1:sep的使用。 测试数据 { "key1": "value1,value11", "key2": "value2,value21" } 加工规则 e_set("combine", str_zip(v("key1"), v("key2"), sep="|")) 加工结果 key1: value1,value11 key2: value2,value21 combine: value1#value2|value11#value21 示例2:quote的使用。 测试数据 { "key1": "\"value1, value2\", value3, \"value4,value5\"", "key2": "value11,\"value12,value13\",value14" } 加工规则 e_set("combine", str_zip(v("key1"), v("key2"), quote='|')) 加工结果 key1: "value1, value2", value3, "value4,value5" key2: value11,"value12,value13",value14 combine: |value1,value2#value11|,|value3#value12,value13|,|value4,value5#value14| 示例3:不同长度的值。 测试数据 { "key1": "value1,value2", "key2": "value11,value12,value13" } 加工规则 e_set("combine", str_zip(v("key1"), v("key2"))) 加工结果 key1: value1,value2 key2: value11,value12,value13 combine: value1#value11,value2#value12 示例4:lparse和rparse的使用。 测试数据 { "key1": "|value1, value1|, value2, |value3,value3|", "key2": "value11, #value12,value12#, value13" } 加工规则 e_set("combine", str_zip(v("key1"), v("key2"), lparse=(",", '|'), rparse=(",", '#'))) 加工结果 key1: |value1, value1|, value2, |value3,value3| key2: value11, #value12,value12#, value13 combine: "value1,value1#value11","value2#value12,value12","value3,value3#value13"
  • str_format 函数格式 str_format(format, str1, str2, ...) 参数说明 参数名称 参数类型 是否必填 说明 format string 是 转换后的格式 str1 任意 是 待格式化的值1 str2 任意 是 待格式化的值2 返回结果 格式化后的字符串。 函数示例 测试数据:无 加工规则 e_set("result", str_format("{}={}", "lts", 8)) 加工结果 result: lts=8
  • str_expandtabs 将字符串中的\t转为空格。 函数格式 str_expandtabs(value, tabsize) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被修改的原字符串。 tabsize Number 否 指定转换后空格的字符数。 返回结果 处理后的字符串。 函数示例 示例1:把key中的\t字符转为空格。 测试数据 { "key": "this is\tlts" } 加工规则 e_set("str_expandtabs", str_expandtabs(v("key"))) 加工结果 key: this is\tlts str_expandtabs: this is lts 示例2:把key中的\t字符转为空格,并填充指定空格的数量。 测试数据 { "key": "this is\tlts" } 加工规则 e_set("str_expandtabs", str_expandtabs(v("key"), 5)) 加工结果 key: this is\tlts str_expandtabs: this is lts
  • str_zfill 用字符0从开头将字符串填充至指定长度。 函数格式 str_zfill(value, width) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被修改的原字符串。 width Number 是 填充后字符串的总长度。 返回结果 处理后的字符串。 函数示例 测试数据 { "value": "this is lts" } 加工规则 e_set("str_zfill", str_zfill(v("value"), 20)) 加工结果 value: this is lts str_zfill: 000000000this is lts
  • str_partition 根据指定的分隔符将字符串从左往右分割为三部分。 函数格式 str_partition(value, substr) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被分割的字符串。 substr 任意(自动转为String) 否 指定的分隔符。 返回结果 分隔后的列表。 函数示例 测试数据 { "address":"big.middle.small" } 加工规则 e_set("str_partition", str_partition(v("address"), ".")) 加工结果 address: big.middle.small str_partition: ["big",".","middle.small"]
  • str_rpartition 根据指定的分隔符将字符串从右往左分割为三部分。 函数格式 str_rpartition(value, substr) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被分割的原字符串。 substr 任意(自动转为String) 否 指定的分隔符。 返回结果 分隔后的列表。 函数示例 测试数据 { "address":"big.middle.small" } 加工规则 e_set("str_partition", str_rpartition(v("address"), ".")) 加工结果 address: big.middle.small str_partition: ["big.middle",".","small"]
  • str_rjust 用指定字符将原字符串从开头填充至指定长度。 函数格式 str_rjust(value, width, fillchar) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被修改的原字符串。 width Number 是 填充后字符串的总长度。 fillchar 任意(自动转为String) 否 填充字符,默认为空格。 返回结果 处理后的字符串。 函数示例 测试数据 { "value": "lts is a log service" } 加工规则 e_set("str_rjust", str_rjust(v("value"), 30, "*")) 加工结果 value: lts is a log service str_ljust: **********lts is a log service
  • str_center 用指定字符将字符串填充到指定长度。 函数格式 str_center(value, width, fillchar) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被修改的原字符串。 width Number 是 填充后字符串的总长度。 fillchar 任意(自动转为String) 否 填充字符,默认为空格。 返回结果 处理后的字符串。 函数示例 测试数据 { "value": "lts is a log service" } 加工规则 e_set("str_center", str_center(v("value"), 40, "*")) 加工结果 center: lts is a log service str_center: **********lts is a log service**********
  • str_ljust 用指定字符将原字符串从结尾填充至指定长度。 函数格式 str_ljust(value, width, fillchar) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被修改的原字符串。 width Number 是 填充后字符串的总长度。 fillchar 任意(自动转为String) 否 填充字符,默认为空格。 返回结果 处理后的字符串。 函数示例 测试数据 { "value": "lts is a log service" } 加工规则 e_set("str_ljust", str_ljust(v("value"), 30, "*")) 加工结果 value: lts is a log service str_ljust: lts is a log service**********
  • str_startswith 判断字符串是否以指定字符串开头。 函数格式 str_startswith(value, prefix, start, end) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被判断的原字符串。 prefix 任意(自动转为String) 是 前缀规则。该参数可以是一个字符串或者是一个元素。 start Number 否 字符串检测的起始位置。0表示第一个字符,-1表示倒数第一个字符。 end Number 否 字符串检测的结束位置。0表示第一个字符,-1表示倒数第一个字符。 返回结果 如果字符串以指定前缀开头则返回true,否则返回false。 函数示例 测试数据 { "name": "lts is a log service" } 加工规则 e_set("str_startswith",str_startswith(v("name"), "lts")) 加工结果 name: lts is a log service str_startswith: true
  • str_split 通过指定分隔符对字符串进行分割。 函数格式 str_split(value, sep=None, maxsplit=-1) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被分割的原字符串。 sep Number 否 分隔符,None表示空格。 maxsplit Number 否 最大分裂数。-1表示不限制。 返回结果 处理后的字符串。 函数示例 测试数据 { "content": "lts,a,log,service" } 加工规则 e_set("str_split", str_split(v("content"), ",")) 加工结果 content: lts,a,log,service str_split: ["lts","a","log","service"]
  • str_rfind 判断原字符串中是否包含指定的子字符串。 函数格式 str_rfind(value, substr, beg, end) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 被查找的原字符串。 substr 任意(自动转为String) 是 需要查找的字符。 beg Number 否 开始查找的位置,默认为0。 end Number 否 结束查找的位置,默认为字符串的长度。 返回结果 返回字符或字符串最后一次出现的位置。 函数示例 测试数据 { "name": "lts is a log service" } 加工规则 e_set("str_rfind", str_rfind(v("name"), "i")) 加工结果 name: lts is a log service str_rfind: 17
  • str_endswith 判断字符串是否以指定后缀结尾。 函数格式 str_endswith(value, suffix, start, end) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被判断的原字符串。 suffix 任意(自动转为String) 是 后缀结尾规则。该参数可以是一个字符串或者是一个元素。 start Number 否 字符串检测的起始位置。0表示第一个字符,-1表示倒数第一个字符。 end Number 否 字符串检测的结束位置。0表示第一个字符,-1表示倒数第一个字符。 返回结果 如果字符串以指定后缀结尾则返回true,否则返回false。 函数示例 测试数据 { "name": "lts is a log service" } 加工规则 e_set("str_endswith",str_endswith(v("name"), "service")) 加工结果 name: lts is a log service str_endswith: true
  • str_splitlines 通过换行符对字符串进行分割。 函数格式 str_splitlines(value, keepends) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被分割的原字符串。 keepends Boolean 否 在输出结果里是否去掉换行符(\r、\r\n、\n)。默认为false,不包含换行符,如果为true,则保留换行符。 返回结果 处理后的列表。 函数示例 测试数据 { "value": "lts\nis\ra\r\n" } 加工规则 e_set("str_splitlines", str_splitlines(v("value"), false)) 加工结果 value: lts\nis\ra\r\n str_splitlines: ['lts','is','a']
  • str_find 判断原字符串中是否包含指定的子字符串。 函数格式 str_find(value, str, begin, end) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 需要被查找的原字符串。 str 任意(自动转为String) 是 指定查找的子字符串。 begin Number 否 开始索引的位置。默认为0表示第一个字符,-1表示倒数第一个字符。 end Number 否 结束索引的位置。默认为字符串的长度。0表示第一个字符,-1表示倒数第一个字符。 返回结果 指定子字符串在原字符串中的位置。如果指定的子字符串在原字符串中出现多次,只返回第一次出现的子字符串的位置。 函数示例 测试数据 { "name": "lts is a log service" } 加工规则 e_set("str_find",str_find(v("name"), "l")) 加工结果 name: lts is a log service str_find: 0
  • str_count 统计字符串里某个字符出现的次数。 函数格式 str_count(value, sub, start, end) 参数说明 参数名称 参数类型 是否必填 说明 value 任意(自动转为String) 是 被统计的原字符串。 sub 任意(自动转为String) 是 需要统计个数的字符。 start Number 否 字符串开始搜索的位置。 0(默认值):第一个字符。 -1:最后一个字符。 end Number 否 字符串中结束搜索的位置。 0:第一个字符。 -1(默认值):最后一个字符。 返回结果 返回指定字符出现的次数。 函数示例 测试数据 { "name": "lts is a log service" } 加工规则 e_set("str_count", str_count(v("name"), "l")) 加工结果 name: lts is a log service str_count: 2
  • 操作步骤 本小节以RDS for MySQL到 MRS Hudi的实时同步为示例,介绍如何配置Migration实时集成作业。配置作业前请务必阅读使用前自检概览, 确认已做好所有准备工作。 参见新建实时集成作业创建一个实时集成作业并进入作业配置界面。 选择数据连接类型:源端选MySQL,目的端选Hudi。 图2 选择数据连接类型 选择集成作业类型:同步类型默认为实时,同步场景包含整库和分库分表场景。 图3 选择集成作业类型 同步场景相关介绍请参见同步场景。 配置网络资源:选择已创建的MySQL、MRS Hudi数据连接和已配置好网络连接的migration资源组。 图4 选择数据连接及migration资源组 无可选数据连接时,可单击“新建”跳转至管理中心数据连接界面,单击“创建数据连接”创建数据连接,详情请参见配置 DataArts Studio 数据连接参数进行配置。 无可选migration资源组时,可单击“新建”跳转至购买migration资源组页面创建migration资源组配置,详情请参见购买创建数据集成资源组增量包进行配置。 检测网络连通性:数据连接和migration资源组配置完成后需要测试整个迁移任务的网络连通性,可通过以下方式进行数据源和migration资源组之间的连通性测试。 单击展开“源端配置”触发连通性测试,会对整个迁移任务的连通性做校验。 单击源端和目的端数据源和migration资源组中的“测试”按钮进行检测。 网络连通性检测异常可先参考数据源和资源组网络不通如何排查?章节进行排查。 配置源端参数。 各同步场景下选择需要同步库表的方式请参考表5。 表5 选择需要同步的库表 同步场景 配置方式 整库 选择需要迁移的MySQL库表。 图5 选择库表 库与表均支持自定义选择,即可选择一库一表,也可选择多库多表。 分库分表 添加逻辑表。 逻辑表名:即最终写入到Hudi的表名。 源库过滤条件:支持填入正则表达式,在所有MySQ L实例 中通过该正则表达式过滤出要写入目标端Hudi汇聚表的所有分库。 源表过滤条件:支持填入正则表达式,在过滤出的源端分库中再次过滤出要写入目标端Hudi汇聚表的所有分表。 图6 添加逻辑表 已添加的逻辑表支持预览表结构及来源库表,单击“操作”列的预览即可。预览逻辑表时,源表数量越多,等待时间可能越长,请耐心等待。 图7 逻辑表预览 配置目的端参数。 源库表和目标匹配策略。 各同步场景下源端库表和目标端库表的匹配策略请参考表6。 表6 源库表和目标匹配策略 同步场景 配置方式 整库 库匹配策略。 与来源库同名:数据将同步至与来源MySQL库名相同的Hudi库中。 自定义:数据将同步至自行指定的Hudi库中。 表匹配策略。 与来源表同名:数据将同步至与来源MySQL表名相同的Hudi表中。 自定义:数据将同步至自行指定的Hudi表中。 图8 整库场景下源库表和目标匹配策略 说明: 自定义匹配策略时,支持用内置变量#{source_db_name}和#{source_table_name}标志来源的库名和表名,其中表匹配策略必须包含#{source_table_name}。 分库分表 目标端库名:数据将同步至指定的Hudi库中。 表匹配策略:默认与源端配置中填写的逻辑表同名。 图9 分库分表场景下源库表和目标匹配策略 Hudi参数配置。 其余Hudi目的端参数说明请参考表7。 图10 Hudi目的端配置项 表7 Hudi目的端配置项 配置项 默认值 单位 配置说明 数据存储路径 - - Hudi自动建表时的warehouse路径,每张表会在warehouse路径下创建子目录。支持填写HDFS和OBS路径,路径格式参考: OBS路径:obs://bucket/warehouse。 HDFS路径:/tmp/warehouse。 Hudi表属性全局配置 - - 支持通过参数配置部分高级功能,参数详情可参考Hudi高级配置一览表。 Compaction作业 - - 需要一个独立的SparkSql作业,不使用则由Flink执行compaction。 表8 Hudi高级配置一览表 参数名 参数类型 默认值 单位 参数说明 index.type string BLOOM - Hudi表索引类型。 支持BLOOM和BUCKET索引,数据量较大场景下强烈建议使用BUCKET索引性能更好。 hoodie.bucket.index.num.buckets int 256 个 Hudi表单分区下Bucket桶数。 说明: 使用Hudi BUCKET表时需要设置Bucket桶数,桶数设置关系到表的性能,需要格外引起注意。 非分区表桶数 = MAX(单表数据量大小(G)/2G*2,再向上取整,4)。 分区表桶数 = MAX(单分区数据量大小(G)/2G*2,再后向上取整,1)。 其中,要注意的是: 需要使用的是表的总数据大小,而不是压缩以后的文件大小。 桶的设置以偶数最佳,非分区表最小桶数请设置4个,分区表最小桶数请设置1个。 changelog.enabled boolean false - Hudi changelog功能开关,开启后Migration作业可输出DELETE和UPDATE BEFORE数据。 logical.delete.enabled boolean true - 逻辑删除开关,changelog开启时必须关闭逻辑删除。 hoodie.write.liststatus.optimized boolean true - 写log文件时是否开启liststatus优化。涉及到大表和分区数据量多的作业,在启动时list会非常耗时,可能导致作业启动超时,建议关闭。 hoodie.index.liststatus.optimized boolean false - 定位数据时是否开启liststatus优化。涉及到大表和分区数据量多的作业,在启动时list会非常耗时,可能导致作业启动超时,建议关闭。 compaction.async.enabled boolean true - 异步compaction开关。compaction操作一定程度会影响实时任务的写入性能,如果用户使用外置的compaction操作对hudi进行compaction,可以考虑设置为false关闭实时处理集成作业的compaction操作。 compaction.schedule.enabled boolean true - 生成compaction计划的开关。compaction计划必须由本服务生成,计划的执行可以交给Spark。 compaction.delta_commits int 5 次 生成compaction request的频率。compaction request生成频率降低可以使得compaction频率降低从而提升作业性能。如果hudi增量数据较小。可以考虑增大该值。 说明: 例如配置为40,即每40次commit生成一个compaction request,因为Migration每分钟生成1个commit,那么每个compaction request将间隔40分钟。 clean.async.enabled boolean true - 做历史版本数据文件清理的开关。 clean.retain_commits int 30 次 要保留的commit数。这些commit关联的数据文件版本将被保留 num_of_commits * time_between_commits 这么长的时间,建议配置为2倍的compaction.delta_commits。 说明: 例如配置为80,因为Migration每分钟生成1个commit,那么超过80分钟后如果有旧版本数据文件 ,则会生成clean request,且在执行clean时保留最近80个commit。 hoodie.archive.automatic boolean true - Hudi commit文件老化开关。 archive.min_commits int 40 次 将旧版commit归档到日志文件中时要保留不归档的最小commit数。 建议配置成clean.retain_commits + 1。 说明: 例如配置成81,那么在触发归档动作时,将会保留最近81次commit文件。 archive.max_commits int 50 次 触发归档动作的commit数。 建议配置成archive.min_commits + 20。 说明: 例如配置成101,那么将在生成101个commit文件后触发归档commit文件动作。 为了达到Migration作业性能最优,建议使用Hudi Bucket索引的MOR表,并根据实际数据量配置Bucket桶数。 为了保证Migration作业的稳定性,建议将Hudi Compaction单独拆成Spark作业交由MRS执行,在Migration任务里仅开启生成compaction计划,具体可以参考如何配置Hudi Compaction的Spark周期任务?。 刷新源表和目标表映射,检查映射关系是否正确,同时可根据需求修改表属性、添加附加字段,并通过“自动建表”能力在目的端Hudi数据库中建出相应的表。 图11 源表与目标表映射 同步主键 Hudi表必须设置“同步主键”,在源端为非主键表时,必须在字段映射阶段手动勾选主键。 表属性编辑 单击操作列“表属性编辑”可配置Hudi表属性,包含表类型,分区类型及表自定义属性。 图12 Hudi表属性配置 表类型:MERGE_ON_READ、COPY_ON_WRITE。 分区类型:无分区、时间分区、自定义分区。 其中时间分区需要用户指定一个源端字段名,选择一个时间转换格式。 比如时间分区用户指定一个源端字段名src_col_1,选择一个时间转换格式,日(yyyyMMdd)、月(yyyyMM)、年(yyyy),自动建表时会在Hudi表默认创建一个cdc_partition_key的字段,系统会根据配置的时间转换格式将源端字段(src_col_1)的值格式化后写入cdc_partition_key中。 自定义分区不支持timestamp类型的字段,使用timestamp类型的字段会导致作业失败。 表自定义属性:支持通过参数配置单表的部分高级功能,参数详情可参考Hudi高级配置一览表。 附加字段编辑:单击操作列“附加字段编辑”可为目的端的Hudi表中增加自定义字段,同时附加字段也会额外加入到Hudi表的建表中。用户可以在已有的源表字段基础上添加多个附加字段,并自定义字段名、选择字段类型、填写字段值。 字段名称:目的端Hudi表新增字段的名称。 字段类型:目的端Hudi表新增字段的类型。 字段值:目的端Hudi表新增字段的取值来源。 表9 附加字段取值方式 类型 示例 常量 自定义常量类型的附加字段值,可以包含输入数字、字母、中文、字符。表情包或特殊字符可能导致作业提交失败,需谨慎使用。 内置变量 源端host ip地址:source.host。 源端schema名称:source.schema。 源端table名称:source.table。 目的端schema名称:target.schema。 目的端table名称:target.table。 源表字段 源表中的任一字段。 配置附加字段的取值来源于源表字段时,请注意任务运行过程中不能修改对应源表字段的名称,否则可能导致作业异常。 udf方法 substring(#col, pos[, len]): 截取源端col列的子串, 范围在[pos, pos+len)。 date_format(#col, time_format[, src_tz, dst_tz]): 将源端col列按time_format格式化, 可选转换时区。 now([tz]): 获取指定时区的当前时间。 if(cond_exp, str1, str2): 满足条件表达式cond_exp时返回str1, 否则返回str2。 concat(#col[, #str, ...]): 拼接多个参数, 可为源端列或字符串。 from_unixtime(#col[, time_format]): 将unix时间戳按time_format格式化。 unix_timestamp(#col[, precision, time_format]): 将时间转成unix时间戳,可显式定义时间格式及转换后精度,time_format时间格式要与源端保持一致。 自动建表:单击“自动建表”可按照已配置映射规则在目的端数据库自动建表,成功后表建立方式会显示为使用已有表。 图13 自动建表 Migration仅支持自动建表,不支持自动建库和模式,需用户自行在目的端手动建出库和模式后再使用本功能建表。 自动建表时对应的字段类型映射关系请参见字段映射关系章节。 自动建出的Hudi表会带有3个审计字段,分别是cdc_last_update_date、logical_is_deleted、_hoodie_event_time,并会以_hoodie_event_time作为Hudi表的预聚合键。 配置DDL消息处理规则。 实时集成作业除了能够同步对数据的增删改等DML操作外,也支持对部分表结构变化(DDL)进行同步。针对支持的DDL操作,用户可根据实际需求配置为正常处理/忽略/出错。 正常处理:Migration识别到源端库表出现该DDL动作时,作业自动同步到目的端执行该DDL操作。 忽略:Migration识别到源端库表出现该DDL动作时,作业忽略该DDL,不同步到目的端表中。 出错:Migration识别到源端库表出现该DDL动作时,作业抛出异常。 图14 DDL配置 配置任务属性。 表10 任务配置参数说明 参数 说明 默认值 执行内存 作业执行分配内存,跟随处理器核数变化而自动变化。 8GB 处理器核数 范围:2-32。 每增加1处理核数,则自动增加4G执行内存和1并发数。 2 并发数 作业执行支持并发数。该参数无需配置,跟随处理器核数变化而自动变化。 1 自动重试 作业失败时是否开启自动重试。 否 最大重试次数 “自动重试”为是时显示该参数。 1 重试间隔时间 “自动重试”为是时显示该参数。 120秒 是否写入脏数据 选择是否记录脏数据,默认不记录脏数据,当脏数据过多时,会影响同步任务的整体同步速度。 否:默认为否,不记录脏数据。 表示不允许脏数据存在。如果同步过程中产生脏数据,任务将失败退出。 是:允许脏数据,即任务产生脏数据时不影响任务执行。 允许脏数据并设置其阈值时: 若产生的脏数据在阈值范围内,同步任务将忽略脏数据(即不会写入目标端),并正常执行。 若产生的脏数据超出阈值范围,同步任务将失败退出。 说明: 脏数据认定标准:脏数据是对业务没有意义,格式非法或者同步过程中出现问题的数据;单条数据写入目标数据源过程中发生了异常,则此条数据为脏数据。 因此只要是写入失败的数据均被归类于脏数据。 例如,源端是VARCHAR类型的数据写到INT类型的目标列中,则会因为转换不合理导致脏数据不会成功写入目的端。用户可以在同步任务配置时,配置同步过程中是否写入脏数据,配置脏数据条数(单个分片的最大错误记录数)保证任务运行,即当脏数据超过指定条数时,任务失败退出。 否 脏数据策略 “是否写入脏数据”为是时显示该参数,当前支持以下策略: 不归档:不对脏数据进行存储,仅记录到任务日志中。 归档到OBS:将脏数据存储到OBS中,并打印到任务日志中。 不归档 脏数据写入连接 “脏数据策略”选择归档到OBS时显示该参数。 脏数据要写入的连接,目前只支持写入到OBS连接。 - 脏数据目录 脏数据写入的OBS目录。 - 脏数据阈值 是否写入脏数据为是时显示该参数。 用户根据实际设置脏数据阈值。 说明: 脏数据阈值仅针对每个并发生效。比如阈值为100,并发为3,则该作业可容忍的脏数据条数最多为300。 输入-1表示不限制脏数据条数。 100 添加自定义属性 支持通过自定义属性修改部分作业参数及开启部分高级功能,详情可参见任务性能调优章节。 - 提交并运行任务。 作业配置完毕后,单击作业开发页面左上角“提交”,完成作业提交。 图15 提交作业 提交成功后,单击作业开发页面“启动”按钮,在弹出的启动配置对话框按照实际情况配置同步位点参数,单击“确定”启动作业。 图16 启动配置 表11 启动配置参数 参数 说明 同步模式 增量同步:从指定时间位点开始同步增量数据。 全量+增量:先同步全量数据,随后实时同步增量数据。 时间 增量同步需要设置该参数,指示增量同步起始的时间位点。 说明: 配置的位点时间早于Binlog日志最早时间点时,默认会以日志最早时间点开始消费。 监控作业。 通过单击作业开发页面导航栏的“前往监控”按钮,可前往作业监控页面查看运行情况、监控日志等信息,并配置对应的告警规则,详情请参见实时集成任务运维。 图17 前往监控
  • 如何确认本地设备是否安装SSH服务及SSH服务的安装版本? 在本地设备上打开命令提示符窗口,以Windows 10操作系统为例,方法如下: 同时按下“Win + R”,在打开的“运行”对话框中输入cmd,按“Enter”。 输入ssh命令,按“Enter”。 如果没有报错,出现下图内容,说明系统自带SSH。 如果出现下图报错现象,则需要下载SSH软件,如OpenSSH。 可通过如下链接下载:https://www.mls-software.com/files/setupssh-8.1p1-1.exe 安装SSH时要求SSH版本为6.5及以上版本。安装完成后可通过ssh -V命令查询SSH版本。 若下载并安装SSH软件后,执行ssh命令仍报错,请重启本地设备后再次尝试。 父主题: 咨询类
  • 步骤2:通过ADB连接云手机 下载ADB工具。 访问https://developer.android.com/studio/releases/platform-tools,在页面右上角切换语言为“English”,选择“Download SDK Platform-Tools for Windows”。 在弹出的对话框中勾选“I have read and agree with the above terms and conditions”,并单击“DOWNLOAD ANDROID SDK PLATFORM-TOOLS FOR WINDOWS”进行下载。 如果您无法访问上述网站,也可以单击如下链接下载: https://dl.google.com/android/repository/platform-tools-latest-windows.zip 下载后得到“platform-tools_r29.0.5-windows.zip”文件,解压该zip文件至您选定的目录,例如“C:\Users\Administrator\Downloads”。 “platform-tools_r29.0.5-windows.zip”文件中的版本号“29.0.5”仅为示例,请以实际下载的版本为准。 打开命令提示符窗口,进入“C:\Users\Administrator\Downloads\platform-tools”目录。 在步骤1:建立SSH隧道中,如果执行建立SSH隧道的命令后提示“Authorized users only. All activities may be monitored and reported.”,请保持该窗口不关闭,并重新打开一个命令提示符窗口进行本步骤操作。 cd C:\Users\Administrator\Downloads\platform-tools 执行如下ADB命令,创建与云手机的ADB连接。 adb connect 127.0.0.1:本地空闲端口 其中,本地空闲端口为2中所使用的空闲端口。 示例:adb connect 127.0.0.1:1234 检测当前端口是否已连接,可输入adb devices命令检查。 ADB连接的故障排查,请参考如下链接: ADB连接云手机时报错“unable to connect to :5555”? ADB连接突然中断,如何解决?
  • 步骤1:建立SSH隧道 在本地设备打开命令提示符窗口,以Windows 10操作系统为例,方法如下: 同时按下“Win + R”,在打开的“运行”对话框中输入cmd,按“Enter”。 执行以下命令,建立SSH隧道。 ssh -L 本地空闲端口:云手机监听地址 SSH隧道用户名@公网IP地址 -i 私钥文件路径 -o ServerAliveInterval=30 -Nf 各参数说明及获取方式如下所述: 本地空闲端口:用户自由选择的本地设备中任意未被占用的端口,通过该端口映射云手机应用端口。获取方式见2。 云手机监听地址:云手机的内网IP与端口。获取方式见3。 SSH隧道用户名:云手机所在区域的项目ID。获取方式见1。 公网IP地址:服务器的公网IP。获取方式见4。 私钥文件路径:服务器的密钥对所对应的私钥文件在本地的保存路径。获取方式见5。 假设本地空闲端口为1234,云手机监听地址为10.237.0.61:5555,SSH隧道用户名为05e1aexxx,公网IP地址为xxx.xxx.xxx.xxx,私钥文件路径为C:\Users\Administrator\Downloads\KeyPair-a49c.pem,命令如下: ssh -L 1234:10.237.0.54:5555 05e1aexxx@xxx.xxx.xxx.xxx -i C:\Users\Administrator\Downloads\KeyPair-a49c.pem -o ServerAliveInterval=30 -Nf 该命令表示从本地PC建立一个到云手机的SSH隧道,使用本地端口转发模式,监听本地PC的1234端口;访问本地PC的1234端口时,通信数据将会被转发到云手机的5555端口。 执行命令后,SSH程序会在后台执行隧道的转发,执行后无报错或者报“Authorized users only. All activities may be monitored and reported.”即为SSH隧道建立成功。 若您购买云手机服务器时选择开启IPv6,可以使用IPv6建立隧道连接云手机。命令结构和IPv4一致,例如: ssh -L 1234:[fd00::aed:96]:5555 05e1aexxx@ xxx:xxx:xxx:xxx -i C:\Users\Administrator\Downloads\KeyPair-a49c.pem -o ServerAliveInterval=30 -Nf 目前建立隧道连接云手机,会话连接无超时退出机制,用户使用结束后需要及时终止连接。 以Windows系统为例,在关闭对应的终端窗口后,需要在任务管理器的后台进程中,找到ssh.exe进程,选中并结束任务。 以Linux系统为例,通过ps –ef|grep ssh命令找到对应的后台进程,再通过kill -9 {进程号}结束对应的进程。 建立SSH隧道的故障排查,请参考如下链接: 通过公网访问云手机时,建立SSH隧道失败了,如何解决? 建立SSH隧道时报错“too open”? 建立SSH隧道时报错“Permission denied”? 建立SSH隧道时报错“no match mac found”? 如何保持SSH会话不中断?
  • 安装方法 建议您在创建私有镜像前先安装Cloud-Init/Cloudbase-Init,安装方法如下: 如果是Windows操作系统,请下载并安装Cloudbase-Init。 安装和配置Cloudbase-Init相关操作请参考:安装并配置Cloudbase-Init工具。 如果是Linux操作系统,请下载并安装Cloud-Init。 安装和配置Cloud-Init相关操作请参考:安装和配置Cloud-Init工具。
  • Ubuntu 16.04/CentOS 7:Cloud-Init设置自启动失败 问题描述: 安装Cloud-Init后,执行以下命令设置Cloud-Init为开机自启动时,提示失败: systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 回显信息如下所示: 图1 设置Cloud-Init自启动失败 解决方法: 执行以下命令回退配置 systemctl unmask cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 执行以下命令,重新设置Cloud-Init为开机自启动 systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 执行以下命令,检查Cloud-Init服务状态 systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 回显信息如下所示,提示failed且所有服务的状态都是inactive。 图2 检查Cloud-Init服务状态 图3 检查Cloud-Init服务状态 原因是系统查询Cloud-Init的地址指向/usr/bin/,但是实际安装路径指定的是/usr/local/bin,因此出现了上述错误。 执行以下命令,将cloud-init复制至usr/bin目录下。 cp /usr/local/cloud-init /usr/bin/ 执行以下命令,重启Cloud-Init。 systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 图4 重启Cloud-Init 执行以下命令,检查Cloud-Init服务状态。 systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
  • Ubuntu 14.04:未安装chkconfig和systemctl 问题描述: 未安装chkconfig 解决方法: 执行以下命令安装chkconfig: apt-get update apt-get install sysv-rc-conf cp /usr/sbin/sysv-rc-conf /usr/sbin/chkconfig 安装完成后,执行以下命令查看版本号。 cloud-init -v 如果回显信息如下所示: -bash:/usr/bin/cloud-init:not found this command 解决方法:执行以下命令将cloud-init复制至usr/bin目录下。 cp /usr/local/bin/cloud-init /usr/bin/
  • Debian 9.5:查看版本号失败和Cloud-Init设置开启自启动失败 Cloud-Init安装完成后,执行以下命令查看版本号。 cloud-init -v 回显信息如下所示: -bash:/usr/bin/cloud-init:not found this command 解决方法:执行命令cp /usr/local/bin/cloud-init /usr/bin/,将cloud-init复制至usr/bin目录下。 执行命令cloud-init init --local 回显信息如下所示: 图5 设置Cloud-Init自启动回显信息 原因分析:未安装gcc导致无法编译。 解决方法: 执行以下命令安装gcc后重新安装Cloud-Init。 yum -y install gcc 执行以下命令设置Cloud-Init为开机自启动时提示失败: systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 回显信息提示如下所示: 图6 设置Cloud-Init自启动提示失败 解决方法: 执行以下命令回退配置 systemctl unmask cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 执行以下命令,重新设置Cloud-Init为开机自启动 systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 执行以下命令,重启Cloud-Init systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 然后执行命令systemctl status查看服务状态。回显信息如下所示: 图7 查看服务状态
  • CentOS 7/Fedora操作系统:Cloud-Init安装成功,使用镜像创建的云服务器无法使用新密码登录 问题描述 Cloud-Init安装成功后,生成镜像并申请云服务器,启动新的云服务器,发现新密码无效。使用旧密码登录进去后发现,网卡没有启动: 图8 网卡未启动 解决方法 登录创建镜像前的云服务器,打开dhcp配置文件“/etc/sysconfig/network-scripts/ifcfg-ethX”,注释HWADDR这一项。
  • CentOS 7/Fedora 28操作系统:安装Cloud-Init时提示未安装所需的C编译器 问题描述 Cloud-Init安装完成后,执行以下命令: cloud-init init --local 回显信息出现以下警告: /usr/lib/python2.5/site-packages/Cheetah/Compiler.py:1532: UserWarning: You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames option as it is painfully slow with the Python version of NameMapper. You should get a copy of Cheetah with the compiled C version of NameMapper. "\nYou don't have the C version of NameMapper installed! 原因分析 出现该警告是因为在安装Cloud-Init时,需要编译C版本的NameMapper,但是该系统没有预装gcc,因此无法编译,这才导致C版本的NameMapper缺失。 处理方法 执行以下命令安装gcc: yum -y install gcc 然后再重新安装Cloud-Init。
  • 参数说明 关键字PUBLIC表示一个隐式定义的拥有所有角色的组。 权限类别和参数说明,请参见GRANT的参数说明。 任何特定角色拥有的特权包括直接授予该角色的特权、从该角色作为其成员的角色中得到的权限以及授予给PUBLIC的权限。因此,从PUBLIC收回SELECT特权并不一定会意味着所有角色都会失去在该对象上的SELECT特权,那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回SELECT后,如果PUBLIC仍有SELECT权限,该用户还是可以使用SELECT。 指定GRANT OPTION FOR时,只撤销对该权限授权的权力,而不撤销该权限本身。 如用户A拥有某个表的UPDATE权限,及WITH GRANT OPTION选项,同时A把这个权限赋予了用户B,则用户B持有的权限称为依赖性权限。当用户A持有的权限或者授权选项被撤销时,依赖性权限仍然存在,但如果声明了CASCADE,则所有依赖性权限都被撤销。 一个用户只能撤销由它自己直接赋予的权限。例如,如果用户A被指定授权(WITH ADMIN OPTION)选项,且把一个权限赋予了用户B,然后用户B又赋予了用户C,则用户A不能直接将C的权限撤销。但是,用户A可以撤销用户B的授权选项,并且使用CASCADE。这样,用户C的权限就会自动被撤销。另外一个例子:如果A和B都赋予了C同样的权限,则A可以撤销他自己的授权选项,但是不能撤销B的,因此C仍然拥有该权限。 如果执行REVOKE的角色持有的权限是通过多层成员关系获得的,则具体是哪个包含的角色执行的该命令是不确定的。在这种场合下,最好的方法是使用SET ROLE成为特定角色,然后执行REVOKE,否则可能导致删除了不想删除的权限,或者是任何权限都没有删除。
共100000条
提示

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