Кафка позволяет добавлять разделы в тему, но не удалять? - PullRequest
1 голос
/ 07 октября 2019

Почему apache kafka допускает только добавления, но не удаления разделов в темах. Как это работает внутри. Использует ли он хеширование для разделов?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Apache Kafka не поддерживает сокращение разделов темы, так как это приведет к потере данных. Кроме того, это также вызовет больше проблем с сообщениями с ключами, которые были распределены по определенным разделам.

Возвращаясь к вашему вопросу о хешировании, Kafka по умолчанию использует DefaultPartitioner (org.apache.kafka.clients.producer.internals.DefaultPartitioner) для распределения сообщений по тематическим разделам:

/**
 * Compute the partition for the given record.
 *
 * @param topic The topic name
 * @param key The key to partition on (or null if no key)
 * @param keyBytes serialized key to partition on (or null if no key)
 * @param value The value to partition on or null
 * @param valueBytes serialized value to partition on or null
 * @param cluster The current cluster metadata
 */
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
    if (keyBytes == null) {
        return stickyPartitionCache.partition(topic, cluster);
    } 
    List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
    int numPartitions = partitions.size();
    // hash the keyBytes to choose a partition
    return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}

По сути, DefaultPartitioner использует MurmurHash , некриптографическую хеш-функцию, которая обычно используется для поиска на основе хеша. Этот хеш затем используется в операции по модулю (% numPartitions), чтобы гарантировать, что возвращаемый раздел находится в диапазоне [0, N], где N - это количество разделов темы.

Обходной путь

Предполагая, что вы все еще хотите уменьшить количество разделов в теме, вы все равно можете создать новый с меньшим количеством разделов, а затем реплицировать сообщения изстарая тема недавно созданной. Таким образом, вы сможете распространять сообщения с ключами на правильные разделы.

0 голосов
/ 07 октября 2019

Разбиение действительно выполняется путем хеширования ключа сообщения с помощью алгоритма хеширования murmur2 с последующим вычислением по модулю количества секций . Это делается во время записи производителем, отправляющим сообщение брокеру, который затем сохраняет его в журнале для этого раздела. Если в сообщении нет ключа, то производитель выполняет циклический перебор. Все это поведение по умолчанию, разделитель является подключаемым, поэтому вы можете сделать для этого все, что захотите.

Это также причина, по которой вы не можете удалить разделы в Kafka, так как это будет означать, что данные потребуютсяперераспределить и затем распределить по другим разделам, что имеет несколько проблем:

  • брокеры не понимают, как производитель выбрал раздел при написании сообщения
  • сообщения уже устарели, и их нужно было вставлять в более ранние места в журнале брокера, что невозможно из-за линейно растущих смещений Kafka

Добавление разделов по контрасту довольно просто, поскольку это влияет только нановые сообщения. По сути, когда вы добавляете разделы, производители через некоторое время (обновление метаданных при достижении metadata.max.age.ms) заметят новые разделы и просто включат их в свою схему разбиения, как бы это ни выглядело.

...