У меня есть папка с 150 G файлов txt (около 700 файлов, в среднем каждый 200 МБ).
Я использую scala для обработки файлов и вычисления статистики агрегатов в конце. Я вижу два возможных подхода:
- вручную перебирать все файлы, выполнять вычисления на файл и объединять результаты в конце
- прочитайте всю папку на один RDD, выполните все операции над этим единственным RDD и пусть искра сделает все распараллеливание
Я склоняюсь к второму подходу, поскольку он кажется более чистым (нет необходимости в распараллеливании определенного кода), но мне интересно, будет ли мой сценарий соответствовать ограничениям, налагаемым моим оборудованием и данными. У меня есть одна рабочая станция с 16 потоками и 64 ГБ оперативной памяти (так что распараллеливание будет строго локальным между разными процессорными ядрами). Я мог бы масштабировать инфраструктуру с большим количеством машин позже, но на данный момент я хотел бы сосредоточиться на настройке параметров для этого сценария с одной рабочей станцией.
Код, который я использую: - считывает TSV файлы и извлекает значимые данные в триплеты (String, String, String) - после этого выполняется некоторая фильтрация, сопоставление и группировка - наконец, данные уменьшаются и вычисляются некоторые агрегаты
Мне удалось запустить этот код с одним файлом (~ 200 МБ данных), однако я получаю java.lang.OutOfMemoryError: превышен верхний предел GC и/или Java из исключения кучи при добавлении большего количества данных (приложение разбивается на 6 ГБ данных, но я хотел бы использовать его с 150 ГБ данных).
Думаю, мне пришлось бы настроить некоторые параметры, чтобы сделать эту работу. Я был бы признателен за любые советы о том, как подойти к этой проблеме (как отлаживать требования к памяти). Я попытался увеличить "spark.executor.memory" и использовать меньшее количество ядер (разумное существо, что каждому ядру требуется некоторое кучное пространство), но это не помогло решить мои проблемы.
Мне не нужно, чтобы решение было очень быстрым (он может легко работать в течение нескольких часов даже дней, если это необходимо). Я также не кэширую какие-либо данные, а просто сохраняю их в файловой системе в конце. Если вы считаете, что было бы более целесообразно просто пойти с ручным распараллеливанием, я тоже мог бы это сделать.