NiFi使用PutSQL插入大量JSON流文件到MySQL失败如何解决?
NiFi 全量CSV转JSON写入MySQL空数据问题排查步骤
针对2行小文件正常写入、51万全量文件无数据写入的问题,按以下优先级排查:
- 优先检查流文件拆分逻辑
绝大多数此类问题都是因为未做单条记录拆分:全量CSV转JSON后会生成一个包含51万元素的完整JSON数组,直接传给ConvertJSONToSQL会生成单条超大体量的INSERT语句,2行数据生成的SQL长度在MySQL允许范围内所以正常,51万行的SQL体积远超服务端接收阈值,PutSQL执行时会直接失败回滚,不会写入任何数据。
修复方式:在JSON转换完成后、ConvertJSONToSQL之前新增SplitJson处理器,配置JsonPath Expression参数为$.*,将整个JSON数组拆分为每个流文件仅对应1条JSON记录,再传给下游处理器处理。 - 检查PutSQL处理器配置
- 调大事务超时时间:PutSQL默认
Transaction Timeout通常为10秒,全量数据批量执行很容易触发超时导致全量回滚,建议先调整到300秒以上;配合拆分后的单条记录,将Batch Size设置为100~500的合理区间,不要单批次提交全量数据。 - 临时关闭
Rollback On Failure选项,同时将PutSQL的failure关系路由到独立的日志队列或者本地文件目录,避免单条脏数据导致整批次回滚,同时可以快速定位到格式异常的问题记录。
- 调大事务超时时间:PutSQL默认
- 检查MySQL服务端参数限制
登录MySQL执行命令show variables like 'max_allowed_packet';查看单条SQL包最大允许长度,默认值通常为1M或4M,很容易拦截大体积SQL,建议修改MySQL配置文件my.cnf,将该参数调整为256M后重启服务生效。 - 检查链路背压配置
查看NiFi运行界面上处理器之间连接队列的状态,如果队列背压阈值被打满,上游数据会被阻塞无法推送到PutSQL,可适当调大连接的Back Pressure Object Threshold和Back Pressure Data Size Threshold参数,避免队列阻塞。 - 查看日志定位精准错误
直接查看NiFi部署目录下logs文件夹中的nifi-app.log文件,筛选对应时间段ConvertJSONToSQL、PutSQL处理器的ERROR级别日志,可以直接拿到失败的具体根因,比如字段类型不匹配、特殊字符转义失败、数据库连接中断、账号权限不足等,小数据量测试不会覆盖全量数据中的脏数据场景,单条异常数据就可能导致整批次写入失败。
内容的提问来源于stack exchange,提问作者Rayane
相关产品推荐
相关产品推荐

