项目场景:
新来了一批数据源洗成指标要从hive导入到mysql中.生成的指标key是由数据源+产品编号+数据表名+维度的md5的前8位拼接而成.
例:指标key是baidu1001monthreportas55fef6ret 这样大约30个字符到45个字符之前不定.
问题描述
大约一次性导入10万条数据,数据在用sqoop从hive导到mysql时总是会报死锁问题.
Caused by: java.sql.SQLException: Deadlock found when trying to get lock; try restarting transaction
原因分析:
这个sqoop脚本之前一直是可以使用的,用这个脚本导出别的数据源的大数据量指标也是没有问题的.那么问题就出在这个数据源指标的key上.
我也尝试用其他方式去导出这部分数据,比如用sparksql写个脚本去抽取这部分数据,结果没有问题.
那么原因就出在sqoop上了,尝试去寻找了一下方法,sqoop脚本可以添加一些参数来限制数据传输的并行度.
解决方案:
–num-mappers 1 指定sqoop并行度为1
个人思考了一下原因,可是是指标key过长导致的这个问题.之前指标的key大约25个字符左右从来没出现过这个问题.过长的key导致mysql插入索引时大量数据写入一个索引下导致索引冲突引起的死锁,
之后会把sqoop脚本替换成sparksql写的脚本来完善数据传输的稳定性.