Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容:
工作流定义
当前运行的工作流实例,包括实例的状态和变量
Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。我们会使用hPDL(一种XML流程定义语言)来描述这个图。
Apache Oozie Workflow Scheduler for Hadoop
Oozie is a workflow scheduler system to manage Apache Hadoop jobs.
Oozie 是一个工作流调度系统用来管理 Hadoop 任务
工作流调度:工作流程的编排,调度:安排事件的触发执行(时间触发,事件触发)
Oozie is integrated with the rest of the Hadoop stack supporting several types of Hadoop jobs out of the box (such as Java map-reduce, Streaming map-reduce, Pig, Hive, Sqoop and Distcp) as well as system specific jobs (such as Java programs and shell scripts).
Oozip 集成了 Hadoop 其他的几种协议(如 MapReduce Pig Hive Sqoop Distcp)和系统专有的任务(如 java程序 shell脚本)
底层是一个仅有 Map Task 的 MapReduce 程序
oozie执行包括四部分
常量表示形式 | 含义说明 |
---|---|
${coord:minutes(int n)} | 返回日期时间:从一开始,周期执行n分钟 |
${coord:hours(int n)} | 返回日期时间:从一开始,周期执行n * 60分钟 |
${coord:days(int n)} | 返回日期时间:从一开始,周期执行n * 24 * 60分钟 |
${coord:months(int n)} | 返回日期时间:从一开始,周期执行n * M * 24 * 60分钟(M表示一个月的天数) |
${coord:endOfDays(int n)} | 返回日期时间:从当天的最晚时间(即下一天)开始,周期执行n * 24 * 60分钟 |
${coord:endOfMonths(1)} | 返回日期时间:从当月的最晚时间开始(即下个月初),周期执行n * 24 * 60分钟 |
${coord:current(int n)} | 返回日期时间:从一个Coordinator动作(Action)创建时开始计算,第n个dataset实例执行时间 |
${coord:dataIn(String name)} | 在输入事件(input-events)中,解析dataset实例包含的所有的URI |
${coord:dataOut(String name)} | 在输出事件(output-events)中,解析dataset实例包含的所有的URI |
${coord:offset(int n, String timeUnit)} | 表示时间偏移,如果一个Coordinator动作创建时间为T,n为正数表示向时刻T之后偏移,n为负数向向时刻T之前偏移,timeUnit表示时间单位(选项有MINUTE、HOUR、DAY、MONTH、YEAR) |
${coord:hoursInDay(int n)} | 指定的第n天的小时数,n>0表示向后数第n天的小时数,n=0表示当天小时数,n<0表示向前数第n天的小时数 |
${coord:daysInMonth(int n)} | 指定的第n个月的天数,n>0表示向后数第n个月的天数,n=0表示当月的天数,n<0表示向前数第n个月的天数 |
${coord:tzOffset()} | ataset对应的时区与Coordinator Job的时区所差的分钟数 |
${coord:latest(int n)} | 最近以来,当前可以用的第n个dataset实例 |
${coord:future(int n, int limit)} | 当前时间之后的dataset实例,n>=0,当n=0时表示立即可用的dataset实例,limit表示dataset实例的个数 |
${coord:nominalTime()} | nominal时间等于Coordinator Job启动时间,加上多个Coordinator Job的频率所得到的日期时间。例如:start=”2009-01-01T24:00Z”,end=”2009-12-31T24:00Z”,frequency=" $ {coord:days(1)}",frequency="${coord:days(1)}",则nominal时间为:2009-01-02T00:00Z、2009-01-03T00:00Z、2009-01-04T00:00Z、…、2010-01-01T00:00Z |
${coord:actualTime()} | Coordinator动作的实际创建时间。例如:start=”2011-05-01T24:00Z”,end=”2011-12-31T24:00Z”,frequency=”${coord:days(1)}”,则实际时间为:2011-05-01,2011-05-02,2011-05-03,…,2011-12-31 |
${coord:user()} | 启动当前Coordinator Job的用户名称 |
${coord:dateOffset(String baseDate, int instance, String timeUnit)} | 计算新的日期时间的公式:newDate = baseDate + instance * timeUnit,如:baseDate=’2009-01-01T00:00Z’,instance=’2′,timeUnit=’MONTH’,则计算得到的新的日期时间为’2009-03-01T00:00Z’。 |
${coord:formatTime(String timeStamp, String format)} | 格式化时间字符串,format指定模式 |
例如:
昨天日期
${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, ‘DAY’), ‘yyyyMMdd’)}
这个系统常量可以放在Schedule中传参给Workflow.
下图是添加shell文件以后参数的写法。保存Workflow以后填入参数可以试运行。
可以参考shell中脚本参数传递的两种方式
采用$0,$1,$2…等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用 ${10}, ${11}…才能获取到参数,但是一般很少会超过10个参数的情况。另外
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如" $@“用「”」括起来的情况、以"$1" “$2” … " $n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
示例:新建一个test.sh的文件,传入参数1,2
#!/bin/bash
echo "脚本$0"
echo "第一个参数$1"
echo "第二个参数$2"
在shell中执行脚本,结果如下
$ ./test.sh 1 2
#shell中将会输出:
脚本./test.sh
第一个参数1
第二个参数2
代码示例:
#!/bin/bash
while getopts ":y:m:d:" opt
do
case $opt in
y)
year=`echo $OPTARG | sed 's/ //g'` ;;
m)
month=`echo $OPTARG | sed 's/ //g'` ;;
d)
day=`echo $OPTARG | sed 's/ //g'` ;;
?)
echo "error"
exit 1;;
esac
done
调用该脚本传参 -y 2020 -m 08 -day 16 会将year赋值’2020’,month赋值’08’,day赋值’16’.
参数解释:第一个冒号 getopts 会区分 invalid option (无效选项) 错误和 miss option argument(丢失选项)错误。当为 invalid option 时 varname 会被设成?,当为 miss option argument 时 varname 会被设成:,如果optstring不以”:“冒号开头,invalid option 错误和 miss option argument 错误都会使 varname 被设成?。建议选项部分开头用":"
参数后面的冒号表示参数可传与否。参数后加冒号表示这个参数必须传,不加的话可以不传。
getopt可以参考这两篇文章
getopt 是一个独立外部工具,getopt命令不是一个标准的unix命令,但它在大多数Linux的发行版中都自带了。在getopt的较老版本中,存在一些bug,不大好用,在后来的版本中解决了这些问题,我们称之为getopt增强版。通过-T选项,我们可以检查当前的getopt是否为增强版,返回值为4,
#getopt -T
#echo $?
4
#getopt -V
getopt (enhanced) 1.1.4
getopt命令与getopts命令不同,它实际上是通过将参数规范化来帮助我们处理的
getopt使用示例
#!/bin/bash
#echo $@
#-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`
if [ $? != 0 ]; then
echo "Terminating..."
exit 1
fi
#echo $ARGS
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
while true
do
case "$1" in
-a|--along)
echo "Option a";
shift
;;
-b|--blong)
echo "Option b, argument $2";
shift 2
;;
-c|--clong)
case "$2" in
"")
echo "Option c, no argument";
shift 2
;;
*)
echo "Option c, argument $2";
shift 2;
;;
esac
;;
--)
shift
break
;;
*)
echo "Internal error!"
exit 1
;;
esac
done
#处理剩余的参数
for arg in $@
do
echo "processing $arg"
done
参数解释,-o 表示后面接短选项参数,如:-a -b;-l或–long 表示后面接长选项参数,如:–param1,
–param2。
参数后面冒号解释,后面如果不加冒号,表示该参数不用传值,加冒号表示该参数必须传值,加两个冒号表示为可选参数,可传值或不传。
两者的比较
(1)getopts 是 Shell 内建命令,getopt 是一个独立外部工具。
(2)getopts 使用语法简单,getopt 使用语法较复杂
(3)getopts 不支持长参数(如:–option )支持短参数,getopt 支持
(4)getopts 不会重排所有参数的顺序,getopt 会重排参数顺序(这里的区别下面会说明)
(5)getopts 出现的目的是为了代替 getopt 较快捷的执行参数分析工作。
参数 | 描述 |
---|---|
-B or --delimited | 导致使用分隔符分割的普通文本格式打印查询结果。当为其他 Hadoop 组件生成数据时有用。对于避免整齐打印所有输出的性能开销有用,特别是使用查询返回大量的结果集进行基准测试的时候。使用 --output_delimiter 选项指定分隔符。使用 -B 选项常用于保存所有查询结果到文件里而不是打印到屏幕上。在 Impala 1.0.1 中添加 |
–print_header | 是否打印列名。整齐打印时是默认启用。同时使用 -B 选项时,在首行打印列名 |
-o filename or --output_file filename | 保存所有查询结果到指定的文件。通常用于保存在命令行使用 -q 选项执行单个查询时的查询结果。对交互式会话同样生效;此时你只会看到获取了多少行数据,但看不到实际的数据集。当结合使用 -q 和 -o 选项时,会自动将错误信息输出到 /dev/null(To suppress these incidental messages when combining the -q and -o options, redirect stderr to /dev/null)。在 Impala 1.0.1 中添加 |
–output_delimiter=character | 当使用 -B 选项以普通文件格式打印查询结果时,用于指定字段之间的分隔符(Specifies the character to use as a delimiter between fields when query results are printed in plain format by the -B option)。默认是制表符 tab (’\t’)。假如输出结果中包含了分隔符,该列会被引起且/或转义( If an output value contains the delimiter character, that field is quoted and/or escaped)。在 Impala 1.0.1 中添加 |
-p or --show_profiles | 对 shell 中执行的每一个查询,显示其查询执行计划 (与 EXPLAIN 语句输出相同) 和发生低级故障(low-level breakdown)的执行步骤的更详细的信息 |
-h or --help | 显示帮助信息 |
-i hostname or --impalad=hostname | 指定连接运行 impalad 守护进程的主机。默认端口是 21000。你可以连接到集群中运行 impalad 的任意主机。假如你连接到 impalad 实例通过 --fe_port 标志使用了其他端口,则应当同时提供端口号,格式为 hostname:port |
-q query or --query=query | 从命令行中传递一个查询或其他 shell 命令。执行完这一语句后 shell 会立即退出。限制为单条语句,可以是 SELECT, CREATE TABLE, SHOW TABLES, 或其他 impala-shell 认可的语句。因为无法传递 USE 语句再加上其他查询,对于 default 数据库之外的表,应在表名前加上数据库标识符(或者使用 -f 选项传递一个包含 USE 语句和其他查询的文件) |
-f query_file or --query_file=query_file | 传递一个文件中的 SQL 查询。文件内容必须以分号分隔 |
-k or --kerberos | 当连接到 impalad 时使用 Kerberos 认证。如果要连接的 impalad 实例不支持 Kerberos,将显示一个错误 |
-s kerberos_service_name or --kerberos_service_name=name | Instructs impala-shell to authenticate to a particular impalad service principal. 如何没有设置 kerberos_service_name ,默认使用 impala。如何启用了本选项,而试图建立不支持 Kerberos 的连接时,返回一个错误(If this option is used in conjunction with a connection in which Kerberos is not supported, errors are returned) |
-V or --verbose | 启用详细输出 |
–quiet | 关闭详细输出 |
-v or --version | 显示版本信息 |
-c | 查询执行失败时继续执行 |
-r or --refresh_after_connect | 建立连接后刷新 Impala 元数据,与建立连接后执行 REFRESH 语句效果相同 |
-d default_db or --database=default_db | 指定启动后使用的数据库,与建立连接后使用 USE 语句选择数据库作用相同,如果没有指定,那么使用 default 数据库 |
-l | 启用 LDAP 认证 |
-u | 当使用 -l 选项启用 LDAP 认证时,提供用户名(使用短用户名,而不是完整的 LDAP 专有名称(distinguished name)) ,shell 会提示输入密码 |
impala在shell中传参方式:
#!/bin/bash
export PYTHON_EGG_CACHE=.python-eggs(特别注意)
impala-shell -i host(主机地址):port(端口) --var=year=${
year} --var=month=${
month} --var=day=${
day} -f filename
在hue中如果要调用文件,会存在文件找不到的问题。你需要在WorkFlow中选择该文件,如果需要调用改文件直接写文件名字就行。如果你在一个Workflow中调用的文件很多,你可以把文件放在文件夹下,选择文件时选择此文件夹,但是此时需要注意的是***单纯加文件名会报找不到文件错误,你需要加上改文件夹的名字以及文件名***。
此处参数说明,因为我自己调用时采用getopts方式接收参数,而getopts只接受短参数,所以需要在前面加上 -y,-m-d之类的。如果你只需要单个参数或者参数顺序无影响,可以不加-有,-m之类的直接写${year}, ${month},然后用我上面提到的第一种接受参数的办法就行。