我正在尝试向Kafka写入一个包含约2.3亿条记录的数据帧。更具体地说,是Kafka-enable Azure Event Hub,但我不确定这是否真的是我的问题的根源。
EH_SASL = 'kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://myeventhub.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=****";'
dfKafka \
.write \
.format("kafka") \
.option("kafka.sasl.mechanism", "PLAIN") \
.option("kafka.security.protocol", "SASL_SSL") \
.option("kafka.sasl.jaas.config", EH_SASL) \
.option("kafka.bootstrap.servers", "myeventhub.servicebus.windows.net:9093") \
.option("topic", "mytopic") \
.option("checkpointLocation", "/mnt/telemetry/cp.txt") \
.save()
这样可以很好地启动并成功(并且非常快)将大约3-4百万条记录写入队列。但是几分钟后,消息却停止了,
org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段7.0中的任务6失败了4次,最近一次失败:阶段7.0中的任务6.3丢失(TID 248、10.139.64.5,执行者1):kafkashaded .org.apache.kafka.common.errors.TimeoutException:mytopic-18的61条记录已过期:自上次追加以来已过去32839 ms
或
org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段8.0中的任务13失败4次,最近一次失败:阶段8.0中的任务13.3丢失(TID 348、10.139.64.5,执行者1):kafkashaded .org.apache.kafka.common.errors.TimeoutException:请求超时。
此外,我再也看不到创建/写入检查点文件。
我还尝试了.option("kafka.delivery.timeout.ms", 30000)
和不同的值,但这似乎没有任何效果。
我正在Azure Databricks群集版本5.0(包括Apache Spark 2.4.0,Scala 2.11)中运行此程序
我在Event Hub上没有看到任何节流之类的错误,所以应该没事。
答案 0 :(得分:2)
最后弄清楚了(大部分):
结果显示默认的批处理大小约为16000条消息,对于端点而言太大。在将batch.size参数设置为5000之后,它开始工作,并以每分钟约70万条消息的速度写入事件中心。另外,上面的超时参数是错误的,只是被忽略了。是kafka.request.timeout.ms
唯一的问题是,它仍然随机地在超时中运行,并且显然是从头开始的,因此我最终会重复。为此将打开another question。
dfKafka \
.write \
.format("kafka") \
.option("kafka.sasl.mechanism", "PLAIN") \
.option("kafka.security.protocol", "SASL_SSL") \
.option("kafka.sasl.jaas.config", EH_SASL) \
.option("kafka.batch.size", 5000) \
.option("kafka.bootstrap.servers", "myeventhub.servicebus.windows.net:9093") \
.option("kafka.request.timeout.ms", 120000) \
.option("topic", "raw") \
.option("checkpointLocation", "/mnt/telemetry/cp.txt") \
.save()