Вы должны хранить список уникальных идентификаторов в HDFS и перестраивать его после каждой пакетной загрузки.
Поскольку количество элементов в вашем случае довольно велико (вы можете ожидать> 1B уникальных записей за один год), ваш список уникальных идентификаторов должен быть разбит на несколько частей, скажем N. Алгоритм разделения зависит от домена. Общий подход заключается в преобразовании идентификатора в длинную строку хэша (16 байтов в порядке) и создает 2 ^ k сегментов:
Для k = 8, например:
сегмент # 1 содержит все идентификаторы, значение хеша которых начинается с 0
блок № 2 содержит все идентификаторы, значение хеша которых начинается с 1
...
сегмент # 256 содержит все идентификаторы, значение хеша которых начинается с 255
В каждом новом пакете вы сначала получаете задание на выполнение дедупликации: Карта считывает записи, получает идентификатор записи, хэширует ее и выдает Key = bucket # (в нашем случае 0..255) и Value = ID. Каждый редуктор получает все IDS для данного сегмента. Редуктор загружает ВСЕ уникальные идентификаторы для данного сегмента, известного в вашей системе, уже во внутренний набор и проверяет ВСЕ входящие идентификаторы записей с помощью этого внутреннего набора. Если у записи есть идентификатор, который еще не известен, вы обновляете внутренний Set и выводите запись.
При закрытии редуктора вы выводите внутренний набор уникальных идентификаторов обратно в HDFS.
Разбивая весь набор идентификаторов на количество сегментов, вы создаете решение, которое хорошо масштабируется.