背景
通过Spark SQL从Hive读取大约1M行的数据,一次性写入Kafka时,大概会丢失20%的数据。
producer
的设置只设置了acks=all
,使用的是异步的send()
。
Kafka Cluster有4个brokers。
排查
首先,注意到producer
在程序结束时没有调用flush()
,加上flush()
之后,问题依旧。
从Kafka The Definitive Guide中了解到,设置retries
参数可以令producer自动重试retriable errors,设置retries=100
,问题依旧。
重试也不能解决这个问题,那么将异常打印出来试试,在send()
中传入一个失败时打印异常的Callback
,顺便记录下失败次数: