1、oracle间歇性的丢失数据
场景
oracle sql执行完成,程序未见异常,但是数据库中没有数据,即间歇性的丢失数据。mysql不存在这个问题。
原因
由于程序中直接使用了jdbc,并且禁止自动提交,而在多处创建了连接,在ccommit时,实际上提交的并不是预期的connection,最后导致事务超时。由于,mysql与oracle对事务超时后的处理方式不同,mysql超时后自动提交,而oracle事务超时后自动撤销,所以丢失数据只会在oracle数据库时出现。
解决
使用局部单例模式创建连接,即在一个处理过程中只创建一次连接并复用,避免多次建立连接。
总结
尽量减少在程序中的jdbc直连数据库,如果要使用,则需要注意连接和事务的管理。
2、Spark读取hive分区表报错
场景
spark读取hive某个hive表的分区错误
Input path does not exist: hdfs://hdp6.tydic.com:8020/apps/hive/warehouse/hi_tydic_lable.db/contact_result/contact_date=20200527
原因:
删除hdfs上的hive分区目录时,未删除hive元数据里的分区信息,导致读取时仍然会读取不存在的分区。
解决:
删除hive分区:
alter table CONTACT_RESULT drop partition (contact_date='20200527');
总结:
删除分区命令:
alter table CONTACT_RESULT drop partition (分区字段='xxx');
3、对象属性名第二个字母大写问题
场景:
前端向后端传一个验证码参数时,参数名定义为vCode,导致该参数值一直为空,其他参数正常。
分析:
-
检查前端参数值,的确有值
-
传到后端接收时丢失
-
猜测是参数名导致的
-
修改参数名为verifyCode后,传值正常
解决办法:
-
更换参数名
-
手动生成getter/setter
-
使用@JsonProperty注解@JsonProperty(value = “vCode”)
总结:
javabean规范中声明:
如果属性名的第二个字母大写,那么该属性名直接用作 getter/setter 方法中 get/set 的后部分,就是说大小写不变。例如属性名为uName,方法是getuName/setuName。
然而当使用lombok生成getter/setter时,生成的为getVCode/setVCode,导致Spring解析失败,正确的应该为getvCode和setvCode。
4、spark提交任务后,切换hive库,提示库不存在
场景:
spark提交任务到集群运行,需要从hive读取数据,在切换hive库时,提示database不存在,而事实上该数据库是存在的。
分析:
- 检查各个配置,均正常
- 检查组件版本,不一致,差异较大,可能是组件版本不同导致的
解决:
更换hive、spark客户端版本
总结:
在不同环境时,需要注意组件版本是否兼容。