Порядок выполнения/приоритет задач карты Hadoop

У меня есть ~5000 записей во входном файле Hadoop, но я заранее знаю, что обработка некоторых строк займет гораздо больше времени, чем других (на этапе карты). (В основном потому, что мне нужно скачать файл с Amazon S3, а размер файла зависит от задачи)

Я хочу убедиться, что самые большие задачи карты обрабатываются в первую очередь, чтобы убедиться, что все мои узлы Hadoop закончат работу примерно в одно и то же время.

Есть ли способ сделать это с помощью Hadoop? Или нужно все переделывать? (Я новичок в Hadoop)

Спасибо!


person kiv    schedule 12.08.2013    source источник
comment
Интересный вопрос, я не думаю, что вы можете контролировать балансировку нагрузки карты (разделение происходит между фазой карты и уменьшением). Каждое разделение входных данных приводит к задаче карты. Если возможно, вы можете попытаться вручную сгруппировать записи (например, внутри одного файла), чтобы несколько записей находились в одном и том же разделении, но я не знаю, возможно ли это для вашей проблемы?   -  person DDW    schedule 12.08.2013


Ответы (1)


Ну, если бы вы реализовали свой пользовательский формат InputFormat (метод getSplits() содержит логику создания разделения), то теоретически вы могли бы достичь того, чего хотите.

НО, вы должны проявлять особую осторожность, потому что порядок того, как InputFormat возвращает разбиение, не совпадает с порядком того, как Hadoop будет его обрабатывать. Внутри JobClient есть разделенный код повторного заказа:

// sort the splits into order based on size, so that the biggest
// go first
Arrays.sort(array, new NewSplitComparator());

что сделает все это более сложным. Но вы можете реализовать собственный InputFormat + собственный InputSplit и сделать InputSlip#length() зависимым от ожидаемого времени выполнения.

person oae    schedule 12.08.2013
comment
Хорошо, я вижу подвох! Однако не будет ли опасно, если getLength() не возвращает фактический размер? Быстрый поиск в JobCLient показывает, что большая часть кода полагается на правильность этого значения. - person kiv; 12.08.2013
comment
MMh это наиболее важно для расчета хода выполнения задания, который выводится из длины расщеплений и положения считывателей записей. Поэтому, если вы реализуете InputFormat, вы можете передать собственную реализацию RecordReader, которая обрабатывает «неправильный» размер. Так что все это выполнимо, но очень хакерски... добро пожаловать в Hadoop! ;) - person oae; 13.08.2013