使用 REST API 在已启用 Entra ID 的 HDInsight 上使用 Apache Hadoop 运行 MapReduce 作业

Apache Hadoop MapReduce 提供了一个功能强大的编程模型,用于在分布式环境中处理和分析大型数据集。 在 Azure HDInsight 中,可以通过 REST API 提交和管理 MapReduce 作业,从而可以将 Hadoop 工作负载集成到应用程序、脚本和自动化管道中。

使用启用了 Microsoft Entra ID 的 HDInsight 群集时,身份验证和访问控制将通过组织标识进行安全处理。 此措施可确保只有经过授权的用户和应用程序才能提交 MapReduce 作业,从而帮助你满足企业安全性和合规性要求。

本指南逐步讲解如何连接到已启用 Entra 的 HDInsight 群集、通过 REST 进行身份验证以及以编程方式提交 MapReduce 作业。

先决条件

Note

使用 Curl 或任何其他 REST 与 WebHCat 通信时,必须通过提供为群集生成的访问令牌对请求进行身份验证。 必须将群集名称作为 URI 的一部分来发送请求到服务器。 REST API 使用 OAuth 2.0 进行保护。 应始终使用 HTTPS 发出请求,以确保凭据安全地发送到服务器。

设置(安全持有者访问令牌)

需要持有者令牌才能发送 cURL 或任何 REST 通信。 可以按照上述步骤获取令牌:

使用以下规范对 OAuth 2.0 令牌终结点执行 HTTP GET 请求:

URL

  https://login.chinacloudapi.cn/{Tenant_ID}/oauth2/v2.0/token

身体

参数 Description 必需
授权类型 (grant_type) 必须设置为“client_credentials”
客户编号 Entra 应用注册的应用程序(客户端)ID
client_secret 生成的客户端机密或证书
作用域 具有默认后缀的资源 URL

cURL 请求

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"
 }

在获取执行每个操作所需的访问令牌后,我们直接来看相关命令。

Curl

  1. 为方便使用,请设置脚本中的变量。 此示例基于 Windows 环境。 根据您的环境进行必要的修改。

      set TOKEN= <access_token>
    
  2. 在命令行中,使用以下命令验证是否可以连接到 HDInsight 群集:

      curl -H "Authorization: Bearer $TOKEN" -G https://$CLUSTERNAME.azurehdinsight.cn/templeton/v1/status
    

    此命令中使用的参数如下所示:

    • u:指示用于对请求进行身份验证的用户名和密码
    • G:指示此作是 GET 请求

    URI https://CLUSTERNAME.azurehdinsight.cn/templeton/v1的开头对所有请求都是相同的。

    收到类似于以下 JSON 的响应:

      {"version":"v1","status":"ok"}
    
    
  3. 若要提交 MapReduce 作业,请使用以下命令。 根据需要修改 jq 的路径。

    curl -H "Authorization: Bearer $TOKEN" -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.cn/templeton/v1/mapreduce/jar | ^
    jq -r .id
    
    

    URI(/mapreduce/jar)的末尾告诉 WebHCat,此请求从 jar 文件中的类启动 MapReduce 作业。 此命令中使用的参数如下所示:

    • d:不使用“G”,因此请求默认为 POST 方法。 “d”指定随请求一起发送的数据值。

    • user.name:运行命令的用户

    • jar:包含要运行的类的 jar 文件的位置

    • :包含 MapReduce 逻辑的类

    • arg:要传递给 MapReduce 作业的参数。 在这种情况下,输入文本文件和用于输出的目录

    此命令应返回可用于检查作业状态的作业 ID: job_1415651640909_0026

  4. 若要检查作业的状态,请使用以下命令。 将值 JOBID 替换为在上一步返回的 实际 值。 根据需要修改 jq 的位置。

      set JOBID=job_1415651640909_0026
    
      curl -G -H "Authorization: Bearer $TOKEN" -d user.name=admin https://$CLUSTERNAME.azurehdinsight.cn/templeton/v1/jobs/$JOBID | ^
      jq .status.state
    
    

    PowerShell

  5. 为方便使用,请设置脚本中的变量。 将CLUSTERNAME替换为您的实际群集名称。 执行命令,并在出现提示时输入群集登录密码。

    
           $clusterName="CLUSTERNAME"
    
           # Define the bearer token
           $bearerToken = <access_token>
    
           # Define the API endpoint
           $apiEndpoint = "https://$clusterName.azurehdinsight.cn/templeton/v1/status"
    
  6. 使用以下命令验证是否可以连接到 HDInsight 群集:

    
           # Make the API request with the bearer token
           $response = Invoke-WebRequest -Uri $apiEndpoint -Headers @{Authorization = "Bearer $bearerToken"} -UseBasicParsing
    
           # Output the response content
           $response.Content
    

    收到类似于以下 JSON 的响应:

       {"version":"v1","status":"ok"}
    
    
  7. 若要提交 MapReduce 作业,请使用以下命令:

    
            # Define the request parameters
            $reqParams = @{
            "user.name" = "admin"
            jar = "/example/jars/hadoop-mapreduce-examples.jar"
            class = "wordcount"
            arg = @(
            "/example/data/gutenberg/davinci.txt"
            "/example/data/output"
            )
            }
    
            # Make the API request with the bearer token
            $response = Invoke-WebRequest -Uri $apiEndpoint -Headers @{Authorization = "Bearer $bearerToken"} -Body                      $reqParams -Method POST -UseBasicParsing
    
            # Output the raw response content
            $jobID = (ConvertFrom-Json $resp.Content).id
            $jobID
    

    URI(/mapreduce/jar)的末尾告诉 WebHCat,此请求从 jar 文件中的类启动 MapReduce 作业。 此命令中使用的参数如下所示:

    此命令应返回可用于检查作业状态的作业 ID: job_1415651640909_0026

  8. 若要检查作业的状态,请使用以下命令:

          $reqParams=@{"user.name"="admin"}
          # Make the API request with the bearer token
          $response = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.cn/templeton/v1/jobs/$jobID" -Headers @{Authorization = "Bearer $bearerToken"} -Body $reqParams -UseBasicParsing

          # ConvertFrom-JSON can't handle duplicate names with different case
          # So change one to prevent the error
          $fixDup = $response.Content.Replace("jobID", "job_ID")
          (ConvertFrom-Json $fixDup).status.state

这两种方法

  • 如果作业已完成,则返回的状态为 SUCCEEDED

  • 当作业状态更改为 SUCCEEDED时,可以从 Azure Blob 存储中检索作业的结果。 statusdir随查询一起传递的参数包含输出文件的位置。 在此示例中,位置为 /example/curl. 此地址将作业的输出存储在群集默认存储中 /example/curl

    可以使用 Azure CLI 列出和下载这些文件。 有关使用 Azure CLI 处理 Azure Blob 存储的详细信息,请参阅 快速入门:使用 Azure CLI 创建、下载和列出 Blob