Compartir a través de

使用企业安全性套餐在Azure HDInsight群集中运行 Apache Oozie

Apache Oozie 是一个工作流和协调系统,用于管理 Apache Hadoop 作业。 Oozie 与 Hadoop 堆栈集成,并支持以下作业:

  • Apache MapReduce
  • Apache Pig
  • Apache Hive
  • Apache Sqoop

还可以使用 Oozie 来计划特定于系统的作业,例如Java程序或 shell 脚本。

先决条件

具有企业安全性套餐(ESP)的 Azure HDInsight Hadoop 群集。 请参阅 使用 ESP 配置 HDInsight 群集

注释

有关如何在非 ESP 群集上使用 Oozie 的详细说明,请参阅在基于 Linux 的 Azure HDInsight0 中使用 Apache Oozie 工作流。

连接到ESP集群

有关安全外壳(SSH)的详细信息,请参阅使用 SSH 连接到 HDInsight (Hadoop)。

  1. 使用 SSH 连接到 HDInsight 群集:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.cn
    
  2. 若要验证 Kerberos 身份验证是否成功,请使用 klist 命令。 如果不是,则使用 kinit 启动 Kerberos 身份验证。

  3. 登录到 HDInsight 网关以注册访问Azure Data Lake Storage所需的 OAuth 令牌:

    curl -I -u [DomainUserName@Domain.com]:[DomainUserPassword] https://<clustername>.azurehdinsight.cn
    

    状态响应代码 为 200 OK 表示注册成功。 如果收到未经授权的响应(例如 401),请检查用户名和密码。

定义工作流

Oozie 工作流定义是用 Apache Hadoop 进程定义语言(hPDL)编写的。 hPDL 是一种 XML 进程定义语言。 执行以下步骤定义工作流:

  1. 设置域用户的工作区:

    hdfs dfs -mkdir /user/<DomainUser>
    cd /home/<DomainUserPath>
    cp /usr/hdp/<ClusterVersion>/oozie/doc/oozie-examples.tar.gz .
    tar -xvf oozie-examples.tar.gz
    hdfs dfs -put examples /user/<DomainUser>/
    

    DomainUser 替换为域用户名。 将 DomainUserPath 替换为域用户的主目录路径。 将ClusterVersion替换为你正在使用的群集数据平台版本。

  2. 使用以下语句创建并编辑新文件:

    nano workflow.xml
    
  3. 打开 nano 编辑器后,输入以下 XML 作为文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.4" name="map-reduce-wf">
       <credentials>
          <credential name="metastore_token" type="hcat">
             <property>
                <name>hcat.metastore.uri</name>
                <value>thrift://<active-headnode-name>-<clustername>.<Domain>.com:9083</value>
             </property>
             <property>
                <name>hcat.metastore.principal</name>
                <value>hive/_HOST@<Domain>.COM</value>
             </property>
          </credential>
          <credential name="hs2-creds" type="hive2">
             <property>
                <name>hive2.server.principal</name>
                <value>${jdbcPrincipal}</value>
             </property>
             <property>
                <name>hive2.jdbc.url</name>
                <value>${jdbcURL}</value>
             </property>
          </credential>
       </credentials>
       <start to="mr-test" />
       <action name="mr-test">
          <map-reduce>
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <prepare>
                <delete path="${nameNode}/user/${wf:user()}/examples/output-data/mrresult" />
             </prepare>
             <configuration>
                <property>
                   <name>mapred.job.queue.name</name>
                   <value>${queueName}</value>
                </property>
                <property>
                   <name>mapred.mapper.class</name>
                   <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                   <name>mapred.reducer.class</name>
                   <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                   <name>mapred.map.tasks</name>
                   <value>1</value>
                </property>
                <property>
                   <name>mapred.input.dir</name>
                   <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                   <name>mapred.output.dir</name>
                   <value>/user/${wf:user()}/${examplesRoot}/output-data/mrresult</value>
                </property>
             </configuration>
          </map-reduce>
          <ok to="myHive2" />
          <error to="fail" />
       </action>
       <action name="myHive2" cred="hs2-creds">
          <hive2 xmlns="uri:oozie:hive2-action:0.2">
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <jdbc-url>${jdbcURL}</jdbc-url>
             <script>${hiveScript2}</script>
             <param>hiveOutputDirectory2=${hiveOutputDirectory2}</param>
          </hive2>
          <ok to="myHive" />
          <error to="fail" />
       </action>
       <action name="myHive" cred="metastore_token">
          <hive xmlns="uri:oozie:hive-action:0.2">
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <configuration>
                <property>
                   <name>mapred.job.queue.name</name>
                   <value>${queueName}</value>
                </property>
             </configuration>
             <script>${hiveScript1}</script>
             <param>hiveOutputDirectory1=${hiveOutputDirectory1}</param>
          </hive>
          <ok to="end" />
          <error to="fail" />
       </action>
       <kill name="fail">
          <message>Oozie job failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
       </kill>
       <end name="end" />
    </workflow-app>
    
  4. clustername 替换为群集的名称。

  5. 若要保存文件,请选择 Ctrl+X。 输入 Y。然后选择 Enter

    工作流分为两个部分:

    • 凭据。 本节输入用于身份验证 Oozie 操作的凭据:

      此示例对 Hive 操作使用身份验证。 若要了解详细信息,请参阅 操作身份验证

      凭据服务允许 Oozie 操作模拟用户访问 Hadoop 服务。

    • 操作。 本部分有三个操作:map-reduce、Hive 服务器 2 和 Hive 服务器 1:

      • map-reduce 动作运行一个 Oozie 包中的 map-reduce 示例,用于输出聚合字数。

      • Hive 服务器 2 和 Hive 服务器 1 操作对 HDInsight 提供的示例 Hive 表运行查询。

      Hive 操作使用凭据部分中定义的凭据进行身份验证,方法是使用操作元素中的关键字 cred 进行身份验证。

  6. 使用以下命令将 workflow.xml 文件复制到 /user/<domainuser>/examples/apps/map-reduce/workflow.xml

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. domainuser 替换为您在域中的用户名。

定义 Oozie 作业的属性文件

  1. 使用以下语句为作业属性创建和编辑新文件:

    nano job.properties
    
  2. 打开 nano 编辑器后,使用以下 XML 作为文件的内容:

    nameNode=adl://home
    jobTracker=headnodehost:8050
    queueName=default
    examplesRoot=examples
    oozie.wf.application.path=${nameNode}/user/[domainuser]/examples/apps/map-reduce/workflow.xml
    hiveScript1=${nameNode}/user/${user.name}/countrowshive1.hql
    hiveScript2=${nameNode}/user/${user.name}/countrowshive2.hql
    oozie.use.system.libpath=true
    user.name=[domainuser]
    jdbcPrincipal=hive/<active-headnode-name>.<Domain>.com@<Domain>.COM
    jdbcURL=[jdbcurlvalue]
    hiveOutputDirectory1=${nameNode}/user/${user.name}/hiveresult1
    hiveOutputDirectory2=${nameNode}/user/${user.name}/hiveresult2
    
    • 如果您将 Azure Data Lake Storage Gen1 作为主群集存储,请使用nameNode 属性的adl://home URI。 如果使用 Azure Blob 存储,请更改为 wasb://home。 如果使用 Azure Data Lake Storage Gen2,请更改为 abfs://home
    • domainuser 替换为您在域中的用户名。
    • ClusterShortName 替换为群集的短名称。 例如,如果群集名称 https:// [示例链接] sechadoopcontoso.azurehdinsight.cn,则 clustershortname 群集的前六个字符是: sechad
    • jdbcurlvalue 替换为 Hive 配置中的 JDBC URL。 例如 jdbc:hive2://headnodehost:10001/;transportMode=http。
    • 若要保存文件,请选择 Ctrl+X,输入 Y,然后选择 Enter

    运行 Oozie 作业时,此属性文件需要在本地存在。

为 Oozie 作业创建自定义 Hive 脚本

可以为 Hive 服务器 1 和 Hive 服务器 2 创建两个 Hive 脚本,如以下部分所示。

Hive服务器1个文件

  1. 为 Hive 服务器 1 操作创建和编辑文件:

    nano countrowshive1.hql
    
  2. 创建脚本:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select devicemake from hivesampletable limit 2;
    
  3. 将文件保存到 Apache Hadoop 分布式文件系统(HDFS):

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

HiveServer2 文件

  1. 为 Hive 服务器 2 操作创建和编辑字段:

    nano countrowshive2.hql
    
  2. 创建脚本:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}' 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    select devicemodel from hivesampletable limit 2;
    
  3. 将文件保存到 HDFS:

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

提交 Oozie 作业

为 ESP 群集提交 Oozie 作业类似于在非 ESP 群集中提交 Oozie 作业。

有关详细信息,请参阅将 Apache Oozie 与 Apache Hadoop 配合使用,以在基于 Linux 的 Azure HDInsight 上定义和运行工作流。

Oozie 作业提交的结果

Oozie 作业为用户执行。 因此,Apache Hadoop YARN 和 Apache Ranger 审核日志都显示这些作业作为被假冒的用户运行。 Oozie 作业的命令行界面输出结果类似于以下代码:

Job ID : 0000015-180626011240801-oozie-oozi-W
------------------------------------------------------------------------------------------------
Workflow Name : map-reduce-wf
App Path      : adl://home/user/alicetest/examples/apps/map-reduce/wf.xml
Status        : SUCCEEDED
Run           : 0
User          : alicetest
Group         : -
Created       : 2018-06-26 19:25 GMT
Started       : 2018-06-26 19:25 GMT
Last Modified : 2018-06-26 19:30 GMT
Ended         : 2018-06-26 19:30 GMT
CoordAction ID: -

Actions
------------------------------------------------------------------------------------------------
ID                        Status    Ext ID            ExtStatus                 ErrCode
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@:start:    OK    - OK             -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@mr-test    OK    job_1529975666160_0051    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@myHive2    OK    job_1529975666160_0053    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@myHive    OK     job_1529975666160_0055    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@end       OK     - OK             -
-----------------------------------------------------------------------------------------------

Hive 服务器 2 的 Ranger 审核日志显示 Oozie 代表用户执行操作。 Ranger 和 YARN 视图仅对群集管理员可见。

在 Oozie 中配置用户授权

Oozie 本身具有用户授权配置,可以阻止用户停止或删除其他用户的作业。 若要启用此配置,请设置为 oozie.service.AuthorizationService.security.enabledtrue.

有关详细信息,请参阅 Apache Oozie 安装和配置

对于 Hive 服务器 1 等组件(其中 Ranger 插件不可用或不受支持),只能进行粗粒度的 HDFS 授权。 细化授权只能通过“Ranger”插件使用。

获取 Oozie Web 用户界面

Oozie Web UI 提供基于 Web 的视图来显示群集上 Oozie 作业的状态。 若要获取 Web UI,请执行 ESP 群集中的以下步骤:

  1. 添加 边缘节点 并启用 SSH Kerberos 身份验证

  2. 按照 Oozie Web UI 步骤启用到边缘节点的 SSH 隧道并访问 Web UI。

后续步骤