|
| 1 | +# Azkaban Flow 1.0 的使用 |
| 2 | + |
| 3 | +<nav> |
| 4 | +<a href="#一简介">一、简介</a><br/> |
| 5 | +<a href="#二基本任务调度">二、基本任务调度</a><br/> |
| 6 | +<a href="#三多任务调度">三、多任务调度</a><br/> |
| 7 | +<a href="#四调度HDFS作业">四、调度HDFS作业</a><br/> |
| 8 | +<a href="#五调度MR作业">五、调度MR作业</a><br/> |
| 9 | +<a href="#六调度Hive作业">六、调度Hive作业</a><br/> |
| 10 | +<a href="#七在线修改作业配置">七、在线修改作业配置</a><br/> |
| 11 | +</nav> |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +## 一、简介 |
| 16 | + |
| 17 | +Azkaban 主要通过界面上传配置文件来进行任务的调度。它有两个重要的概念: |
| 18 | + |
| 19 | +- **Job**: 你需要执行的调度任务; |
| 20 | +- **Flow**:一个获取多个 Job 及它们之间的依赖关系所组成的图表叫做 Flow。 |
| 21 | + |
| 22 | +目前 Azkaban 3.x 同时支持 Flow 1.0 和 Flow 2.0,本文主要讲解 Flow 1.0 的使用,下一篇文章会讲解 Flow 2.0 的使用。 |
| 23 | + |
| 24 | +## 二、基本任务调度 |
| 25 | + |
| 26 | +### 2.1 新建项目 |
| 27 | + |
| 28 | +在 Azkaban 主界面可以创建对应的项目: |
| 29 | + |
| 30 | +<div align="center"> <img src="../pictures/azkaban-create-project.png"/> </div> |
| 31 | + |
| 32 | +### 2.2 任务配置 |
| 33 | + |
| 34 | +新建任务配置文件 `Hello-Azkaban.job`,内容如下。这里的任务很简单,就是输出一句 `'Hello Azkaban!'` : |
| 35 | + |
| 36 | +```shell |
| 37 | +#command.job |
| 38 | +type=command |
| 39 | +command=echo 'Hello Azkaban!' |
| 40 | +``` |
| 41 | + |
| 42 | +### 2.3 打包上传 |
| 43 | + |
| 44 | +将 `Hello-Azkaban.job ` 打包为 `zip` 压缩文件: |
| 45 | + |
| 46 | +<div align="center"> <img src="../pictures/azkaban-zip.png"/> </div> |
| 47 | + |
| 48 | +通过 Web UI 界面上传: |
| 49 | + |
| 50 | +<div align="center"> <img src="../pictures/azkaban-upload.png"/> </div> |
| 51 | + |
| 52 | +上传成功后可以看到对应的 Flows: |
| 53 | + |
| 54 | +<div align="center"> <img src="../pictures/azkaban-flows.png"/> </div> |
| 55 | + |
| 56 | +### 2.4 执行任务 |
| 57 | + |
| 58 | +点击页面上的 `Execute Flow` 执行任务: |
| 59 | + |
| 60 | +<div align="center"> <img src="../pictures/azkaban-execute.png"/> </div> |
| 61 | + |
| 62 | +### 2.5 执行结果 |
| 63 | + |
| 64 | +点击 `detail` 可以查看到任务的执行日志: |
| 65 | + |
| 66 | +<div align="center"> <img src="../pictures/azkaban-successed.png"/> </div> |
| 67 | + |
| 68 | +<div align="center"> <img src="../pictures/azkaban-log.png"/> </div> |
| 69 | + |
| 70 | +## 三、多任务调度 |
| 71 | + |
| 72 | +### 3.1 依赖配置 |
| 73 | + |
| 74 | +这里假设我们有五个任务(TaskA——TaskE),D 任务需要在 A,B,C 任务执行完成后才能执行,而 E 任务则需要在 D 任务执行完成后才能执行,这种情况下需要使用 `dependencies` 属性定义其依赖关系。各任务配置如下: |
| 75 | + |
| 76 | +**Task-A.job** : |
| 77 | + |
| 78 | +```shell |
| 79 | +type=command |
| 80 | +command=echo 'Task A' |
| 81 | +``` |
| 82 | + |
| 83 | +**Task-B.job** : |
| 84 | + |
| 85 | +```shell |
| 86 | +type=command |
| 87 | +command=echo 'Task B' |
| 88 | +``` |
| 89 | + |
| 90 | +**Task-C.job** : |
| 91 | + |
| 92 | +```shell |
| 93 | +type=command |
| 94 | +command=echo 'Task C' |
| 95 | +``` |
| 96 | + |
| 97 | +**Task-D.job** : |
| 98 | + |
| 99 | +```shell |
| 100 | +type=command |
| 101 | +command=echo 'Task D' |
| 102 | +dependencies=Task-A,Task-B,Task-C |
| 103 | +``` |
| 104 | + |
| 105 | +**Task-E.job** : |
| 106 | + |
| 107 | +```shell |
| 108 | +type=command |
| 109 | +command=echo 'Task E' |
| 110 | +dependencies=Task-D |
| 111 | +``` |
| 112 | + |
| 113 | +### 3.2 压缩上传 |
| 114 | + |
| 115 | +压缩后进行上传,这里需要注意的是一个 Project 只能接收一个压缩包,这里我还沿用上面的 Project,默认后面的压缩包会覆盖前面的压缩包: |
| 116 | + |
| 117 | +<div align="center"> <img src="../pictures/azkaban-task-abcde-zip.png"/> </div> |
| 118 | + |
| 119 | +### 3.3 依赖关系 |
| 120 | + |
| 121 | +多个任务存在依赖时,默认采用最后一个任务的文件名作为 Flow 的名称,其依赖关系如图: |
| 122 | + |
| 123 | +<div align="center"> <img src="../pictures/azkaban-dependencies.png"/> </div> |
| 124 | + |
| 125 | +### 3.4 执行结果 |
| 126 | + |
| 127 | +<div align="center"> <img src="../pictures/azkaban-task-abcde.png"/> </div> |
| 128 | + |
| 129 | +从这个案例可以看出,Flow1.0 无法通过一个 job 文件来完成多个任务的配置,但是 Flow 2.0 就很好的解决了这个问题。 |
| 130 | + |
| 131 | +## 四、调度HDFS作业 |
| 132 | + |
| 133 | +步骤与上面的步骤一致,这里以查看 HDFS 上的文件列表为例。命令建议采用完整路径,配置文件如下: |
| 134 | + |
| 135 | +```shell |
| 136 | +type=command |
| 137 | +command=/usr/app/hadoop-2.6.0-cdh5.15.2/bin/hadoop fs -ls / |
| 138 | +``` |
| 139 | + |
| 140 | +执行结果: |
| 141 | + |
| 142 | +<div align="center"> <img src="../pictures/azkaban-hdfs.png"/> </div> |
| 143 | + |
| 144 | +## 五、调度MR作业 |
| 145 | + |
| 146 | +MR 作业配置: |
| 147 | + |
| 148 | +```shell |
| 149 | +type=command |
| 150 | +command=/usr/app/hadoop-2.6.0-cdh5.15.2/bin/hadoop jar /usr/app/hadoop-2.6.0-cdh5.15.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.15.2.jar pi 3 3 |
| 151 | +``` |
| 152 | + |
| 153 | +执行结果: |
| 154 | + |
| 155 | +<div align="center"> <img src="../pictures/azkaban-mr.png"/> </div> |
| 156 | + |
| 157 | +## 六、调度Hive作业 |
| 158 | + |
| 159 | +作业配置: |
| 160 | + |
| 161 | +```shell |
| 162 | +type=command |
| 163 | +command=/usr/app/hive-1.1.0-cdh5.15.2/bin/hive -f 'test.sql' |
| 164 | +``` |
| 165 | + |
| 166 | +其中 `test.sql` 内容如下,创建一张雇员表,然后查看其结构: |
| 167 | + |
| 168 | +```sql |
| 169 | +CREATE DATABASE IF NOT EXISTS hive; |
| 170 | +use hive; |
| 171 | +drop table if exists emp; |
| 172 | +CREATE TABLE emp( |
| 173 | +empno int, |
| 174 | +ename string, |
| 175 | +job string, |
| 176 | +mgr int, |
| 177 | +hiredate string, |
| 178 | +sal double, |
| 179 | +comm double, |
| 180 | +deptno int |
| 181 | +) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; |
| 182 | +-- 查看 emp 表的信息 |
| 183 | +desc emp; |
| 184 | +``` |
| 185 | + |
| 186 | +打包的时候将 `job` 文件与 `sql` 文件一并进行打包: |
| 187 | + |
| 188 | +<div align="center"> <img src="../pictures/azkaban-hive.png"/> </div> |
| 189 | + |
| 190 | +执行结果如下: |
| 191 | + |
| 192 | +<div align="center"> <img src="../pictures/azkaban-hive-result.png"/> </div> |
| 193 | + |
| 194 | +## 七、在线修改作业配置 |
| 195 | + |
| 196 | +在测试时,我们可能需要频繁修改配置,如果每次修改都要重新打包上传,这会比较麻烦。所以 Azkaban 支持配置的在线修改,点击需要修改的 Flow,就可以进入详情页面: |
| 197 | + |
| 198 | +<div align="center"> <img src="../pictures/azkaban-project-edit.png"/> </div> |
| 199 | + |
| 200 | +在详情页面点击 `Eidt` 按钮可以进入编辑页面: |
| 201 | + |
| 202 | +<div align="center"> <img src="../pictures/azkaban-edit.png"/> </div> |
| 203 | + |
| 204 | +在编辑页面可以新增配置或者修改配置: |
| 205 | + |
| 206 | +<div align="center"> <img src="../pictures/azkaban-click-edit.png"/> </div> |
| 207 | + |
| 208 | +## 附:可能出现的问题 |
| 209 | + |
| 210 | +如果出现以下异常,多半是因为执行主机内存不足,Azkaban 要求执行主机的可用内存必须大于 3G 才能执行任务: |
| 211 | + |
| 212 | +```shell |
| 213 | +Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job |
| 214 | +``` |
| 215 | + |
| 216 | +<div align="center"> <img src="../pictures/azkaban-memory.png"/> </div> |
| 217 | + |
| 218 | +如果你的执行主机没办法增大内存,那么可以通过修改 `plugins/jobtypes/` 目录下的 `commonprivate.properties` 文件来关闭内存检查,配置如下: |
| 219 | + |
| 220 | +```shell |
| 221 | +memCheck.enabled=false |
| 222 | +``` |
| 223 | + |
| 224 | + |
| 225 | + |
0 commit comments