@xtccc
2016-01-18T09:04:17.000000Z
字数 5234
阅读 2993
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_PATH
cp $BUILD_BASE_PATH/distro/target/oozie-4.2.0-distro.tar.gz ./
tar xvf oozie-4.2.0-distro.tar.gz
cd 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_PATH
tar xvf oozie-sharelib-4.2.0.tar.gz
hdfs 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/oozie
bin/oozie admin -shareliblist spark -oozie http://localhost:11000/oozie
bin/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://nameservice1
RM=ecs2:8032
HdfsDir=${NN}/user/tao/oozie/examples
oozie.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: