смещение фиксации потоковой передачи pyspark к kafka

1

Согласно документации, можно совершить смещение в кафку из (scala) искрообразования. Я хотел бы получить такую же функциональность от pyspark.
Или, по крайней мере, сохраните раздел kafka, смещенный во внешний хранилище данных (РСУБД и т.д.).

Однако pyspark api для интеграции kafka предоставляет только RDD(offset, value)] вместо RDD[ConsumerRecord] (как в scala). Есть ли способ получить (topic, partition, offset) из RDD python? И упорствовать там еще где?

Теги:
apache-spark
apache-kafka
spark-streaming

1 ответ

0

Мы можем обрабатывать смещение несколькими способами. Одним из способов сохранения значения Offset в пути 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
    Передача коррекций в Zookeeper не рекомендуется начиная с версии 0.10. Моя проблема связана с более поздней версией kafka, которая хранит смещения в теме kafka (используя компактный журнал). Спасибо за предложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню