Hadoop 'куски' данных в блоки настроенного размера. По умолчанию используется 64 МБ блоков. Вы можете увидеть, где это вызывает проблемы для вашего подхода; Каждый картограф может получить только часть файла. Если размер файла составляет менее 64 МБ (или любое другое настроенное значение), то каждый сопоставитель получит только 1 файл.
У меня было очень похожее ограничение; Мне нужно было, чтобы набор файлов (вывод из предыдущего редуктора в цепочке) был полностью обработан одним маппером. Я использую факт <64MB в моем решении
Основная идея моего решения заключается в том, что я настроил его так, чтобы мапперу было предоставлено имя файла, которое необходимо обработать, и он был внутренним для маппера, который загружал / считывал файл. Это позволяет одному мапперу обрабатывать весь файл - это не распределенная обработка файла, но с ограничением «Я не хочу, чтобы отдельные файлы распространялись» - это работает. :) </p>
У меня был процесс, который запустил мой MR, записал имена файлов файлов для обработки в отдельные файлы. Там, где были записаны эти файлы, был каталог ввода. Поскольку размер каждого файла <64 МБ, для каждого файла будет создан один сопоставитель. Процесс <code>map будет вызван ровно один раз (поскольку в файле всего 1 запись).
Затем я беру значение, переданное мапперу, и могу открыть файл и сделать все, что мне нужно.
Поскольку hadoop старается быть умным в отношении того, как он выполняет процессы Map / Reduce, может потребоваться указать количество используемых редукторов, чтобы каждый преобразователь переходил к одному редуктору. Это можно установить через конфигурацию mapred.reduce.tasks
. Я делаю это через job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);
У моего процесса были некоторые дополнительные требования / ограничения, которые могли сделать это конкретное решение привлекательным; но для примера 1: в 1: в; Я сделал это, и основы изложены выше.
НТН