Node-Local Map сократить работу
В настоящее время я пытаюсь написать работу по уменьшению карты, когда входные данные не находятся в HDFS и не могут быть загружены в HDFS, потому что программы, использующие данные, не могут использовать данные из HDFS и их слишком много, чтобы скопировать в HDFS, по крайней мере 1 ТБ на узел.
Таким образом, у меня есть 4 каталога на каждом из 4 узлов в моем кластере. В идеале я хотел бы, чтобы мои мапперы просто получали пути для этих 4 локальных каталогов и читали их, используя что-то вроде file:///var/mydata/... и тогда 1 маппер может работать с каждым каталогом. т.е. всего 16 картографов.
Однако, чтобы сделать это, мне нужно убедиться, что я получаю ровно 4 сопоставителя на узел и ровно 4 сопоставителя, которым назначены пути, локальные для этой машины. Эти пути являются статическими и поэтому могут быть жестко запрограммированы в моем fileinputformat и считывателе записей, но как я могу гарантировать, что данные разбиения окажутся на заданном узле с известным именем хоста. Если бы это было в HDFS, я мог бы использовать переменную для параметра FileInputFormat isSplittable в false, и hadoop позаботился бы об этом, но, поскольку все данные являются локальными, это вызывает проблемы.
По сути, все, что я хочу, - это иметь возможность сканировать структуры локальных каталогов на каждом узле в моем кластере ровно один раз, обрабатывать коллекцию SSTables в этих каталогах и генерировать строки (на устройстве отображения) и сокращать результаты (на этапе сокращения) до HDFS для дальнейшей массовой обработки.
Я заметил, что inputSplits предоставляют функцию getLocations, но я полагаю, что это не гарантирует локальность выполнения, а только оптимизирует ее и, если я попытаюсь использовать file:///some_path в каждом преобразователе, мне нужно обеспечить точную локальность, иначе я могу завершить читать несколько каталогов несколько раз, а другие нет вообще.
Любая помощь будет принята с благодарностью.
1 ответ
Я вижу, что есть три способа сделать это.
1.) Просто загрузите данные в HDFS, чего вы не хотите делать. Но стоит попробовать, так как это будет полезно для дальнейшей обработки
2.) Вы можете использовать NLineInputFormat. Создайте четыре разных файла с URL-адресами входных файлов в каждом узле.
file://192.168.2.3/usr/rags/data/DFile1.xyz
.......
Вы загружаете эти файлы в HDFS и записываете свою программу в эти файлы, чтобы получить доступ к данным с помощью этих URL-адресов и обработать ваши данные. Если вы используете NLineInputFormat с 1 строкой. Вы обработаете 16 картографов, каждая карта обрабатывает эксклюзивный файл. Единственная проблема здесь, есть высокая вероятность того, что данные на одном узле могут быть обработаны на другом узле, однако не будет никакой повторной обработки
3.) Вы можете дополнительно оптимизировать вышеуказанный метод, загрузив вышеуказанные четыре файла с URL-адресами отдельно. При загрузке любого из этих файлов вы можете удалить три других узла, чтобы убедиться, что файл точно отправляется на узел, где файлы данных присутствуют локально. Во время загрузки выберите репликацию 1, чтобы блоки не реплицировались. Этот процесс увеличит вероятность запуска карт, обрабатывающих локальные файлы, в очень высокой степени.
Приветствия Тряпки