权声明:本文为博主原创文章,未经博主容许不得转载。java
1、使用CM添加服务的方式安装Oozienode
若是在建立Oozie数据库时失败,且提示数据库已存在,以下图,则多是以前已经安装过Oozie,没有卸载干净,须要手动将Oozie服务器数据目录删掉(oozie/data部分),见图二mysql
(图一)linux
(图二)web
2、安装成功后,能够经过web方式访问Oozie(http://hadoop1:11000.oozie/),但此时出现以下页面,提示须要Ext JS,查看官方文档可知,只能使用Ext js 2.2版本(版权问题)sql
将ext-2.2.zip放到libext目录下:/opt/cloudera/parcels/CDH/lib /oozie/libext,并解压,unzip ext-2.2.zip,将解压后的ext-2.2权限改成777:chmod -R 777 ext-2.2数据库
此时不须要重启Oozie,只要刷新浏览器,便可看到oozie的web页面apache
3、修改Oozie的元数据库为mysql,默认为derby,不适合生产环境使用浏览器
一、CM配置见下图:服务器
二、在对应的mysql服务器建立oozie数据库:create database oozie;
三、在安装Oozie的节点libserver目录下(/opt/cloudera/parcels/CDH/lib/oozie/libserver)添加mysql的驱动jar包,而后重启Oozie
此时会报以下错误,说数据库不存在:
四、此时能够在CM的Oozie-->实例-->右上角的操做处点击建立数据库
此时报错以下图,提示找不到mysql驱动
将mysql驱动拷贝到libtools目录下(/opt/cloudera/parcels/CDH/lib/oozie /libtools),并重命名驱动包,去掉版本号,如原名为:mysql-connector-java-5.1.25-bin.jar,重命名为:mysql-connector-java-bin.jar,此时再次执行上面的建立数据库操做,提示建立成功。
也能够进行mysql数据库,查看oozie数据库下的表,此时会多出新建的12张表,此时表明Oozie已所有安装成功!
此时经过CM从新启动Oozie服务成功!
4、修改Oozie配置
将java的堆栈大小设为1到2G
5、运行demo
一、进入目录:/opt/cloudera/parcels/CDH/share/doc/oozie-4.0.0+cdh5.3.3+340,在root目录下创建example目录,并将上面目录中的oozie-examples.tar.gz拷贝到/root/example目录中并解压,获得examples目录,目录结构以下:
二、进入apps/map-reduce目录,可看到以下配置文件,主要关注job.properties和workflow.xml
三、修改job.properties
1)未修改前的内容
2)修改细节:
修改nameNode:nameNode=hdfs://xxx:8020
修改jobTracker:jobTracker=hadoop4:8032
注意:jobTracker的内容根据hadoop的版本,内容也不一样。如为hadoop1,则直接使用jobTracker的地址便可。如为 hadoop2,即写resourceManager的地址,具体可参见:/etc/hadoop/conf/yarn-site.xml
queueName=default:指定提交做业时,运行的队列
examplesRoot=examples:指定运行做业的hdfs上的目录名称
四、可查看workflow.xml配置的内容,但暂不作修改
五、将examples整个目录上传到hdfs的/user/oozie下:hdfs dfs -put examples /user/oozie
六、运行做业:
oozie job -oozie http://hadoop1:11000/oozie/ -config /root/example/examples/apps/map-reduce/job.properties -run
重点:oozie做业流程解析
1)job.properties文件能够不上传到hdfs中,是在执行oozie job ...... -config时,批定的linux本地路径
2)workflow.xml文件,必定要上传到job.properties的oozie.wf.application.path对应的hdfs目录下
3)job.properties中的oozie.use.system.libpath=true指定oozie使用系统的共享目录
4)job.properties中的oozie.libpath=${nameNode}/user/${user.name}/apps/mymr,能够用来执行mr时,做业导出的jar包存放位置,不然可能报找不到类的错误
5)oozie调度做业时,本质也是启动一个mapreduce做业来调度,workflow.xml中设置的队列名称为调度做业mr的队列名称。因此若是想让做业运行在指定的队列时,须要在mr或hive中指定好
七、检测workflow.xml文件的正确性
oozie validate workflow.xml
八、编写workflow.xml文件
控制节点:
1)start节点
<start to="[nodename]" />
2)end节点
<end name="[nodename]" />
3)kill节点
<kill>
<message>"logmsg"</message>
</kill>
4)decision决策节点
<decision name="[nodename]">
<switch>
<case to="[nodename]">[PREDICATE]</case>
......
<default to="[nodename]" />
</switch>
</decision>
5)fork分支节点
<fork name="[fork-node-name]">
<path start="[nodename]"/>
......
<path start="[nodename]"/>
</fork>
6)join会签节点
<join name="[join-node-name]" to="[nodename]" />
动做节点:
1)map-reduce配置:
<workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
<start to="mr-node"/>
<action name="mr-node">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}"/>
</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/${outputDir}</value>
</property>
</configuration>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
2)hive动做节点配置
<workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">
<start to="hive-node"/>
<action name="hive-node">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive"/>
<mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>script.q(存放hive脚本的文件)</script>
<param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
<param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive</param>
</hive>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
3)sqoop动做节点
<workflow-app xmlns="uri:oozie:workflow:0.2" name="sqoop-wf">
<start to="sqoop-node"/>
<action name="sqoop-node">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/sqoop"/>
<mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<command>import --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir /user/${wf:user()}/${examplesRoot}/output-data/sqoop -m 1</command>
<file>db.hsqldb.properties#db.hsqldb.properties</file>
<file>db.hsqldb.script#db.hsqldb.script</file>
</sqoop>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>