使用 REST API 在 HDInsight 中运行 Apache Hive 查询

借助 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 查询的步骤

  1. 使用以下命令验证是否可以连接到 HDInsight 群集。

    该命令使用以下参数:

    • u:用于对请求进行身份验证的用户名和密码。
    • G:指示此请求为 GET 作。
       curl -H "Authorization: Bearer $TOKEN" -G https://$CLUSTER_NAME.azurehdinsight.cn/templeton/v1/status
    
    
  2. 收到类似于以下文本的响应:

         {"status":"ok","version":"v1"}
    
  3. 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"}
    
  4. 使用以下代码创建一个名为 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 存储在群集的默认存储的目录中。