Oozie4.3.1各种Action及综合实例
如果没有编译好Oozie,并部署到集群,请参考:Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用(一)
- 本篇主要是针对Hadoop生态圈Action的调用。
1. 准备工作
- 确保Hadoop集群启动;
- 确保Oozie启动;
- 确保HiveServer2启动(测试主要使用Hiveserver2);
- 并且参考上篇把相关examples资源上传到HDFS的/user/root/examples目录;
2. Hive2 Action
2.1 准备工作
先读取Hive2的example的代码意思:
oozie-4.3.1/examples/apps/hive2/workflow.xml : 这个代码是一个通用的调用Hive的代码,这里就不贴了。
oozie-4.3.1/examples/apps/hive2/script.q:
-- 删除test表
DROP TABLE IF EXISTS test;
-- 根据路径创建外部表 test
CREATE EXTERNAL TABLE test (a INT) STORED AS TEXTFILE LOCATION '${INPUT}';
-- 把外部表test的数据导出到HDFS
INSERT OVERWRITE DIRECTORY '${OUTPUT}' SELECT * FROM test;
其中${INPUT}的值在workflow.xml以及job.properties中有,job.properties设置为:
# 集群相关的配置,需修改为实际地址
nameNode=hdfs://master:8020
jobTracker=master:8032
queueName=default
jdbcURL=jdbc:hive2://master:10000/default
examplesRoot=examples
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/hive2
匹配后,输入为: /user/root/examples/input-data/table/
输出为:/user/root/example/output-data/hive2
由于这里并没有测试数据,同时根据script.q的创建test表的代码来看,可以只需要用一列数值即可作为其输入,比如(命名为data.txt):
1
2
3
4
5
上传到HDFS
hdfs dfs -put data.txt /user/root/examples/input-data/table
2.2 执行
在oozie-4.3.1/examples/apps/hive2执行命令:
oozie job --oozie http://master:11000/oozie -config job.properties -run
2.3 查看结果
2.3.1 Oozie监控
首先,可以看到任务在Oozie上面的结果:
从图中可以看到任务的发起时间及结束时间,及任务运行状态,可以看到是成功执行并完成的。
2.3.2 YARN 监控
Oozie发起Hive任务的时候,会首先发起一个MapReduce的任务,然后在这个任务里面再次发起另外的一个MapReduce任务(这个主要去执行hive的SQL),只有当hive sql的MapReduce任务执行完成之后,Oozie的MapReduce才会完成。
从图中可以看到两个任务的Name,和发起的任务也有很大的关系。其次是两个任务开始的时间和结束的时间。
2.3.3 输出
任务输出有两个,第一个,在hive中应该可以看到一个test表,同时查看数据,应该是1,2,3,4,5 ;
第二个,在HDFS的输出目录应该会有对应的数据产生,同时数据也是一样的。
3. Pig Action
3.1 准备工作
oozie-4.3.1/examples/apps/pig/workflow.xml :
<script>id.pig</script>
<param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/text</param>
<param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/pig</param>
从上面可以看到输入以及要执行的pig脚本,输入是在、/user/root/examples/input-data/text;
oozie-4.3.1/examples/apps/pig/id.pig:
A = load '$INPUT' using PigStorage(':');
B = foreach A generate $0 as id;
store B into '$OUTPUT' USING PigStorage();
该脚本就是从INPUT中加载数据到关系A(字段间分隔符用冒号:),然后取得里面的第一个字段的值并存入关系B,把关闭B的数据存储到HDFS的Output目录;
通过观察发现输入数据的是文本,不适合作为id.pig的输入,所以修改下,简单示例如下(假设名字为data.txt):
1:a
2:b
3:c
然后存入HDFS:
hdfs dfs -rm -r /user/root/examples/input-data/text/data.txt
hdfs dfs -put data.txt /user/root/examples/input-data/text/
3.2 执行
在oozie-4.3.1/examples/apps/pig执行命令:
oozie job --oozie http://master:11000/oozie -config job.properties -run
3.3 查看输出
由于这里的监控和Hive的类似,这里不再展开介绍。
3.3.1 Oozie监控
3.3.2 YARN监控
3.3.3 HDFS监控
4. Spark Action
4.1 准备工作
oozie-4.3.1/examples/apps/spark/job.properties:
nameNode=hdfs://master:8020
jobTracker=master:8032
master=yarn-cluster
queueName=default
examplesRoot=examples
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark
特别注意,把master改为yarn-cluster ,使用这种模式来运行,当然也可以使用其他模式,具体可参考:http://oozie.apache.org/docs/4.3.1/DG_SparkActionExtension.html#Spark_on_YARN
其运行的代码如下所示:
public final class SparkFileCopy {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: SparkFileCopy <file> <file>");
System.exit(1);
}
SparkConf sparkConf = new SparkConf().setAppName("SparkFileCopy");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = ctx.textFile(args[0]);
lines.saveAsTextFile(args[1]);
System.out.println("Copied file from "