Запуск заданий MapReduce в среде Apache Hadoop, размещенной в HDInsight, с помощью REST

Узнайте, как с помощью REST API WebHCat для Apache Hive запускать задания MapReduce в среде Apache Hadoop, размещенной в кластере HDInsight. Curl используется для демонстрации возможностей взаимодействия с HDInsight с помощью необработанных HTTP-запросов для выполнения заданий MapReduce, их мониторинга и получения их результатов.

Примечание

Если вы уже знакомы с использованием серверов Hadoop на платформе Linux, но не знакомы с HDInsight, ознакомьтесь с документом Сведения об использовании HDInsight в Linux.

Предварительные требования

Любое из следующих:

  • Windows PowerShell;
  • Curl с jq.

Выполнение задания MapReduce

Примечание

При использовании Curl или любых других средств связи REST с WebHCat нужно проводить аутентификацию запросов с помощью пароля и имени пользователя администратора кластера HDInsight. Имя кластера необходимо использовать в составе универсального кода ресурса (URI), используемого для отправки запросов на сервер.

API-интерфейс REST защищается с помощью обычной проверки подлинности доступа. Чтобы обеспечить безопасную отправку учетных данных на сервер, все запросы следует отправлять с помощью протокола HTTPS.

Curl

  1. Для удобства работы задайте указанные ниже переменные. Этот пример предназначен для среды Windows. Измените его в соответствии с требованиями используемой среды.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. Используйте следующую команду в командной строке, чтобы проверить возможность подключения к кластеру HDInsight:

    curl -u admin:%PASSWORD% -G https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/status
    

    Ниже приведены параметры, используемые в этой команде:

    • -u: имя пользователя и пароль, используемые для аутентификации запроса.
    • -G: указывает, что это запрос GET.

    Начало URI https://CLUSTERNAME.azurehdinsight.net/templeton/v1 одинаковое для всех запросов.

    Вы должны получить ответ, аналогичный показанному ниже коду JSON.

    {"version":"v1","status":"ok"}
    
  3. Чтобы отправить задание MapReduce, используйте следующую команду: При необходимости измените путь к jq.

    curl -u admin:%PASSWORD% -d user.name=admin ^
    -d jar=/example/jars/hadoop-mapreduce-examples.jar ^
    -d class=wordcount -d arg=/example/data/gutenberg/davinci.txt -d arg=/example/data/output ^
    https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/mapreduce/jar | ^
    C:\HDI\jq-win64.exe .id
    

    Конец универсального кода ресурса (/mapreduce/jar) сообщает WebHCat, что этот запрос запускает задание MapReduce из класса в JAR-файле. Ниже приведены параметры, используемые в этой команде:

    • -d: -G не используется, поэтому в запросе по умолчанию используется метод POST. -d задает значения данных, отправляемые в запросе.
      • user.name— пользователь, выполняющий команду.
      • jar: расположение JAR-файла, содержащего класс для запуска.
      • class: класс, содержащий логику MapReduce.
      • arg: аргументы, передаваемые в задание MapReduce. В данном случае это входной текстовый файл и каталог, который используется для вывода.

    Эта команда должна вернуть идентификатор задания, который можно использовать для проверки состояния задания: job_1415651640909_0026.

  4. Чтобы проверить состояние задания, используйте следующую команду. Замените значение JOBIDреальным значением, полученным на предыдущем шаге. При необходимости измените расположение jq.

    set JOBID=job_1415651640909_0026
    
    curl -G -u admin:%PASSWORD% -d user.name=admin https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/jobs/%JOBID% | ^
    C:\HDI\jq-win64.exe .status.state
    

PowerShell

  1. Для удобства работы задайте указанные ниже переменные. Вместо CLUSTERNAME укажите реальное имя кластера. Выполните команду и введите пароль для входа в кластер, когда появится соответствующий запрос.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. Используйте следующую команду, чтобы проверить возможность подключения к кластеру HDInsight:

    $resp = Invoke-WebRequest -Uri "https://$clustername.azurehdinsight.net/templeton/v1/status" `
        -Credential $creds `
        -UseBasicParsing
    $resp.Content
    

    Вы должны получить ответ, аналогичный показанному ниже коду JSON.

    {"version":"v1","status":"ok"}
    
  3. Чтобы отправить задание MapReduce, используйте следующую команду:

    $reqParams = @{}
    $reqParams."user.name" = "admin"
    $reqParams.jar = "/example/jars/hadoop-mapreduce-examples.jar"
    $reqParams.class = "wordcount"
    $reqParams.arg = @()
    $reqParams.arg += "/example/data/gutenberg/davinci.txt"
    $reqparams.arg += "/example/data/output"
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/mapreduce/jar" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Конец универсального кода ресурса (/mapreduce/jar) сообщает WebHCat, что этот запрос запускает задание MapReduce из класса в JAR-файле. Ниже приведены параметры, используемые в этой команде:

    • user.name— пользователь, выполняющий команду.
    • jar: расположение JAR-файла, содержащего класс для запуска.
    • class: класс, содержащий логику MapReduce.
    • arg: аргументы, передаваемые в задание MapReduce. В данном случае это входной текстовый файл и каталог, который используется для вывода.

    Эта команда должна вернуть идентификатор задания, который можно использовать для проверки состояния задания: job_1415651640909_0026.

  4. Чтобы проверить состояние задания, используйте следующую команду.

    $reqParams=@{"user.name"="admin"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" `
       -Credential $creds `
       -Body $reqParams `
       -UseBasicParsing
    
    # ConvertFrom-JSON can't handle duplicate names with different case
    # So change one to prevent the error
    $fixDup=$resp.Content.Replace("jobID","job_ID")
    (ConvertFrom-Json $fixDup).status.state
    

Оба метода

  1. Если задание завершено, то возвращается состояние SUCCEEDED.

  2. После изменения состояния задания на SUCCEEDED результаты задания можно получить из хранилища BLOB-объектов Azure. Параметр statusdir, передаваемый в запросе, содержит расположение выходного файла. В данном случае это /example/curl. Этот адрес задает каталог /example/curl для сохранения выходных данных задания, который размещен в хранилище по умолчанию для кластера.

Вы можете вывести список этих файлов и скачать их с помощью интерфейса командной строки Azure. Дополнительные сведения о работе с хранилищем BLOB-объектов см. в статье Краткое руководство. Создание, скачивание и составление списка больших двоичных объектов с помощью Azure CLI.

Дальнейшие действия

Дополнительная информация о других способах работы с Hadoop в HDInsight:

Дополнительные сведения об интерфейсе REST, используемом в этой статье, см. в справочнике по WebHCat.