驴妈妈旅游网架构:
1.日志上传:
方法1:定义shell脚本
$ bin/hdfs dfs -put /user/local/nginx/datalog/access.log /nginx
方法2: 使用日志采集框架flume
2.数据清洗:
etl : MapReduce任务
3.需求分析:
hive -- hql
分析结果存储在hdfs上
可以将hql语句封装打一个shell脚本中
4.将结果导出到mysql中进行下一步的报表展示:
sqoop框架
可以将sqoop语句封装打一个shell脚本中
5.报表展示:
sparingMVC
highcharts --报表展示插件
如何每天的定时执行以上任务:
crontab:
定时执行
不擅长处理多任务之间的依赖关系
oozie:
工作流调度执行
workflow工作流定义:
start-> shell action //日志上传
-> ok -> MR action //日志清洗
-ok -> shell action 或者hive action //分析
-error -> MR action //日志清洗
->ok -> shell action 或者sqoop action //结果导出
定义定时执行执行:
coordinator定时任务:
定时触发或其他条件触发workflow工作流的执行
-------------------------------------------
任务调度工具:
linux crontab :
最简单最常用的任务调度服务
每周三的凌晨1点清空服务器的 /tmp 目录
0 1 * * 3 /bin/rm -rf /tmp/*
Azkaban:
linkedin 领英 开源 -- kafka
批量的工作流任务调度器
https://azkaban.github.io/
https://zhuanlan.zhihu.com/p/22184691?refer=dataeye
适合小公司,任务流的界面化管理
功能简单,相当于是一个crontab的功能升级版及界面版
zeus : 宙斯
阿里开源的 只有中文文档 图形界面化管理
zeus1
zeus2
大公司
更新慢
oozie :
cloudera公司开源 ,后期贡献给Apache
没有提供图形界面管理工具
编译工作流或定时任务需要编辑xml文件进行控制
难以操作
oozie的组装架构:
Tomcat server:支持任务参数的交互web界面
oozie database:oozie需要一个数据库的支撑存储任务的元数据信息
oozie功能组件:
workflow:任务流,包括控制流节点,动作节点
控制流节点:
控制的任务的流程路径
job1->job3->job2->job4
动作节点:
具体需要执行的job的任务信息
job的执行结果(ok,error)影响流程路径
coordinator:
对任务流workflow的时间控制调度
控制workflow的生命周期(循环、定时、触发条件)
bundle:
将多个coordinator时间控制调度进行绑定一起维护管理
oozie的安装部署:
官网文档:
http://oozie.apache.org/
http://oozie.apache.org/docs/4.0.0/DG_QuickStart.html --安装部署文档
安装使用oozie必须先安装好Hadoop
ooize的动作节点本身就是一个MapReduce任务
sqoop任务-MapReduce map任务
oozie需要在hdfs上创建一个oozie共享库
oozie编辑的调度任务app文档需要上传到hdfs上才能执行
1、确保Hadoop已经安装成功
2、上传解压oozie的安装包
$ tar zxvf oozie-4.0.0-cdh5.3.6.tar.gz
$ rm -rf oozie-4.0.0-cdh5.3.6.tar.gz
3、为oozie服务在Hadoop集群上配置一个代理用户以便获取Hadoop的使用权
修改Hadoop的core-site.xml文件 ,添加配置:
hadoop.proxyuser.com.bigdata.hosts //com.bigdata替换为你所使用的普通用户名称
*
hadoop.proxyuser.com.bigdata.groups//com.bigdata替换为你所使用的普通用户名称
*
4、重启Hadoop服务
$ sbin/stop-dfs.sh
$ sbin/start-all.sh
5、解压oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz
$ tar zxvf oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C /opt/modules/
需在在oozie的安装目录下进行解压
只有这样解压后才会在oozie的安装目录下生成一个hadooplibs目录
6、在ooize的安装目录下创建libext目录,并将hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/目录下所有的jar包拷贝到libext目录下
$ mkdir libext
$ cp hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/* libext/
7、将ext-2.2.zip包上传到libext目录下
8、安装mysql数据库并创建oozie库
mysql> create database oozie
9、拷贝mysql的驱动包到oozie的libext目录下
$ cp /opt/modules/cdh/hive-0.13.1-cdh5.3.6/lib/mysql-connector-java-5.1.27-bin.jar /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/libext/
10、修改oozie的配置文件oozie-site.xml
/opt/modules/cdh/oozie-4.0.0-cdh5.3.6/conf
搜索jdbc
oozie.service.JPAService.jdbc.driver
com.mysql.jdbc.Driver
oozie.service.JPAService.jdbc.url
jdbc:mysql://192.168.88.134:3306/oozie
oozie.service.JPAService.jdbc.username
root
oozie.service.JPAService.jdbc.password
root123
搜索 hadoop-conf
oozie.service.HadoopAccessorService.hadoop.configurations
*=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/etc/hadoop
*表示通配符,表示所有的Hadoop服务
11、依次执行以下命令
$ bin/oozie-setup.sh prepare-war [-d directory] [-secure]
sharelib create -fs
[-locallib ]
sharelib upgrade -fs
[-locallib ]
db create|upgrade|postupgrade -run [-sqlfile ]
1)上传本地jar包到hdfs上
将oozie可调度的所有框架的依赖包上传到hdfs上
$ bin/oozie-setup.sh sharelib create -fs hdfs://192.168.88.134:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz
在hdfs上的用户主目录下出现/user/beifeng/share/
share目录即为共享jar包库的路径
2)去mysql中的oozie库里初始化oozie的状态
$ bin/oozie-setup.sh db create -run -sqlfile oozie.sql
-sqlfile oozie.sql 表示将执行的sql命令写入到指定的文件中
3)生成oozie的web工程的war包
$ bin/oozie-setup.sh prepare-war
INFO: Oozie is ready to be started
12、启动oozie服务
$ bin/oozied.sh start
http://192.168.134.101:11000/oozie/ oozie的web交互界面
-------------------------------------------
user 伪装 user --Hadoop服务重启
案例一:
调度执行一个workflow,包含了一个job(shell action )
$ tar zxf oozie-examples.tar.gz 解压官方案例模板tar包
/opt/modules/cdh/oozie-4.0.0-cdh5.3.6/examples/apps
目录为官方提供的oozie可以调度执行的任务的模板
$ mkdir myapps
$ cp -r /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/examples/apps/shell/ ./myshell
将shell案例模板拷贝到自定义的应用目录下并重命名
$ ls myshell
job.properties
job的属性文件
内部的变量属性值会被workflow.xml调用
workflow.xml
xml文件,定义了工作流向
1、修改job.properties
nameNode=hdfs://192.168.88.134:8020
# yarn的通讯地址
jobTracker=192.168.88.134:8032
# yarn的任务的队列形式,使用默认
queueName=default
#定义一个用户自定义应用在hdfs上的目录,这个是用户自定义应用的根目录
examplesRoot=examples
# 定义的用户应用的workflow.xml在hdfs上的存储路径
# 当我们执行一个oozie的工作流任务时系统会到该路径下找到对应的workflow.xml文件
# 注意在引用变量时加 ‘/’ ,在定义变量时前后就不需要在加‘/’
oozie.wf.application.path=${nameNode}/${examplesRoot}/myshell
2、修改 workflow.xml
定义一个被oozie调度执行的shell脚本
$ vi check_mem.sh
#!/bin/bash
/usr/bin/free -m >> /tmp/mem.log
$ sh check_mem.sh 手动执行测试下是否可以正常执行
在job.properties中添加shell脚本的变量名
sh_name=check_mem.sh
-------------------------
//name的值可以修改,为该workflow的名称
开始一个workflow
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${sh_name} 声明要执行的脚本的名称,
${nameNode}/${examplesRoot}/myshell/${sh_name}#${sh_name}
定义的是被调度的脚本在hdfs上的路径
最后的#${sh_name}表示通过#创建一个软连接到当前调度执行该脚本的集群节点工作目录中,这样无论集群中的哪台服务器执行该shell任务都可以从对应的hdfs路径下获取此脚本
Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
-----------------------
3、
上传自定义应用到hdfs上
上传到用户自定义应用在hdfs上的根目录 : /examples
$ bin/hdfs dfs -mkdir /examples 先创建应用的根目录
$ bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/myapps/myshell/ /examples 上传自定义应用到hdfs上
注意:
job.properties文件可以不上传到hdfs上,在提交oozie任务时会直接从本地加载该属性文件
workflow.xml和被调度的shell脚本必须上传到hdfs上对应的路径下
如何workflow.xml和被调度的shell脚本进行修改,修改过后一定要重新上传到hdfs上
4、提交oozie任务
$ bin/oozie job -oozie http://localhost:11000/oozie -config /opt/cdh/modules/oozie-4.0.0-cdh5.3.6/myapps/myshell/job.properties -run
5、查看结果
http://192.168.88.134:11000/oozie/ 查看所提交的workflow执行情况
如果workflow的运行状态是suspended(挂起暂停),看看历史服务器是否开启
Caused by: java.net.ConnectException: Call From bigdata01.project.com/192.168.134.101 to bigdata01.project.com:10020
http://192.168.134.101:8088/cluster 查看oozie的任务触发了几个MapReduce任务
6、杀死某个oozie job
$ bin/oozie job -oozie http://localhost:11000/oozie
-kill 0000000-171017143246549-oozie-beif-W
------------------------------------------------------------------
案例二:
在案例一的workflow基础上增加一个shell action
job1
->ok -> end
->error -> job2
->ok -> job3
->error -> kill
定义另外一个被调度的shell脚本
$ cp check_mem.sh check_df.sh
$ vi check_df.sh
#!/bin/bash
/bin/df -h >> /tmp/mem.log
$ df -h >> /tmp/mem.log 测试是否可用
1、修改job.properties
添加变量:
sh_name1=check_df.sh
2、修改 workflow.xml
------
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${sh_name}
${nameNode}/${examplesRoot}/myshell/${sh_name}#${sh_name}
修改第一个action执行成功后的跳转标签
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${sh_name1} //修改脚本的变量名
${nameNode}/${examplesRoot}/myshell/${sh_name1}#${sh_name1} //修改脚本的变量名
Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
----
3、测试执行
上传check_df.sh脚本到hdfs的/examples/myshell下
$ bin/hdfs dfs -put /opt/cdh/modules/oozie-4.0.0-cdh5.3.6/myapps/myshell/check_df.sh /examples/myshell
替换hdfs上/examples/myshell目录下的 workflow.xml
$ bin/hdfs dfs -rm /examples/myshell/workflow.xml
$ bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/myapps/myshell/workflow.xml /examples/myshell
$ sbin/mr-jobhistory-daemon.sh start historyserver //一定要开启日志
$ bin/oozie job -oozie http://localhost:11000/oozie
-config /opt/modules/oozie-4.0.0-cdh5.3.6/myapps/myshell/job.properties -run
4、查看结果
http://192.168.134.101:11000/oozie/ 查看所提交的workflow执行情况
http://192.168.134.101:8088/cluster 查看oozie的任务触发了几个MapReduce任务