Как повысить производительность TextIO или AvroIO при чтении очень большого количества файлов?

TextIO.read() и AvroIO.read() (а также некоторые другие операции ввода-вывода Beam) по умолчанию не очень хорошо работают в текущих средствах выполнения Apache Beam при чтении шаблона файла, который расширяется до очень большого количества файлов — например, 1M файлов.

Как я могу эффективно читать такое большое количество файлов?


person jkff    schedule 27.07.2017    source источник


Ответы (1)


Когда вы заранее знаете, что шаблон файла, считываемый с помощью TextIO или AvroIO, будет расширяться до большого количества файлов, вы можете использовать недавно добавленная функция .withHintMatchesManyFiles(), которая в настоящее время реализована на TextIO и AvroIO.

Например:

PCollection<String> lines = p.apply(TextIO.read()
    .from("gs://some-bucket/many/files/*")
    .withHintMatchesManyFiles());

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

Однако он может работать хуже, чем без подсказки, если шаблон файла на самом деле соответствует лишь небольшому количеству файлов (например, нескольким дюжинам или нескольким сотням файлов).

Под капотом эта подсказка заставляет преобразования выполняться соответственно через TextIO.readAll() или AvroIO.readAll(), которые являются более гибкими и масштабируемыми версиями read(), которые позволяют читать PCollection<String> шаблонов файлов (где каждый String является шаблоном файла), с той же оговоркой: если общее количество файлов, соответствующих файловым шаблонам, невелико, они могут работать хуже, чем простой read() с файловым шаблоном, указанным во время построения конвейера.

person jkff    schedule 27.07.2017
comment
Что-нибудь эквивалентное для Python API? Я ничего не мог найти. Очень медленно читается множество мелких файлов из GCS. - person ehrencrona; 21.03.2018
comment
@jkff Могу ли я использовать регулярное выражение в качестве шаблона файла? Кажется, это не работает. - person Kakaji; 19.04.2018
comment
@Kakaji, вы можете использовать шаблоны файлов, похожие на глобусы. - person Timur; 04.06.2019
comment
Когда я пытаюсь прочитать большое количество файлов из GCS, с withHintMatchesManyFiles это не решается. Шаг readFromGCS все еще застопорился... - person zangw; 12.11.2019