簡體   English   中英

pyspark流提交提交偏移到kafka

[英]pyspark streaming commit offset to kafka

根據文檔,可以從(scala)spark流應用程序將偏移量提交到kafka中 我想從pyspark實現相同的功能。
或至少將kafka分區存儲到外部數據存儲區(RDBMS等)中。

但是,用於kafka集成的pyspark api僅提供RDD(offset, value)]而不是RDD[ConsumerRecord] (如在scala中)。 有什么辦法可以從python RDD獲取(topic, partition, offset) 並堅持到其他地方?

我們可以以多種方式處理偏移量。 在每一個成功處理的數據中,我們可以在Zookeeper路徑中存儲Offset值並在再次創建流時讀取該值的一種方法。 代碼片段如下。

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)

問候

Karthikeyan Rasipalayam Durairaj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM