使用Spark Streaming加载Avro数据集到Teradata时中途异常失败
结合你描述的「部分数据成功插入,但中途异常失败」的情况,我整理了几个最可能的原因,你可以逐一排查:
JDBC连接池或连接超时问题
Spark Streaming是持续流式处理场景,如果JDBC连接池配置不合理,比如spark.sql.jdbc.maxConnections设置过小,随着流式任务运行,连接被耗尽后就会无法获取新连接;另外Teradata端可能设置了IDLESESSIONTIMEOUT或LOGON_TIMEOUT,导致长时间闲置的连接被主动回收,中途写入时连接失效抛出异常。脏数据或数据格式不兼容
前面的数据能成功写入说明大部分数据符合Teradata表结构,但中途可能遇到了异常数据:比如Avro中某个字段为null但Teradata对应列设置了NOT NULL约束;或者数值类型不匹配(比如Avro的int值超出TeradataSMALLINT的范围);还有可能是字符串包含Teradata不支持的特殊字符,导致插入解析失败。Teradata资源瓶颈
当流式任务运行到某个阶段时,如果Teradata的CPU、内存、磁盘IO达到瓶颈,会无法处理后续的插入请求。比如你设置的JDBC批量写入batchSize过大,单批次数据量超出Teradata的处理能力,就会触发资源限制导致任务失败。Spark Streaming批次处理异常
某个批次的数据量突然暴增,导致Spark Executor内存不足抛出OOM,或者JDBC写入超时;另外如果没有正确处理流式任务的失败重试,某个批次失败后直接中断整个任务,也会出现「部分成功、中途失败」的情况。Teradata表锁或事务问题
如果有其他业务进程正在操作目标Teradata表(比如批量更新、查询),导致表被加锁,Spark的插入请求无法获取锁就会抛出异常;另外如果JDBC写入没有配置正确的事务策略,中途某个批次失败后触发回滚,但前面已提交的数据无法回滚,后续任务也无法继续执行。Avro文件本身异常
中途处理的Avro文件可能存在损坏,或者schema与之前的文件不一致(比如新增/删除了字段),Spark解析该文件时出错,进而导致写入Teradata的流程中断。
内容的提问来源于stack exchange,提问作者b2Wc0EKKOvLPn

