[关闭]
@xtccc 2016-01-18T09:04:17.000000Z 字数 5234 阅读 2971

构建和安装

给我写信
GitHub

此处输入图片的描述


Oozie


版本: 4.2.0

参考链接:



目录:


1. Building From Source


1.1 准备工作

首先下载4.2.0版本的源码包,然后将其在本地解压(假设解压后本地路径为 BUILD_BASE_PATH )。

解压后,需要对pom.xml文件进行一些修改。

  1. 修改repo的地址
    pom.xml中的一个repo url已经不再使用了,需要用新的url进行替换

    1. <repositories>
    2. ...
    3. <!-- 本url已失效
    4. <repository>
    5. <id>Codehaus repository</id>
    6. <url>http://repository.codehaus.org/</url>
    7. <snapshots>
    8. <enabled>false</enabled>
    9. </snapshots>
    10. </repository>
    11. -->
    12. <repository>
    13. <id>Codehaus repository</id>
    14. <name>codehaus-mule-repo</name>
    15. <url>https://repository-master.mulesoft.org/nexus/content/groups/public/</url>
    16. <layout>default</layout>
    17. </repository>
    18. ...
    19. </repositories>
  2. 修改对应的hadoop版本
    pom.xml中默认的hadoop版本一般与我们实际的hadoop集群版本不一致,自己修改相应的版本。

    Library Default Version
    hadoop-1 1.2.1
    hadoop-0.23 0.23.5
    hadoop-2 2.3.0
    hadoop3 3.0.0-SNAPSHOT
    hadoop.majorversion hadoop-1
    hadoop.auth default to hadoop.majorversion
    distcp default to hadoop.majorversion
    pig 0.12.1
    pig classifier none
    sqoop 1.4.3
    sqoop.classifier hadoop100
    tomcat 6.0.41
    openjpa 2.2.2
    xerces 2.10.0
    curator 2.5.0
    hive 0.13.1
    hbase 0.94.2


1.2 编译过程

进入$BUILD_BASE_PATH,键入命令:

  1. bin/mkdistro.sh -DskipTests

如果编译成功,可以看到以下的输出:
QQ20160116-0@2x.png-288.7kB

可以看到,编译好了,会在目录$BUILD_BASE_PATH/distro/target/下产生一个文件oozie-4.2.0-distro.tar.gz,下一步中我们会用到这个文件。


1.3 加入所需的第三方JAR包

用上述方法构建出的 .war 中并不会包含Oozie运行时所需的第三方JAR,例如Hadoop JARs、JDBC jars、extJS。我们需要将这些third-party jars放入 .war 中。

选择一个新的路径,假设为$INSTALL_PATH且下面我们将把它作为Oozie的安装目录。

  1. Copy Oozie binary package
    将步骤1.2中编译产生的文件oozie-4.2.0-distro.tar.gz放入到$INSTALL_PATH中,解压后进入该目录。

    1. cd $INSTALL_PATH
    2. cp $BUILD_BASE_PATH/distro/target/oozie-4.2.0-distro.tar.gz ./
    3. tar xvf oozie-4.2.0-distro.tar.gz
    4. cd oozie-4.2.0

    可以看到目录 $INSTALL_PATH/oozie-4.2.0中有如下内容:
    QQ20160116-1@2x.png-297.6kB

  2. Collect third-party libraries
    $INSTALL_PATH/oozie-4.2.0中新建一个目录libext,将所有需要的第三方库(包括ext-2.2.zip)放入这个目录中,然后用命令来创建一个self-contained Oozie WAR file:

    1. $INSTALL_PATH/oozie-4.2.0/bin/oozie-setup.sh prepare-war

    如果$INSTALL_PATH/oozie-4.2.0中不存在目录libext,那么输出如下:
    QQ20160116-2@2x.png-160.7kB

    如果存在libext目录,且该目录中含有ext-2.2.zip,那么输出如下:
    QQ20160116-3@2x.png-96.7kB

    此时生成的目标文件是$INSTALL_PATH/oozie-4.2.0/oozie-server/webapps/oozie.war

    在文件oozie-setup.sh中有个变量OOZIE_HOME,这个变量即使用户设置了也没用,因为Oozie会自己计算这个变量的值。


    除了ext-2.2.zip外,还需要在libext目录中放入哪些库?

    一般来说,需要放入的文件是运行Oozie运行所需要用到的库,一般至少要是Hadoop相关的库。我们已经有一个CDH的集群,里面安装了Oozie,它有一个HDFS的share lib目录(/user/oozie/share/lib),所以我们将这个目录中的文件全部拷了过来,放在了libext目录中。


  3. 创建Oozie DB
    将上面的$INSTALL_PATH拷贝到Hadoop集群的一个节点上。
    用以下命令常见数据库:

    1. $INSTALL_PATH/oozie-4.2.0/bin/ooziedb.sh create -sqlfile oozie.sql -run

    如果运行成功,会有以下输出:
    QQ20160116-4@2x.png-82.6kB

    如果报错缺少某个class,则把相应的包放入$INSTALL_PATH/oozie-4.2.0/libext中即可。




2. Installation


2.1 配置Hadoop集群

在1.3节中,我们在$INSTALL_PATH中完成了构建工作,为了方便起见,假设这个目录位于Hadoop集群上(如果不在的话,把它拷过去就行)。

Oozie提交的jobs在运行时,这些jobs并不是以oozie的身份运行的,Oozie service owner (oozie)只是起了proxy user的作用。所以我们需要配置Hadoop,让它允许oozie作为一个proxy user。我们需要在 $HADOOP_HOME/etc/hadoop/core-site.xml中添加如下的两个变量并重启Hadoop集群:

  1. <proerpty>
  2. <name>hadoop.proxyuser.[OOZIE_SERVICE_OWNER].hosts</name>
  3. <value>[OOZIE_SERVICE_HOSTNAME]</value>
  4. </property>
  5. <proerpty>
  6. <name>hadoop.proxyuser.[OOZIE_SERVICE_OWNER].groups</name>
  7. <value>[OOZIE_SERVICE_OWNER_GROUP]</value>
  8. </property>



它们可以是用逗号分隔的多个值,也可以使用通配符(但是不安全)。以下是常见的典型值:

Name Value
[OOZIE_SERVICE_OWNER] oozie
[OOZIE_SERVICE_HOSTNAME] localhost
[OOZIE_SERVICE_OWNER_GROUP] users



如果使用Cloudera Manager,则可以使用如下方式配置:

QQ20160116-5@2x.png-152.7kB


2.2 安装Shared Library

2.2.1 创建Oozie Sharelib

在构建完oozie之后,会在根目录下看到文件oozie-sharelib-4.2.0.tar.gz,它包含了各种action类型所需的JARs。我们需要解压该文件,并将解压生成的share目录上传至HDFS中,这个HDFS目录就是Oozie sharelib,它的owner必须是oozie

  1. cd $INSTALL_PATH
  2. tar xvf oozie-sharelib-4.2.0.tar.gz
  3. hdfs dfs -put share [HDFS_SHARE_LIB_ROOT_PATH]

2.2.2 配置Oozie Sharelib Path

此外,还需要在文件conf/oozie-site.xml中配置HDFS share lib的路径:

  1. <property>
  2. <name>oozie.service.WorkflowAppService.system.libpath</name>
  3. <value>[HDFS_SHARE_LIB_ROOT_PATH]/share/lib</value>
  4. </property>

从Oozie 4.1.0开始,Sharelib的结构有所变化 —— 加入了带有时间戳的sharelib目录。

2.2.3 检查Oozie Sharelib Path

  1. bin/oozie admin -shareliblist -oozie http://localhost:11000/oozie
  2. bin/oozie admin -shareliblist spark -oozie http://localhost:11000/oozie
  3. bin/oozie admin -shareliblist pig -oozie http://localhost:11000/oozie


2.3 启动Oozie

用命令启动oozie:

  1. bin/oozied.sh start

如果启动成功,通过ps -ef | grep oozie可以看到关于oozie的进程信息。

另外,通过命令可查询oozie的状态:

  1. bin/oozie admin -oozie http://[hostname]:11000/oozie -status

Oozie成功运行的输出如下:
QQ20160116-6@2x.png-271.2kB

如果出现下面的输出,则说明Oozie没有成功运行:
QQ20160116-7@2x.png-344.8kB

通过 URL (http://[host]:11000/oozie) 也可以在浏览器中查看Oozie的页面。

如果运行失败,则可以查看logs目录下的几个日志文件。




3. 提交Workflow Job


下面会提交一个含有Fs Action的Oozie workflow job作为例子。

在当前目录下,由2个目录,分别为appsoozie-4.2.0oozie-4.2.0是我们构建好后安装oozie的根目录,apps中是我们写的workflow jobs目录,里面的内容为:

  1. [root@ecs1 oozie]# tree apps/
  2. apps/
  3. └── fs
  4. ├── job.properties
  5. └── workflow.xml
  1. # apps/fs/job.properties 文件
  2. NN=hdfs://nameservice1
  3. RM=ecs2:8032
  4. HdfsDir=${NN}/user/tao/oozie/examples
  5. oozie.wf.application.path=${HdfsDir}/fs
  1. <!-- apps/fs/workflow.xml文件 -->
  2. <workflow-app name="wf-app-fs" xmlns="uri:oozie:workflow:0.5">
  3. <start to="start-node"/>
  4. <action name="start-node">
  5. <fs>
  6. <name-node>${NN}</name-node>
  7. <delete path="${HdfsDir}/user/tao/new-Output"/>
  8. <mkdir path="${HdfsDir}/user/tao/newDir"/>
  9. </fs>
  10. <ok to="end-node"/>
  11. <error to="kill-node"/>
  12. </action>
  13. <kill name="kill-node">
  14. <message>Fs App is Killed</message>
  15. </kill>
  16. <end name="end-node"/>
  17. </workflow-app>



用命令提交这个workflow job:
QQ20160117-0@2x.png-307.4kB

  1. HDFS HA Namenode
    我们的HDFS启用了HA,HDFS的NameNode URL为hdfs://nameservice1,但是提交workflow时Oozie却不能正确识别这个Namenode。

    解决方法:
    将HDFS的hdfs-site.xml文件放入到oozie的目录conf/hadoop-conf下。

  2. Impersonation Error
    上面的问题解决后,我们重新尝试提交workflow job:
    QQ20160117-1@2x.png-259.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注