Выполнение запросов Apache Hive в Apache Hadoop в HDInsight с использованием REST

Узнайте, как с помощью REST API WebHCat выполнять запросы Apache Hive с Apache Hadoop в кластере Azure HDInsight.

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

Базовый URI для REST API

Базовый универсальный идентификатор ресурса (URI) для REST API в HDInsight — https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, где CLUSTERNAME — это имя вашего кластера. Имена кластеров в URI задаются с учетом регистра. Хотя имя кластера в полном доменном имени в URI (CLUSTERNAME.azurehdinsight.net) указывается без учета регистра, в других вхождениях этого URI регистр учитывается.

Аутентификация

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

Установка (сохранение учетных данных)

Вы можете сохранить свои учетные данные, чтобы не вводить их повторно для каждого примера. Имя кластера будет сохранено на отдельном шаге.

A. Bash
Отредактируйте приведенный ниже скрипт, заменив в нем PASSWORD фактическим паролем. Затем введите команду.

export PASSWORD='PASSWORD'

Б. PowerShell Выполните приведенный ниже код и введите учетные данные во всплывающем окне:

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

Укажите имя кластера в правильном регистре

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

Отредактируйте приведенные ниже скрипты, заменив CLUSTERNAME именем своего кластера. Затем введите команду. (Имя кластера в FQDN не учитывает регистр.)

export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
    -Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;

# Show cluster name
$clusterName

Выполнение запроса Hive

  1. Чтобы убедиться, что можно подключиться к кластеру HDInsight, используйте одну из следующих команд:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

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

    {"status":"ok","version":"v1"}
    

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

    • -u — имя пользователя и пароль, используемый для проверки подлинности запроса.
    • -G — указывает, что этот запрос является операцией GET.
  2. Начало URL-адреса https://$CLUSTERNAME.azurehdinsight.net/templeton/v1 одинаковое для всех запросов. Путь /status указывает, что по запросу серверу должно быть возвращено состояние WebHCat (другое название — Templeton). Используя следующую команду, можно также запросить версию Hive:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Этот запрос возвращает ответ, аналогичный показанному ниже тексту.

    {"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
    
  3. Используйте следующую команду, чтобы создать таблицу log4jLogs.

    JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="DROP+TABLE+log4jLogs;CREATE+EXTERNAL+TABLE+log4jLogs(t1+string,t2+string,t3+string,t4+string,t5+string,t6+string,t7+string)+ROW+FORMAT+DELIMITED+FIELDS+TERMINATED+BY+' '+STORED+AS+TEXTFILE+LOCATION+'/example/data/';SELECT+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id)
    echo $JOB_ID
    
    $reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Этот запрос использует метод POST, который отправляет данные как часть запроса в REST API. Следующие значения данных отправляются с запросом:

    • user.name — пользователь, выполняющий команду.
    • execute — операторы HiveQL, которые необходимо выполнить.
    • statusdir — каталог, в который будет записано состояние этого задания.

    Эти операторы выполняют следующие действия:

    • DROP TABLE — если таблица уже существует, она будет удалена.

    • CREATE EXTERNAL TABLE — создает "внешнюю" таблицу в Hive. Внешние таблицы хранят только определение таблицы в Hive. Данные остаются в исходном расположении.

      Примечание

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

      Удаление внешней таблицы не приводит к удалению данных, будет удалено только определение таблицы.

    • ROW FORMAT — настройка форматирования данных. Поля всех журналов разделены пробелами.

    • STORED AS TEXTFILE LOCATION — указывает для Hive место хранения данных (каталог example/data) и их формат (текст).

    • SELECT. Подсчитывает количество строк, в которых столбец t4 содержит значение [ERROR] . Эта инструкция возвращает значение 3, так как данное значение содержат три строки.

      Примечание

      Обратите внимание, что при использовании Curl пробелы между операторами HiveQL заменяются знаком +. Заключенные в кавычки значения, содержащие пробелы в качестве разделителя, заменять на +не нужно.

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

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

    curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
    
    $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
    

    Если задание завершено, оно будет в состоянии SUCCEEDED (Успешно).

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

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

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

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

Дополнительную информацию о REST API, используемом в этом документе, см. в справочнике по WebHCat.