借助 Apache Hive,可以使用熟悉的类似 SQL 的语言查询和分析 Azure HDInsight 中的大型数据集。 HDInsight 中的 REST API 提供了一种以编程方式提交 Hive 查询、监视执行和检索结果。 无需直接登录到群集或使用手动工具。
使用 REST API,可以将 Hive 查询执行集成到应用程序、脚本和自动化管道中。 此方法适用于需要从外部系统运行查询、通过 Microsoft Entra ID 强制实施安全访问或大规模管理工作负荷的方案。
先决条件
- Microsoft Entra ID 启用的 Apache Hadoop 群集在 HDInsight 上。 参阅 Linux 上的 HDInsight 入门。
- REST 客户端。 本文档使用 cURL。
- 如果使用 Bash,请使用命令行 JSON 处理器 jq。 请参阅下载 jq。
REST API 的基础 URI
HDInsight 上的 REST API 的基本统一资源标识符(URI)是 https://CLUSTERNAME.azurehdinsight.cn/api/v1/clusters/CLUSTERNAME,其中 CLUSTERNAME 是群集的名称。 URI 中的群集名称 区分大小写。 尽管 URICLUSTERNAME.azurehdinsight.cn 的完全限定域名(FQDN)中的群集名称(FQDN)不区分大小写,但 URI 中的其他事件区分大小写。
Authentication
使用 cURL 或任何其他 REST 与 WebHCat 通信时,必须通过为 HDInsight 群集管理员提供持有者令牌对请求进行身份验证。 REST API 通过 OAuth 2.0 进行保护。 为了帮助确保凭据安全地发送到服务器,请始终使用安全 HTTP (HTTPS) 发出请求。
设置安全持有者访问令牌
需要持有者令牌才能发送 cURL 或任何 REST 通信。 若要获取令牌,请执行下列作。
HTTP GET使用以下规范执行对 OAuth 2.0 令牌终结点的请求。
URL
https://login.chinacloudapi.cn/{Tenant_ID}/oauth2/v2.0/token
Body
curl --request GET \
--url https://login.chinacloudapi.cn/{tenant_id}/oauth2/v2.0/token \
--header 'Content-Type: multipart/form-data' \
--form grant_type=client_credentials \
--form client_id={app_id} \
--form client_secret={client_secret} \
--form scope=https://{clustername}.clusteraccess.azurehdinsight.cn/.default \
响应
成功的请求返回一个 JSON 对象,其中包含:
token_type:始终为Bearer。expires_in:令牌有效期(以秒为单位)。ext_expires_in:延长过期时间(以秒为单位)。access_token:用于身份验证的持有者令牌。{ "token_type": "Bearer", "expires_in": 3599, "ext_expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1iLCJub25jZSI6IkhaZ3lqQ2MxSkxzaXRSbmxzT1FTSHV0bEtBeXhhMU1JTzdyWmluLWF6LUEiLCJhbGciOiJSUzI1NiIsIng1dCI6ImltaTBZMnowZFlLeEJ0dEFxS19UdDVoWUJUayIsImtpZCI6ImltaTBZMnowZFlLeEJ0dEFxS19UdDVoWUJUayJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8wY2QzZGY5OS1lMDJmLTRmZDgtYTdkOC0zYjE5ZWVhZGFiYTUvIiwiaWF0IjoxNzQxMjgzMzUzLCJuYmYiOjE3NDEyODMzNTMsImV4cCI6MTc0MTI4NzI1MywiYWlvIjoiazJSZ1lIRDF1U1R4NGx2bjdmMTdGcXlkZUdwWlBnQT0iLCJhcHBfZGlzcGxheW5hbWUiOiJBenVyZSBIREkgTVNGVCBDbGllbnQiLCJhcHBpZCI6IjAzZDNiNTg5LWFjM2MtNDE4NC1iY2EyLTQ3ZWRiN2Q2ZmVjNiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzBjZDNkZjk5LWUwMmYtNGZkOC1hN2Q4LTNiMTllZWFkYWJhNS8iLCJpZHR5cCI6ImFwcCIsIm9pZCI6ImQ0NDA3YjQ4LWZmZTctNDJjNS04ZDIwLTdiMTTgwNWE4NCIsInJoIjoiMS5BUnNBbWRfVERDX2cyRS1uMkRzWjdxMnJwUU1BQUFBQUFBQUF3QUFBQUFBQUFBRFlBQUFiQUEuIiwic3ViIjoiZDQ0MDdiNDgtZmZlNy00MmM1LThkMjAtN2IxMzU5ODA1YTg0IiwidGVuYW50X3JlZ2lvbl9zY29wZSI6Ik5BIiwidGlkIjoiMGNkM2RmOTktZTAyZi00ZmQ4LWE3ZDgtM2IxOWVlYWRhYmE1IiwidXRpIjoiLVA1T3JPWGpJVWk0VE12dElTYWRBQSIsInZlciI6IjEuMCIsIndpZHMiOlsiMDk5N2ExZDAtMGQxZC00YWNiLWI0MDgtZDVjYTczMTIxZTkwIl0sInhtc19pZHJlbCI6IjI4IDciLCJ4bXNfdGNkdCI6MTQ4NjM3NDQ2MH0.a9z3ZYyMTRQCoY7dzPYE55DmpNAxqo4a4rrt80A-RpK0NDDAftNkc2hafbLl6gdwEzqRyKc1HExUggFUpKxaLUXc62-u-9emxC12EsNlQYd-ZzG_GRDNoTYrro4RDRL-_gDo2lgBNOi5ZZ4a9UI_pYVvV1b0SBRpgd5bmIV4kI2tDfAVZ1-HMpGscuVkQIy45Tqt4c3gXPoMEZ3UYikbCpErbTNfUFqngE3sARXRV-rB1OMu6ZbN32ijjL-rD8593-IfSpmVDUfE5CMGc-7FuWGOYyUUJmp5AQ1yFpJzqaDBEdPT8kKync1o7eplWXCsPWOnVvAKNf7BuWCRRedBWg" }
运行 Hive 查询的步骤
使用以下命令验证是否可以连接到 HDInsight 群集。
该命令使用以下参数:
-
u:用于对请求进行身份验证的用户名和密码。 -
G:指示此请求为GET作。
curl -H "Authorization: Bearer $TOKEN" -G https://$CLUSTER_NAME.azurehdinsight.cn/templeton/v1/status-
收到类似于以下文本的响应:
{"status":"ok","version":"v1"}URL
https://$CLUSTERNAME.azurehdinsight.cn/templeton/v1的开头对所有请求都是相同的。 路径/status指示你请求为服务器返回 WebHCat(也称为 Templeton)的状态。 还可以使用以下命令请求 Hive 版本:curl -H "Authorization: Bearer $TOKEN" -G https://$CLUSTER_NAME.azurehdinsight.cn/templeton/v1/version/hive会收到类似于以下代码片段的响应:
{"module":"hive","version":"1.2.1000.2.6.5.3008-11"}使用以下代码创建一个名为
log4jLogs:curl -s -H "Authorization: Bearer $TOKEN" -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.cn/templeton/v1/hive | jq -r .id此请求使用自测试 (
POST) 方法,该方法将数据作为请求的一部分发送到 REST API。 以下数据值随请求一起发送:-
user.name:运行命令的用户。 -
execute:要运行的 HiveQL 语句。 -
statusdir:要在其中写入作业状态的目录。
这些语句执行以下操作:
DROP TABLE:删除表(如果已存在)。CREATE EXTERNAL TABLE:在 Hive 中创建新的 外部 表。 外部表仅将表定义存储在 Hive 中。 数据保留在原始位置。注释
当外部源更新基础数据时,请使用外部表。 例如,自动化数据上传过程或其他
MapReduce作。删除外部表只会删除表定义,而不会删除数据。
-
请参阅以下定义:
-
ROW FORMAT:如何设置数据的格式。 每个日志中的值用空格分隔。 -
STORED AS TEXTFILE LOCATION:显示数据的存储位置(示例或数据目录)。 显示数据以文本的形式存储。 -
SELECT:选择列t4包含值[ERROR]的所有行的计数。 此语句返回一个值,3因为有三行包含此值。
注释
cURL 代码将 HiveQL 语句之间的空格替换为 + 字符。 代码不应替换包含空格的带引号的值,如分隔符。
此命令返回可用于检查作业状态的作业 ID。
作业状态
使用以下代码检查作业状态:
curl -H "Authorization: Bearer $TOKEN" -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.cn/templeton/v1/jobs/$jobid | jq .status.state
如果作业完成,则状态应为 SUCCEEDED。
在作业状态更改为 SUCCEEDED后,可以从 Azure Blob 存储中检索作业的结果。
statusdir随查询一起传递的参数包含输出文件的位置,在本例中为 /example/rest。 此地址将输出 example/curl 存储在群集的默认存储的目录中。