фильтрация коллекций в Apache Beam - PullRequest
0 голосов
/ 25 мая 2018

У меня есть две Pcollections

P1  as Pcollection KV<String,Object>
P2 as Pcollection  KV<String,Long>

Ключи в обеих Pcollections одинаковы, однако значения разные.

P1 - около 70 миллионов записей, P2 - это подмножество P1 и 30 миллионов записей.

Теперь мне нужно разделить P1 на две коллекции, так что P1.A будет содержать только ключи, найденные в P2, а P1.B будет содержать ключи, которых нет в P2.

Я не хочу использовать co-groupbykey или любое соединение, так как это приводит к перемешиванию данных.

Можно ли использовать 20M записей (все строки) в качестве бокового ввода, вероятно, в качестве HashMap?Это хороший подход?

Предлагаете ли вы какие-либо другие оптимальные подходы для разделения P1 на две коллекции, одна из которых является пересечением ключей в P2, а другая - минус P2?

1 Ответ

0 голосов
/ 27 мая 2018

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

Например, давайте предположим, что ваши String клавиши имеют длина 10 , поэтому приблизительную оценку общего размера можно получить следующим образом: -

// A sample Key of size 10, prints 20 bytes as the key size.
System.out.print("AB-2325-CD".getBytes(Charset.forName("UTF-16BE")).length);

Размер бокового ввода можно рассчитать как 20 * 20 000 000 =400 МБ

Примечание : в эту оценку не включены накладные расходы на хранение, связанные со строкой ( и размером вашего объекта значения, при условии, что вы передаете ввод размеракак карта ).Подробнее о расчете размера см. .

Согласно Представление класс Java-документов

... Оба asMultimap ()и asMap () полезны для реализации основанных на поиске «объединений» с основным входом, когда боковой ввод достаточно мал, чтобы поместиться в память.

Клавиша убирается здесь перед использованием боковой ввод - это: -

  • соотношение размеров бокового ввода к основному вводу
  • вписывается ли оно в память ваших рабочих

Я не уверен, что память по умолчанию доступна для работника, но вы можете увеличить ее с помощью свойства WorkerCacheMb .

Что касается вашего вопроса, Может 20M записей (все строки) использоваться в качестве бокового ввода, вероятно, в качестве HashMap?

Размер бокового ввода определяет правильный подход, то есть: -

  • ИспользованиеView.asList, если ваш боковой вход умещается в память
  • Используйте View.asIterator, если ваша сторонаввод не помещается в память , он будет иметь снижение производительности
  • Используйте View.asMap, только если вы уверены, что он поместится в память.
...