2013-03-27 2 views
1

В настоящее время я пытаюсь написать работу по сокращению карты, где входные данные отсутствуют в HDFS и не могут быть загружены в HDFS в основном потому, что программы, использующие данные, не могут использовать данные из HDFS, и есть слишком чтобы скопировать его в HDFS, по крайней мере, 1 ТБ на узел.Node-Local Map уменьшить вакансию

Итак, у меня есть 4 каталога на каждом из 4 узлов в моем кластере. В идеале я хотел бы, чтобы мои картографы просто получали пути для этих 4 локальных каталогов и читали их, используя что-то вроде файла: /// var/mydata/..., а затем 1 картограф может работать с каждым каталогом. т.е. всего 16 карт.

Однако, чтобы быть в состоянии сделать это, мне нужно убедиться, что я получаю ровно 4 картографа на узел и точно 4 устройства, которым были назначены пути, локальные для этой машины. Эти пути являются статическими и поэтому могут быть жестко закодированы в файле fileinputformat и recordreader, но как я могу гарантировать, что данные расщепления заканчиваются на данном узле с известным именем хоста. Если бы это было в HDFS, я мог бы использовать переменную в параметре FileInputFormat isSplittable для false, и hadoop позаботится об этом, но поскольку все данные являются локальными, это вызывает проблемы.

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

Я заметил, что inputSplits предоставляют функцию getLocations, но я считаю, что это не гарантирует локальность выполнения, только оптимизирует ее и четко, если я пытаюсь использовать файл: /// some_path в каждом картографе Мне нужно обеспечить точную локальность в противном случае я могу закончить чтение некоторых каталогов многократно, а другое - совсем не так.

Любая помощь была бы принята с благодарностью.

ответ

0

Я вижу, что вы можете сделать это тремя способами.

1.) Просто загрузите данные в HDFS, чего вы не хотите делать. Но стоит попробовать, так как это будет полезно для будущей обработки

2.) Вы можете использовать NLineInputFormat. Создайте четыре разных файла с URL-адресами входных файлов в каждом из ваших узлов.

file://192.168.2.3/usr/rags/data/DFile1.xyz 
....... 

Вы загрузите эти файлы в HDFS и написать программу на эти файлы, чтобы получить доступ к данным, используя данные этих URL-адреса и обрабатывать данные. Если вы используете NLineInputFormat с 1 строкой. Вы будете обрабатывать 16 карт, каждая карта обрабатывает эксклюзивный файл. Единственная проблема здесь - высокая вероятность того, что данные на одном узле могут быть обработаны на другом узле, однако не будет никакой дублирующей обработки

3.) Вы также можете оптимизировать вышеуказанный метод, загрузив вышеуказанные четыре файлы с URL-адресами отдельно. При загрузке любого из этих файлов вы можете удалить остальные три узла, чтобы убедиться, что файл точно соответствует узлу, где находятся файлы данных локально. Во время загрузки выберите репликацию как 1, чтобы блоки не были реплицированы. Этот процесс увеличит вероятность того, что карты начали обрабатывать локальные файлы в очень высокой степени.

Приветствие Тряпка

+0

спасибо за совет, 1 не хорошо, это должно быть обновляться, так что данные будут полезны только в течение дня или около того, и как файлы Читаем являются частью активного базы данных, данные будут намного более прочными. 2 интересно, NLineInputFormat звучит как часть ответа, но, как вы указываете, не гарантирует локальность. 3.звучит правдоподобно, но что вы имеете в виду, удалив остальные 3 узла, я не могу принимать части кластера в автономном режиме, если это то, что вы имеете в виду, кластер должен также реагировать на другие задания, это должно быть фоновая задача с учетом вероятного времени выполнения. – feldoh

+0

Привет, Фельдо, ты меня понял. Включение кластера в автономный режим. Теперь я понимаю, что это невозможно, так как это производственный кластер. – Rags

+0

При использовании вышеуказанного метода способ убедиться, что он выполняется локально, - это проверить местоположение файла на карте, если он удален, выдает исключение, чтобы выполнить задачу. трекер задания будет пытаться, пока задача не будет успешной, что означает, что он находит файл локально. Но это грубый метод. Чтобы продолжить работу, вам может потребоваться увеличить максимальное количество попыток для задач карты до большого числа. – Rags

Смежные вопросы