Hadoop Mapreduce со сжатыми / зашифрованными файлами (файл большого размера)
У меня есть кластер hdfs, который хранит большие CSV-файлы в сжатом / зашифрованном виде по выбору конечного пользователя. Для сжатия, шифрования я создал поток ввода оболочки, который передает данные в HDFS в сжатом / зашифрованном виде. Используется формат сжатия GZ, формат шифрования AES256. CSV-файл 4, 4 ГБ сжимается до 40 МБ в HDFS.
Теперь у меня есть задание mapreduce (java), которое обрабатывает несколько сжатых файлов вместе. Работа MR использует FileInputFormat. Когда расщепления рассчитываются с помощью mapper, сжатый файл размером 4, 4 ГБ (40 МБ) выделяется только 1 преобразователю с началом разделения в 0 и эквивалентной длиной разделения 40 МБ.
Как мне обработать такой сжатый файл большего размера.? Один из вариантов, который я нашел, состоял в том, чтобы реализовать собственный RecordReader и использовать входной поток-обертку для чтения несжатых данных и их обработки. Поскольку у меня нет фактической длины файла, я не знаю, сколько данных нужно прочитать из входного потока.
Если я буду читать до конца из InputStream, то как мне поступить, когда 2 сопоставителя выделены одному и тому же файлу, как объяснено ниже. Если размер сжатого файла превышает 64 МБ, то для одного файла будет выделено 2 сопоставителя. Как справиться с этим сценарием.?
Версия Hadoop - 2.7.1
1 ответ
Формат сжатия должен определяться с учетом того, будет ли файл обрабатываться с помощью функции карты редукции. Потому что, если формат сжатия разделяемый, то карта редукции работает нормально.
Однако, если не разделяемый (в вашем случае gzip не разделяемый, и карта Reduce узнает об этом), тогда весь файл будет обработан в одном преобразователе. Это будет служить цели, но будет иметь проблемы с локальностью данных, так как один картограф будет выполнять только задание и извлекает данные из других блоков.
Из окончательного руководства Hadoop: "Для больших файлов не следует использовать формат сжатия, который не поддерживает разбиение по всему файлу, поскольку вы теряете локальность и делаете приложения MapReduce очень неэффективными".
Вы можете обратиться к разделу Сжатие в главе Hadoop I/O для получения дополнительной информации.