Статьи

Советы новичкам по упругому MapReduce

Примечание куратора: содержание этой статьи написано  Джоном Берриманом.   

К этому моменту все хорошо знакомы с мощью MapReduce Hadoop. Но вы также, вероятно, хорошо знакомы с болью, которую нужно испытывать при настройке собственного кластера Hadoop. Конечно, есть несколько действительно хороших уроков онлайн, если вы знаете, где искать:

Тем не менее, я не разработчик, и я притворяюсь им только тогда, когда мне нужно! Из-за этого я решил взглянуть на Amazon Elastic MapReduce и по большей части мне было очень приятно. Однако я столкнулся с парой трудностей, и, надеюсь, эта короткая статья поможет вам избежать моих подводных камней.

Elastic MapReduce делает все простым. Всего за несколько шагов и всего за несколько минут вы можете запустить свое собственное задание MapReduce в кластере любого размера и конфигурации. Сначала войдите в консоль AWS, перейдите на страницу Elastic MapReduce и нажмите «Создать новый поток работ» в левом верхнем углу главной панели.

Снимок экрана 2013-04-21 в 15.25.25

Далее вы называете свою работу и указываете, что вы поставите свой собственный банку.

Снимок экрана 2013-04-21 в 15.31.58

На следующем экране вы сообщаете EMR, где именно находится файл JAR. Это будет путь, который начинается с имени корзины S3, к которой у вас есть доступ в AWS. Вы также указываете входные данные для вашей работы. Для большинства людей это, вероятно, будет включать в себя путь к каталогу ввода и к нему, а также путь к каталогу вывода (как я указал здесь), но вы можете использовать это пространство, чтобы включить любой аргумент, который вы захотите. Здесь есть несколько потенциальных ошибок. Во-первых, если вы не указали основной класс в своем манифесте jar, то   здесь первым аргументом должен быть полностью определенный класс. Во-вторых, если вы указываете на каталоги в S3, убедитесь, что вы включили протокол S3:"s3://yourBucket/yourDirectory"

Снимок экрана 2013-04-21 в 15.36.27

На следующем экране вы увидите удивительную эффективность Elastic MapReduce. Не возиться с избитыми сценариями развертывания; Вы просто выбираете тип машины, которую вы хотите для мастера, тип и количество машин, которые вы хотите для рабов. Как вы можете видеть здесь, я строю кластер из 1021 машины из самых больших машин, которые может предложить AWS! (… А потом, после того, как я сделал этот снимок экрана, я испугался и вернул его в кластер «маленьких» из 3 машин.)

Снимок экрана 2013-04-21 в 15.45.56

На следующем экране есть много вкусностей, на которые стоит обратить внимание. Если вы когда-нибудь захотите подключиться к создаваемому кластеру ssh (что часто является хорошей идеей), вы должны обязательно указать пару ключей Amazon EC2. Пока вы отлаживаете установку, также неплохо установить каталог для отправки файлов журнала. И хотя я еще не нашел это полезным, вероятно, также неплохо бы включить отладку. И, наконец, ключ ssh бесполезен, если задание не удалось и AWS отключил ваш кластер, поэтому выберите опцию «Сохранить в живых», если вам нужно войти в компьютер и выполнить вскрытие. Как мы увидим чуть позже, возможность использования ssh в мастере Hadoop также полезна для проведения экспериментов в той же среде, в которой будет выполняться ваша работа.

Снимок экрана 2013-04-21 в 15.56.40

Хотя они мне пока не нужны, на следующем экране вы можете «загрузить» свой кластер Hadoop. Так, например, вы можете установить программное обеспечение, запустить пользовательские сценарии или настроить параметры конфигурации самого Hadoop. Для опытного пользователя это должно быть весьма полезно.

Снимок экрана 2013-04-21 в 16.05.38

На последнем экране Elastic MapReduce позволяет вам просмотреть конфигурацию, прежде чем нажимать большую кнопку «Создать поток работ», и все становится на свои места. Как только вы создадите свой поток работ, вы можете вернуться на главный экран Elastic MapReduce и посмотреть, как ваш кластер строится, работает и завершает работу — или, в моем случае, СБОЙ!

Итак, давайте перейдем к обсуждению: каковы некоторые из распространенных ошибок и как их избежать? Выше я уже описал пару: убедитесь, что вы указали основной класс вашего jar-файла (если он еще не указан в манифесте jar-файла), и, поскольку вы, вероятно, извлекаете и нажимаете на S3, обязательно используйте полностью определенные URI, включая  S3:// протокол.

Этот последний причинил мне некоторую боль. Давайте посмотрим, как я выследил свою проблему, и, надеюсь, это поможет вам в будущем, когда вы будете искать свою проблему.

Обратите внимание на большое сообщение «FAILED» для состояния моей работы. Это была моя первая подсказка, что что-то может быть не так.

Снимок экрана 2013-04-21 в 4:28.54 PM

Теперь обратите внимание на кнопку «Отладка» в заголовке таблицы. Нажав на эту кнопку, вы получите доступ к нескольким полезным файлам отладки.

Снимок экрана 2013-04-21 в 4.34.07 вечера

В моем случае файл «stderr» был самым полезным. Это вывод stderr, который произошел во время выполнения задания, поэтому вы увидите, где произошла ошибка  в вашем Java-коде .

Для меня ошибка была о нулевом значении, которое в основном указывало, что файл не существует. Это беспокоило, потому что я запускал работу несколько раз локально без проблем, и я дважды проверил, и эти файлы были именно там, где (я думал) я указал. Так что что-то отличалось между моей местной средой и средой моей работы в Elastic MapReduce. Но что?!

К счастью, я указал ключ ssh и указал, что кластер должен оставаться в живых после запуска или сбоя задания, чтобы я мог легко подключиться по ssh. Но здесь отладка становится немного сложнее. Ошибка произошла глубоко в моем коде, и я действительно не хотел вносить небольшие изменения в Java на моем локальном компьютере, собирать все файлы и отправлять их на удаленный компьютер. Оборот этого процесса занял бы 15 минут, и я бы уничтожил свой код в этом процессе.

Вместо этого я решил написать Java на удаленном компьютере для относительно быстрого цикла отладки. Я обнаружил, что могу использовать vim для репликации проблемной части своего кода, и в одной строке bash я могу скомпилировать свой код (Test.java), выполнить его jar (как Test.jar) и запустить его в Hadoop. Вот моя волшебная линия:

javac -cp $HADOOP_HOME Test.java;  jar cf Test.jar Test.class;  hadoop jar Test.jar Test s3://myBucket/myDirectory

И, как оказалось, у меня была ошибка, потому что я использовал стандартную файловую систему Hadoop

FileSystem fs =FileSystem.get(conf);

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

FileSystem fs =newPath("s3://myBucket/myDirectory").getFileSystem(conf);

И, наконец, в моем случае была еще одна проблема, которая могла бы вам помочь. Важно знать, что все JVM не равны! Я занимаюсь обработкой изображений, поэтому интенсивно использую API Java Advanced Imaging (JAI). На моей локальной машине это происходит с JVM, однако JVM, используемая Elastic MapReduce, не имеет этих зависимостей (и, возможно, не имеет никаких зависимостей javax). Чтобы решить эту проблему, мне пришлось снять эти дополнительные зависимости и убедиться, что они включены в мой файл JAR. Но, как только я это сделал, все прошло гладко, как вам угодно!

В общем, мне очень нравится Elastic MapReduce. Это дает вам возможность быстро приступить к работе, не беспокоясь о настройке или задачах администрирования.