我想使用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
答案 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()。