Python pyspark流式提交卡夫卡偏移量
根据文档,可以从(scala)spark流媒体应用程序中删除。 我希望通过pyspark实现相同的功能。Python pyspark流式提交卡夫卡偏移量,python,apache-spark,apache-kafka,spark-streaming,Python,Apache Spark,Apache Kafka,Spark Streaming,根据文档,可以从(scala)spark流媒体应用程序中删除。 我希望通过pyspark实现相同的功能。 或者至少将kafka分区、偏移量存储到外部数据存储(RDBMS等)中 但是,用于kafka集成的pyspark api只提供RDD(偏移量,值)],而不是RDD[ConsumerRecord](如scala中所示)。 有没有办法从python RDD获取(主题、分区、偏移量)?并将其保存到其他地方?我们可以以多种方式处理偏移量。其中一种方法是在每次成功处理数据时将偏移值存储在Zookeepe
或者至少将kafka分区、偏移量存储到外部数据存储(RDBMS等)中 但是,用于kafka集成的pyspark api只提供
RDD(偏移量,值)]
,而不是RDD[ConsumerRecord]
(如scala中所示)。
有没有办法从python RDD获取
(主题、分区、偏移量)
?并将其保存到其他地方?我们可以以多种方式处理偏移量。其中一种方法是在每次成功处理数据时将偏移值存储在Zookeeper路径中,并在再次创建流时读取该值。代码片段如下所示
from kazoo.client import KazooClient
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()
ZOOKEEPER_SERVERS = "127.0.0.1:2181"
def get_zookeeper_instance():
from kazoo.client import KazooClient
if 'KazooSingletonInstance' not in globals():
globals()['KazooSingletonInstance'] = KazooClient(ZOOKEEPER_SERVERS)
globals()['KazooSingletonInstance'].start()
return globals()['KazooSingletonInstance']
def save_offsets(rdd):
zk = get_zookeeper_instance()
for offset in rdd.offsetRanges():
path = f"/consumers/{var_topic_src_name}"
print(path)
zk.ensure_path(path)
zk.set(path, str(offset.untilOffset).encode())
var_offset_path = f'/consumers/{var_topic_src_name}'
try:
var_offset = int(zk.get(var_offset_path)[0])
except:
print("The spark streaming started First Time and Offset value should be Zero")
var_offset = 0
var_partition = 0
enter code here
topicpartion = TopicAndPartition(var_topic_src_name, var_partition)
fromoffset = {topicpartion: var_offset}
print(fromoffset)
kvs = KafkaUtils.createDirectStream(ssc,\
[var_topic_src_name],\
var_kafka_parms_src,\
valueDecoder=serializer.decode_message,\
fromOffsets = fromoffset)
kvs.foreachRDD(handler)
kvs.foreachRDD(save_offsets)
问候
自从卡夫卡版本0.10以来,不建议将偏移提交给Zookeeper。我的问题涉及卡夫卡的最新版本,它在卡夫卡主题中存储偏移量(使用压缩日志)。谢谢你的建议。