@xtccc
2016-01-18T01:04:17.000000Z
字数 5234
阅读 3417
Oozie
版本: 4.2.0
参考链接:
目录:
首先下载4.2.0版本的源码包,然后将其在本地解压(假设解压后本地路径为 BUILD_BASE_PATH )。
解压后,需要对pom.xml文件进行一些修改。
修改repo的地址
pom.xml中的一个repo url已经不再使用了,需要用新的url进行替换
<repositories>...<!-- 本url已失效<repository><id>Codehaus repository</id><url>http://repository.codehaus.org/</url><snapshots><enabled>false</enabled></snapshots></repository>--><repository><id>Codehaus repository</id><name>codehaus-mule-repo</name><url>https://repository-master.mulesoft.org/nexus/content/groups/public/</url><layout>default</layout></repository>...</repositories>
修改对应的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 |
进入$BUILD_BASE_PATH,键入命令:
bin/mkdistro.sh -DskipTests
如果编译成功,可以看到以下的输出:

可以看到,编译好了,会在目录$BUILD_BASE_PATH/distro/target/下产生一个文件oozie-4.2.0-distro.tar.gz,下一步中我们会用到这个文件。
用上述方法构建出的 .war 中并不会包含Oozie运行时所需的第三方JAR,例如Hadoop JARs、JDBC jars、extJS。我们需要将这些third-party jars放入 .war 中。
选择一个新的路径,假设为$INSTALL_PATH且下面我们将把它作为Oozie的安装目录。
Copy Oozie binary package
将步骤1.2中编译产生的文件oozie-4.2.0-distro.tar.gz放入到$INSTALL_PATH中,解压后进入该目录。
cd $INSTALL_PATHcp $BUILD_BASE_PATH/distro/target/oozie-4.2.0-distro.tar.gz ./tar xvf oozie-4.2.0-distro.tar.gzcd oozie-4.2.0
可以看到目录 $INSTALL_PATH/oozie-4.2.0中有如下内容:
Collect third-party libraries
在$INSTALL_PATH/oozie-4.2.0中新建一个目录libext,将所有需要的第三方库(包括ext-2.2.zip)放入这个目录中,然后用命令来创建一个self-contained Oozie WAR file:
$INSTALL_PATH/oozie-4.2.0/bin/oozie-setup.sh prepare-war
如果$INSTALL_PATH/oozie-4.2.0中不存在目录libext,那么输出如下:

如果存在libext目录,且该目录中含有ext-2.2.zip,那么输出如下:

此时生成的目标文件是$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目录中。
创建Oozie DB
将上面的$INSTALL_PATH拷贝到Hadoop集群的一个节点上。
用以下命令常见数据库:
$INSTALL_PATH/oozie-4.2.0/bin/ooziedb.sh create -sqlfile oozie.sql -run
如果运行成功,会有以下输出:

如果报错缺少某个class,则把相应的包放入$INSTALL_PATH/oozie-4.2.0/libext中即可。
在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集群:
<proerpty><name>hadoop.proxyuser.[OOZIE_SERVICE_OWNER].hosts</name><value>[OOZIE_SERVICE_HOSTNAME]</value></property><proerpty><name>hadoop.proxyuser.[OOZIE_SERVICE_OWNER].groups</name><value>[OOZIE_SERVICE_OWNER_GROUP]</value></property>
它们可以是用逗号分隔的多个值,也可以使用通配符(但是不安全)。以下是常见的典型值:
| Name | Value |
|---|---|
| [OOZIE_SERVICE_OWNER] | oozie |
| [OOZIE_SERVICE_HOSTNAME] | localhost |
| [OOZIE_SERVICE_OWNER_GROUP] | users |
如果使用Cloudera Manager,则可以使用如下方式配置:

在构建完oozie之后,会在根目录下看到文件oozie-sharelib-4.2.0.tar.gz,它包含了各种action类型所需的JARs。我们需要解压该文件,并将解压生成的share目录上传至HDFS中,这个HDFS目录就是Oozie sharelib,它的owner必须是oozie。
cd $INSTALL_PATHtar xvf oozie-sharelib-4.2.0.tar.gzhdfs dfs -put share [HDFS_SHARE_LIB_ROOT_PATH]
此外,还需要在文件conf/oozie-site.xml中配置HDFS share lib的路径:
<property><name>oozie.service.WorkflowAppService.system.libpath</name><value>[HDFS_SHARE_LIB_ROOT_PATH]/share/lib</value></property>
从Oozie 4.1.0开始,Sharelib的结构有所变化 —— 加入了带有时间戳的sharelib目录。
bin/oozie admin -shareliblist -oozie http://localhost:11000/ooziebin/oozie admin -shareliblist spark -oozie http://localhost:11000/ooziebin/oozie admin -shareliblist pig -oozie http://localhost:11000/oozie
用命令启动oozie:
bin/oozied.sh start
如果启动成功,通过ps -ef | grep oozie可以看到关于oozie的进程信息。
另外,通过命令可查询oozie的状态:
bin/oozie admin -oozie http://[hostname]:11000/oozie -status
Oozie成功运行的输出如下:

如果出现下面的输出,则说明Oozie没有成功运行:

通过 URL (http://[host]:11000/oozie) 也可以在浏览器中查看Oozie的页面。
如果运行失败,则可以查看logs目录下的几个日志文件。
下面会提交一个含有Fs Action的Oozie workflow job作为例子。
在当前目录下,由2个目录,分别为apps和oozie-4.2.0,oozie-4.2.0是我们构建好后安装oozie的根目录,apps中是我们写的workflow jobs目录,里面的内容为:
[root@ecs1 oozie]# tree apps/apps/└── fs├── job.properties└── workflow.xml
# apps/fs/job.properties 文件NN=hdfs://nameservice1RM=ecs2:8032HdfsDir=${NN}/user/tao/oozie/examplesoozie.wf.application.path=${HdfsDir}/fs
<!-- apps/fs/workflow.xml文件 --><workflow-app name="wf-app-fs" xmlns="uri:oozie:workflow:0.5"><start to="start-node"/><action name="start-node"><fs><name-node>${NN}</name-node><delete path="${HdfsDir}/user/tao/new-Output"/><mkdir path="${HdfsDir}/user/tao/newDir"/></fs><ok to="end-node"/><error to="kill-node"/></action><kill name="kill-node"><message>Fs App is Killed</message></kill><end name="end-node"/></workflow-app>
用命令提交这个workflow job:
HDFS HA Namenode
我们的HDFS启用了HA,HDFS的NameNode URL为hdfs://nameservice1,但是提交workflow时Oozie却不能正确识别这个Namenode。
解决方法:
将HDFS的hdfs-site.xml文件放入到oozie的目录conf/hadoop-conf下。
Impersonation Error
上面的问题解决后,我们重新尝试提交workflow job:
