邮件不会从PySpark发送到Kafka

时间:2018-08-17 10:57:33

标签: python python-3.x apache-spark pyspark apache-kafka

我想使用Python Kafka连接器将数据发送到Kafka。当我从pyspark shell运行代码时,一切正常。 但是,当我以spark-submit运行它时,不会发送消息。日志中没有错误,程序执行成功。但是邮件不会发送到Kafka。

import json
import datettime
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='XXX.XX.XXX.XXX:9092')
end = datetime.datetime.now().isoformat()
country = "es"
message = {'country': country, 'end': end, 'status': '1'}
msg = json.dumps(message)
print(msg)
producer.send('testtopic', msg)

我不明白为什么会这样。下面我提供了spark-submit的参数:

spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 11g \
--driver-cores 3 \
--num-executors 6 \
--executor-memory 6g \
--executor-cores 2 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.sql.broadcastTimeout=1500 \
--queue t1 \
s3://my-test-bucket/test1/test.py

2 个答案:

答案 0 :(得分:0)

我必须在producer.flush()之后使用producer.send('testtopic', msg)。仅在这种情况下,当我使用spark-submit运行代码时,消息才会发送到Kafka队列。 否则,将不会发送消息。

但是,很好奇的是,从pyspark shell执行代码时不需要producer.flush()

答案 1 :(得分:0)

生产者从批处理队列中轮询一批消息,每个分区一批。如果满足以下条件之一,则批次已准备就绪:

batch.size已达到。注意:较大的批次通常具有更好的压缩率和更高的吞吐量,但是它们具有更高的延迟。

达到

linger.ms(基于时间的批处理阈值)。注意:设置linger.ms值没有简单的指导。您应该在特定的用例上测试设置。对于小事件(100个字节或更少),此设置似乎没有太大影响。

同一经纪人的另一批次已准备好。

生产者调用flush()或close()。