Из-за некоторых неудачных последовательностей событий мы получили очень фрагментированный набор данных, хранящийся на s3. Метаданные таблицы хранятся в Glue, а данные записываются с помощью «bucketBy» и хранятся в формате паркета. Таким образом, обнаружение файлов не является проблемой, и количество разделов зажигания равно количеству сегментов, что обеспечивает хороший уровень параллелизма.
Когда мы загружаем этот набор данных в Spark / EMR, мы в конечном итоге загрузка каждого спарк-раздела около 8 тысяч файлов из s3.
Поскольку мы сохранили данные в столбчатом формате; согласно нашему сценарию использования, где нам нужна пара полей, мы на самом деле не читаем все данные, а очень небольшую часть того, что хранится.
Основываясь на использовании ЦП на рабочих узлах, я вижу, что каждая задача (запущенная на раздел) использует почти около 20% их ЦП, что, как я подозреваю, связано с тем, что на одну задачу на чтение задачи из файлов s3 последовательно, так много IOwait ...
Есть ли способ поощрить задачи зажигания на EMR к чтению данных из многопоточного s3, чтобы мы могли одновременно читать несколько файлов из s3 в пределах задача? Таким образом, мы можем использовать 80% бездействующего процессора, чтобы сделать все немного быстрее?