Чтение файла непосредственно из HDFS в функцию оболочки - PullRequest
0 голосов
/ 02 марта 2012

У меня есть функция оболочки, которая вызывается из моей функции карты. Функция оболочки принимает 2 параметра -> входной файл и выходной файл. Как то так

$> unix-binary /pathin/input.txt /pathout/output.txt

Проблема в том, что эти файлы input.txt находятся в HDFS, а файлы output.txt необходимо записать обратно в HDFS. В настоящее время я сначала копирую нужный файл с fs.copyToLocalFile на локальный жесткий диск, вызываю двоичный файл unix, а затем записываю output.txt обратно в HDFS с fs.copyFromLocalFile. Проблема этого подхода заключается в том, что он не оптимален, поскольку включает в себя значительное количество избыточного чтения и записи на жесткий диск, что снижает производительность. Итак, мой вопрос, как я могу читать файл HDFS непосредственно в качестве ввода и выводить результаты непосредственно в HDFS? очевидно, $>unix-binary hdfs://master:53410/pathin/input.txt' hdfs://master:54310/pathout/output.txt не будет работать. Есть ли другой путь? Можно ли как-то обработать файл HDFS как файл loacl? У меня есть доступ к unix-двоичному исходному коду, написанному на C. Может быть, изменение исходного кода поможет? спасибо

1 Ответ

0 голосов
/ 03 марта 2012

Вы можете добавить файл в DistributedCache и получить к нему доступ из картографа из кэша. Вызовите функцию оболочки для локального файла и запишите выходной файл на локальный диск, а затем скопируйте локальный файл в HDFS.

Однако такие операции, как вызов функций оболочки или чтение / запись из средства отображения / редуктора, нарушают парадигму MapReduce. Если вам нужно выполнить такие операции, MapReduce может оказаться не тем решением, которое вы ищете. HDFS и MapReduce были разработаны для выполнения крупномасштабной пакетной обработки небольших количеств чрезвычайно больших файлов.

Поскольку у вас есть доступ к unix-двоичному исходному коду, лучшим вариантом может быть реализация определенных функций, которые вы хотите использовать в Java. Передайте входные файлы в ваш маппер и вызовите функцию из маппера для данных, а не работайте с файлами в HDFS / LocalFS.

...