云服务器内容精选

  • 故障分析 作业配置中源端目标端均通过where语句多条件过滤,并非索引列,查询会全表扫描,且数据量在上亿行,数据量庞大,导致JDBC数据库连接失败,读取数据超时,进而导致sqoop异常,作业失败。 迁移作业是 CDM 作为客户端先从源数据中抽取部分数据,写到目标端,再进行下一次部分数据抽取,写入目标端,往复执行,直到抽取到写入完成。因此可以添加高级属性:socketTimeout 参数,保证在每次抽取写入数据间隔,CDM一直保持正常会话。
  • 解决方案 编辑作业,进入作业的字段映射步骤,在源端的时间格式字段后面,选择新建转换器,如图3所示。 图3 新建转换器 转换器类型选择“表达式转换”,目前表达式转换支持字符串和日期类型的函数,语法和Java的字符串和时间格式函数非常相似,可以查看表达式转换了解如何编写表达式。 本例中源时间格式是“yyyy/MM/dd HH:mm:ss”,要将其转换成“yyyy-MM-dd HH:mm:ss.SSS Z”,需要经过如下几步: 添加时区信息“+0800”到原始日期字符串的尾部,对应的表达式为:value+" +0800"。 使用原始日期格式来解析字符串,将字符串解析为一个日期对象。可以使用DateUtils.parseDate函数来解析,语法是:DateUtils.parseDate(String value, String format)。 将日期对象格式化成目标格式的字符串,可以使用DateUtils.format函数来格式化,语法是DateUtils.format(Date date, String format)。 因此本例中串起来完整的表达式是:DateUtils.format(DateUtils.parseDate(value+" +0800","yyyy/MM/dd HH:mm:ss Z"),"yyyy-MM-dd HH:mm:ss.SSS Z"),如图4所示。 图4 配置表达式 保存转换器配置,再保存并运行作业,可解决 云搜索服务 的解析日期格式失败问题。
  • 原因分析 云搜索 服务对于时间类型有一个特殊处理:如果存储的时间数据不带时区信息,在Kibana可视化的时候,Kibana会认为该时间为GMT标准时间。 在各个地区会产生日志显示时间与本地时区时间不一致的现象,例如,在东八区某地,日志显示时间比本地时区时间少8个小时。因此在CDM迁移数据到云搜索服务的时候,如果是通过CDM自动创建的索引和类型(例如图2中,目的端的“date_test”和“test1”在云搜索服务中不存在时,CDM会在云搜索服务中自动创建该索引和类型),则CDM默认会将时间类型字段的格式设置为“yyyy-MM-dd HH:mm:ss.SSS Z”的标准格式,例如“2018-01-08 08:08:08.666 +0800”。 图2 作业配置 此时,从其他数据源导入数据到云搜索服务时,如果源端数据中的日期格式不完全满足标准格式,例如“2018/01/05 15:15:46”,则CDM作业会执行失败,日志提示无法解析日期格式。需要通过CDM配置字段转换器,将日期字段的格式转换为云搜索服务的目的端格式。
  • 迁移时已选择表不存在时自动创表,提示“CDM not support auto create empty table with no column”怎么处理? 这是由于数据库表名中含有特殊字符导致识别出语法错误,按数据库对象命名规则重新命名后恢复正常。 例如,DWS 数据仓库 中的数据表命名需要满足以下约束:长度不超过63个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$、#。 父主题: 故障处理类