Как повысить производительность TextIO или AvroIO при чтении очень большого количества файлов?
TextIO.read()
а также AvroIO.read()
(а также некоторые другие Beam IO) по умолчанию не очень хорошо работают в текущих бегунах Apache Beam при чтении файлового шаблона, который расширяется до очень большого количества файлов - например, файлов 1M.
Как эффективно читать такое большое количество файлов?
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()
с шаблоном файла, указанным во время строительства трубопровода.