Выполнение запросов Apache Hive в Apache Hadoop в HDInsight с использованием REST
Узнайте, как с помощью REST API WebHCat выполнять запросы Apache Hive с Apache Hadoop в кластере Azure HDInsight.
Необходимые компоненты
Кластер Apache Hadoop в HDInsight. Ознакомьтесь со статьей Краткое руководство. Использование Apache Hadoop и Apache Hive в Azure HDInsight с шаблоном Resource Manager.
Клиент REST. В этом документе используется командлет Invoke-WebRequest в Windows PowerShell и Curl в Bash.
При использовании Bash также потребуется jq, обработчик командной строки JSON. См. раздел https://stedolan.github.io/jq/.
Базовый 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.
Установка (сохранение учетных данных)
Вы можете сохранить свои учетные данные, чтобы не вводить их повторно для каждого примера. Имя кластера будет сохранено на отдельном шаге.
А. Bash
Отредактируйте приведенный ниже скрипт, заменив в нем PASSWORD
фактическим паролем. Затем введите команду.
export PASSWORD='PASSWORD'
B. 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
Чтобы убедиться, что можно подключиться к кластеру 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.
Начало 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"}
Используйте следующую команду, чтобы создать таблицу 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 заменяются знаком
+
. Заключенные в кавычки значения, содержащие пробелы в качестве разделителя, заменять на+
не нужно.Эта команда возвращает идентификатор задания, который может использоваться для проверки состояния задания.
Чтобы проверить состояние задания, используйте следующую команду.
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 (Успешно).
После изменения состояния задания на SUCCEEDED результаты задания можно получить из хранилища больших двоичных объектов Azure. Параметр
statusdir
, передаваемый с помощью запроса, содержит расположение выходного файла. В данном случае это/example/rest
. Этот адрес задает каталогexample/curl
для сохранения выходных данных, который размещен в хранилище по умолчанию для кластера.Вы можете вывести список этих файлов и скачать их с помощью интерфейса командной строки Azure. Дополнительные сведения см. в статье Об использовании Azure CLI с служба хранилища Azure.
Следующие шаги
Дополнительная информация о других способах работы с Hadoop в HDInsight.
- Использование Apache Hive с Apache Hadoop в HDInsight
- Использование MapReduce в Apache Hadoop в HDInsight
Дополнительную информацию о REST API, используемом в этом документе, см. в справочнике по WebHCat.