diff --git a/notes/Azkaban Flow 1.0 的使用.md b/notes/Azkaban Flow 1.0 的使用.md index c7ed76c..2155a18 100644 --- a/notes/Azkaban Flow 1.0 的使用.md +++ b/notes/Azkaban Flow 1.0 的使用.md @@ -1,215 +1,234 @@ -# Azkaban Flow 1.0 的使用 - -## 一、简介 - -Azkaban提供了人性化的WEB UI界面,使得我们可以通过界面上传配置文件来完成任务的调度。Azkaban有两个重要的概念: - -- **Job**: 你需要执行的调度任务; -- **Flow**:一个获取多个Job及它们之间的依赖关系所组成的图表叫做Flow。 - -目前 Azkaban 3.x 同时支持 Flow 1.0 和 Flow 2.0,本文主要讲解 Flow 1.0的使用,下一篇文章会讲解Flow 2.0的使用。 - -## 二、基本任务调度 - -### 2.1 新建项目 - -在Azkaban主界面可以创建对应的项目 - -![azkaban-create-project](D:\BigData-Notes\pictures\azkaban-create-project.png) - -### 2.2 任务配置 - -新建任务配置文件`Hello-Azkaban.job`,注意后缀名为`job`,内容如下,这里我们的任务很简单,就是输出一句`'Hello Azkaban!'` - -```shell -#command.job -type=command -command=echo 'Hello Azkaban!' -``` - -### 2.3 打包上传 - -将`Hello-Azkaban.job `打包为`zip`压缩文件 - -![azkaban-zip](D:\BigData-Notes\pictures\azkaban-zip.png) - -通过Web UI 界面上传 - -![azkaban-upload](D:\BigData-Notes\pictures\azkaban-upload.png) - -上传成功后可以看到对应的Flows - -![azkaban-flows](D:\BigData-Notes\pictures\azkaban-flows.png) - -### 2.4 执行任务 - -点击页面上的`Execute Flow`执行任务 - -![azkaban-execute](D:\BigData-Notes\pictures\azkaban-execute.png) - -### 2.5 执行结果 - -点击`detail`可以查看到任务的执行日志 - -![azkaban-successed](D:\BigData-Notes\pictures\azkaban-successed.png) - -![azkaban-log](D:\BigData-Notes\pictures\azkaban-log.png) - -## 三、多任务调度 - -### 3.1 依赖配置 - -这里假设我们有五个任务(TaskA——TaskE),D任务需要在A,B,C任务执行完成后才能执行,而E任务则需要在D任务执行完成后才能执行。则需要使用`dependencies`属性定义其依赖关系,各任务配置如下: - -**Task-A.job** : - -```shell -type=command -command=echo 'Task A' -``` - -**Task-B.job** : - -```shell -type=command -command=echo 'Task B' -``` - -**Task-C.job** : - -```shell -type=command -command=echo 'Task C' -``` - -**Task-D.job** : - -```shell -type=command -command=echo 'Task D' -dependencies=Task-A,Task-B,Task-C -``` - -**Task-E.job** : - -```shell -type=command -command=echo 'Task E' -dependencies=Task-D -``` - -### 3.2 压缩上传 - -压缩后进行上传,这里需要注意的是一个Project只能接收一个压缩包,这里我还沿用上面的Project,默认后面的压缩包会覆盖前面的压缩包 - -![azkaban-task-abcde-zip](D:\BigData-Notes\pictures\azkaban-task-abcde-zip.png) - -### 3.3 依赖关系 - -多个任务存在依赖时,默认采用最后一个任务的文件名作为Flow的名称,其依赖关系可以在页面上得以直观的体现 - -![azkaban-dependencies](D:\BigData-Notes\pictures\azkaban-dependencies.png) - -### 3.4 执行结果 - -![azkaban-task-abcde](D:\BigData-Notes\pictures\azkaban-task-abcde.png) - -这里说明一下在Flow1.0的情况下,是无法通过一个job文件完成多个任务的配置的,但是Flow 2.0 就很好的解决了这个问题。 - -## 四、调度HDFS作业 - -步骤与上面的步骤一致,这里已查看HDFS文件列表为例,建议涉及到路径的地方全部采用完整的路径名,配置文件如下: - -```shell -type=command -command=/usr/app/hadoop-2.6.0-cdh5.15.2/bin/hadoop fs -ls / -``` - -执行结果: - -![azkaban-hdfs](D:\BigData-Notes\pictures\azkaban-hdfs.png) - -## 五、调度MR作业 - -MR作业配置: - -```shell -type=command -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 -``` - -执行结果: - -![azkaban-mr](D:\BigData-Notes\pictures\azkaban-mr.png) - -## 六、调度Hive作业 - -作业配置: - -```shell -type=command -command=/usr/app/hive-1.1.0-cdh5.15.2/bin/hive -f 'test.sql' -``` - -其中`test.sql`内容如下,创建一张雇员表,然后查看其结构: - -```sql -CREATE DATABASE IF NOT EXISTS hive; -use hive; -drop table if exists emp; -CREATE TABLE emp( -empno int, -ename string, -job string, -mgr int, -hiredate string, -sal double, -comm double, -deptno int -) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; --- 查看emp表的信息 -desc emp; -``` - -打包的时候将`job`文件与`sql`文件一并进行打包 - -![azkaban-hive](D:\BigData-Notes\pictures\azkaban-hive.png) - -执行结果如下: - -![azkaban-hive-result](D:\BigData-Notes\pictures\azkaban-hive-result.png) - -## 七、在线修改作业配置 - -在测试的时候,我们可能要频繁修改配置,如果每次修改都要重新打包上传这是比较麻烦的,所幸的是Azkaban是支持配置的在线修改的,点击需要修改的Flow,就可以进入详情页面: - -![azkaban-project-edit](D:\BigData-Notes\pictures\azkaban-project-edit.png) - -在详情页面点击`Eidt`按钮可以进入编辑页面 - -![azkaban-edit](D:\BigData-Notes\pictures\azkaban-edit.png) - -在编辑页面可以新增配置或者修改配置 - -## ![azkaban-click-edit](D:\BigData-Notes\pictures\azkaban-click-edit.png)八、可能出现的问题 - -如果出现以下异常,多半是因为执行主机内存不足引起,azkaban要求执行主机可用内存必须大于3G才能满足执行任务的条件 - -```shell -Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job -``` - -![azkaban-memory](D:\BigData-Notes\pictures\azkaban-memory.png) - -如果你的执行主机没办法增大内存,则可以通过配置`commonprivate.properties` 文件关闭内存检查, - -`commonprivate.properties` 文件在安装目录的`/plugins/jobtypes`下。 - -关闭内存检查的配置如下: - -```shell -memCheck.enabled=false -``` - - - +# Azkaban Flow 1.0 的使用 + + +## 一、简介 + +Azkaban提供了人性化的WEB UI界面,使得我们可以通过界面上传配置文件来完成任务的调度。Azkaban有两个重要的概念: + +- **Job**: 你需要执行的调度任务; +- **Flow**:一个获取多个Job及它们之间的依赖关系所组成的图表叫做Flow。 + +目前 Azkaban 3.x 同时支持 Flow 1.0 和 Flow 2.0,本文主要讲解 Flow 1.0的使用,下一篇文章会讲解Flow 2.0的使用。 + +## 二、基本任务调度 + +### 2.1 新建项目 + +在Azkaban主界面可以创建对应的项目 + +
+ +### 2.2 任务配置 + +新建任务配置文件`Hello-Azkaban.job`,注意后缀名为`job`,内容如下,这里我们的任务很简单,就是输出一句`'Hello Azkaban!'` + +```shell +#command.job +type=command +command=echo 'Hello Azkaban!' +``` + +### 2.3 打包上传 + +将`Hello-Azkaban.job `打包为`zip`压缩文件 + +
+ +通过Web UI 界面上传 + +
+ +上传成功后可以看到对应的Flows + +
+ +### 2.4 执行任务 + +点击页面上的`Execute Flow`执行任务 + +
+ +### 2.5 执行结果 + +点击`detail`可以查看到任务的执行日志 + +
+ +
+ +## 三、多任务调度 + +### 3.1 依赖配置 + +这里假设我们有五个任务(TaskA——TaskE),D任务需要在A,B,C任务执行完成后才能执行,而E任务则需要在D任务执行完成后才能执行。则需要使用`dependencies`属性定义其依赖关系,各任务配置如下: + +**Task-A.job** : + +```shell +type=command +command=echo 'Task A' +``` + +**Task-B.job** : + +```shell +type=command +command=echo 'Task B' +``` + +**Task-C.job** : + +```shell +type=command +command=echo 'Task C' +``` + +**Task-D.job** : + +```shell +type=command +command=echo 'Task D' +dependencies=Task-A,Task-B,Task-C +``` + +**Task-E.job** : + +```shell +type=command +command=echo 'Task E' +dependencies=Task-D +``` + +### 3.2 压缩上传 + +压缩后进行上传,这里需要注意的是一个Project只能接收一个压缩包,这里我还沿用上面的Project,默认后面的压缩包会覆盖前面的压缩包 + +
+ +### 3.3 依赖关系 + +多个任务存在依赖时,默认采用最后一个任务的文件名作为Flow的名称,其依赖关系可以在页面上得以直观的体现 + +
+ +### 3.4 执行结果 + +
+ +这里说明一下在Flow1.0的情况下,是无法通过一个job文件完成多个任务的配置的,但是Flow 2.0 就很好的解决了这个问题。 + +## 四、调度HDFS作业 + +步骤与上面的步骤一致,这里已查看HDFS文件列表为例,建议涉及到路径的地方全部采用完整的路径名,配置文件如下: + +```shell +type=command +command=/usr/app/hadoop-2.6.0-cdh5.15.2/bin/hadoop fs -ls / +``` + +执行结果: + +
+ +## 五、调度MR作业 + +MR作业配置: + +```shell +type=command +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 +``` + +执行结果: + +
+ +## 六、调度Hive作业 + +作业配置: + +```shell +type=command +command=/usr/app/hive-1.1.0-cdh5.15.2/bin/hive -f 'test.sql' +``` + +其中`test.sql`内容如下,创建一张雇员表,然后查看其结构: + +```sql +CREATE DATABASE IF NOT EXISTS hive; +use hive; +drop table if exists emp; +CREATE TABLE emp( +empno int, +ename string, +job string, +mgr int, +hiredate string, +sal double, +comm double, +deptno int +) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; +-- 查看emp表的信息 +desc emp; +``` + +打包的时候将`job`文件与`sql`文件一并进行打包 + +
+ +执行结果如下: + +
+ +## 七、在线修改作业配置 + +在测试的时候,我们可能要频繁修改配置,如果每次修改都要重新打包上传这是比较麻烦的,所幸的是Azkaban是支持配置的在线修改的,点击需要修改的Flow,就可以进入详情页面: + +
+ +在详情页面点击`Eidt`按钮可以进入编辑页面 + +
+ +在编辑页面可以新增配置或者修改配置 + +##
八、可能出现的问题 + +如果出现以下异常,多半是因为执行主机内存不足引起,azkaban要求执行主机可用内存必须大于3G才能满足执行任务的条件 + +```shell +Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job +``` + +
+ +如果你的执行主机没办法增大内存,则可以通过配置`commonprivate.properties` 文件关闭内存检查, + +`commonprivate.properties` 文件在安装目录的`/plugins/jobtypes`下。 + +关闭内存检查的配置如下: + +```shell +memCheck.enabled=false +``` + + + diff --git a/notes/Azkaban Flow 2.0 的使用.md b/notes/Azkaban Flow 2.0 的使用.md index b0f5a54..1a611a2 100644 --- a/notes/Azkaban Flow 2.0 的使用.md +++ b/notes/Azkaban Flow 2.0 的使用.md @@ -1,291 +1,310 @@ -# Azkaban Flow 2.0的使用 - -## 一、Flow 2.0 简介 - -### 1.1 Flow 2.0 的产生 - -Azkaban 目前同时支持Flow 1.0和Flow2.0,但是官方文档上更推荐使用2.0,因为Flow 1.0 会在将来的版本被移除。 - ->This section covers how to create your Azkaban flows using Azkaban Flow 2.0.Flow 1.0 will be deprecated in the future. - -Flow 2.0设计的主要思想是提供1.0版本没有的流级定义。用户可以将属于给定流的所有.job / .properties文件合并到单个流定义文件中,而不是创建多个.job / .properties文件。配置文件以YAML格式定义,每个项目zip将包含多个流YAML文件和一个项目YAML文件。同时可以在YAML文件中的流内定义流,称为为嵌入流或子流。 - -### 1.2 基本结构 - -项目zip将包含多个流YAML文件,一个项目YAML文件以及可选库和源代码。Flow YAML文件的基本结构如下: - -+ 每个Flow都在单个YAML文件中定义 -+ 流文件以流名称命名。如:my-flow-name.flow -+ 包含DAG中的所有节点 -+ 每个节点可以是作业或流程 -+ 每个节点 可以拥有 name, type, config, dependsOn and nodes sections等属性 -+ 通过列出dependsOn列表中的父节点来指定节点依赖性 -+ 包含与流相关的其他配置 -+ 当前.properties文件中流的所有常见属性都将迁移到每个流YAML文件中的config部分 - -官方提供了一个比较完善的配置样例,如下: - -```yaml -config: - user.to.proxy: azktest - param.hadoopOutData: /tmp/wordcounthadoopout - param.inData: /tmp/wordcountpigin - param.outData: /tmp/wordcountpigout - -# This section defines the list of jobs -# A node can be a job or a flow -# In this example, all nodes are jobs -nodes: - # Job definition - # The job definition is like a YAMLified version of properties file - # with one major difference. All custom properties are now clubbed together - # in a config section in the definition. - # The first line describes the name of the job - - name: AZTest - type: noop - # The dependsOn section contains the list of parent nodes the current - # node depends on - dependsOn: - - hadoopWC1 - - NoOpTest1 - - hive2 - - java1 - - jobCommand2 - - - name: pigWordCount1 - type: pig - # The config section contains custom arguments or parameters which are - # required by the job - config: - pig.script: src/main/pig/wordCountText.pig - - - name: hadoopWC1 - type: hadoopJava - dependsOn: - - pigWordCount1 - config: - classpath: ./* - force.output.overwrite: true - input.path: ${param.inData} - job.class: com.linkedin.wordcount.WordCount - main.args: ${param.inData} ${param.hadoopOutData} - output.path: ${param.hadoopOutData} - - - name: hive1 - type: hive - config: - hive.script: src/main/hive/showdb.q - - - name: NoOpTest1 - type: noop - - - name: hive2 - type: hive - dependsOn: - - hive1 - config: - hive.script: src/main/hive/showTables.sql - - - name: java1 - type: javaprocess - config: - Xms: 96M - java.class: com.linkedin.foo.HelloJavaProcessJob - - - name: jobCommand1 - type: command - config: - command: echo "hello world from job_command_1" - - - name: jobCommand2 - type: command - dependsOn: - - jobCommand1 - config: - command: echo "hello world from job_command_2" -``` - -## 二、YAML语法 - -想要进行Flow流的配置,首先需要了解YAML ,YAML 是一种简洁的非标记语言,有着严格的格式要求的,如果你的格式配置失败,上传到Azkaban的时候就会抛出解析异常。 - -### 2.1 基本规则 - -1. 大小写敏感 -2. 使用缩进表示层级关系 -3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。 -4. 使用#表示注释 -5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号不会对特殊字符转义。 -6. YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。 - -### 2.2 对象的写法 - -```yaml -# value 与 : 符号之间必须要有一个空格 -key: value -``` - -### 2.3 map的写法 - -```yaml -# 写法一 同一缩进的所有键值对属于一个map -key: - key1: value1 - key2: value2 - -# 写法二 -{key1: value1, key2: value2} -``` - -### 2.3 数组的写法 - -```yaml -# 写法一 使用一个短横线加一个空格代表一个数组项 -- a -- b -- c - -# 写法二 -[a,b,c] -``` - -### 2.5 单双引号 - -单引号和双引号都可以使用,双引号不会对特殊字符转义。 - -```yaml -s1: '内容\n字符串' -s2: "内容\n字符串" - -转换后: -{ s1: '内容\\n字符串', s2: '内容\n字符串' } -``` - -### 2.6 特殊符号 - -`---` YAML可以在同一个文件中,使用`---`表示一个文档的开始。 - -### 2.7 配置引用 - -在Azkaban中可以使用`${}`引用定义的配置,同时也建议将公共的参数抽取到config中,并使用`${}`进行引用。 - - - -## 三、简单任务调度 - -### 3.1 任务配置 - -新建`flow`配置文件 - -```yaml -nodes: - - name: jobA - type: command - config: - command: echo "Hello Azkaban Flow 2.0." -``` - -在当前的版本中,由于Azkaban是同时支持Flow 1.0 和 Flow 2.0的,如果你想让Azkaban知道你是希望以2.0方式运行,则需要新建一个`project`文件,指明是使用的Flow 2.0 - -```shell -azkaban-flow-version: 2.0 -``` - -### 3.2 打包上传 - -![azkaban-simple](D:\BigData-Notes\pictures\azkaban-simple.png) - - - -### 3.3 执行结果 - -由于在1.0 版本中已经介绍过web ui的使用,这里就不再赘述,对于1.0和2.0版本,只有配置的方式是不同的,其他上传执行的操作方式都是相同的。执行结果如下: - -![azkaban-simle-result](D:\BigData-Notes\pictures\azkaban-simle-result.png) - -## 四、多任务调度 - -和1.0给的案例一样,这里假设我们有五个任务(jobA——jobE),D任务需要在A,B,C任务执行完成后才能执行,而E任务则需要在D任务执行完成后才能执行。`Flow`配置如下。可以看到在1.0中我们需要分别定义五个配置文件,而在2.0中我们只需要一个配置文件即可完成配置。 - -```yaml -nodes: - - name: jobE - type: command - config: - command: echo "This is job E" - # jobE depends on jobD - dependsOn: - - jobD - - - name: jobD - type: command - config: - command: echo "This is job D" - # jobD depends on jobA、jobB、jobC - dependsOn: - - jobA - - jobB - - jobC - - - name: jobA - type: command - config: - command: echo "This is job A" - - - name: jobB - type: command - config: - command: echo "This is job B" - - - name: jobC - type: command - config: - command: echo "This is job C" -``` - -## 五、内嵌流 - -Flow2.0 支持在一个Flow中定义另一个Flow,称为内嵌流或者子流。这里给出一个内嵌流的示例,其`Flow`配置如下: - -```yaml -nodes: - - name: jobC - type: command - config: - command: echo "This is job C" - dependsOn: - - embedded_flow - - - name: embedded_flow - type: flow - config: - prop: value - nodes: - - name: jobB - type: command - config: - command: echo "This is job B" - dependsOn: - - jobA - - - name: jobA - type: command - config: - command: echo "This is job A" -``` - -内嵌流的DAG图如下: - -![azkaban-embeded-flow](D:\BigData-Notes\pictures\azkaban-embeded-flow.png) - -执行情况如下: - -![azkaban-embeded-success](D:\BigData-Notes\pictures\azkaban-embeded-success.png) - - - -## 参考资料 - -1. [Azkaban Flow 2.0 Design](https://github.com/azkaban/azkaban/wiki/Azkaban-Flow-2.0-Design) -2. [Getting started with Azkaban Flow 2.0](https://github.com/azkaban/azkaban/wiki/Getting-started-with-Azkaban-Flow-2.0) - +# Azkaban Flow 2.0的使用 + + +## 一、Flow 2.0 简介 + +### 1.1 Flow 2.0 的产生 + +Azkaban 目前同时支持Flow 1.0和Flow2.0,但是官方文档上更推荐使用2.0,因为Flow 1.0 会在将来的版本被移除。 + +>This section covers how to create your Azkaban flows using Azkaban Flow 2.0.Flow 1.0 will be deprecated in the future. + +Flow 2.0设计的主要思想是提供1.0版本没有的流级定义。用户可以将属于给定流的所有.job / .properties文件合并到单个流定义文件中,而不是创建多个.job / .properties文件。配置文件以YAML格式定义,每个项目zip将包含多个流YAML文件和一个项目YAML文件。同时可以在YAML文件中的流内定义流,称为为嵌入流或子流。 + +### 1.2 基本结构 + +项目zip将包含多个流YAML文件,一个项目YAML文件以及可选库和源代码。Flow YAML文件的基本结构如下: + ++ 每个Flow都在单个YAML文件中定义 ++ 流文件以流名称命名。如:my-flow-name.flow ++ 包含DAG中的所有节点 ++ 每个节点可以是作业或流程 ++ 每个节点 可以拥有 name, type, config, dependsOn and nodes sections等属性 ++ 通过列出dependsOn列表中的父节点来指定节点依赖性 ++ 包含与流相关的其他配置 ++ 当前.properties文件中流的所有常见属性都将迁移到每个流YAML文件中的config部分 + +官方提供了一个比较完善的配置样例,如下: + +```yaml +config: + user.to.proxy: azktest + param.hadoopOutData: /tmp/wordcounthadoopout + param.inData: /tmp/wordcountpigin + param.outData: /tmp/wordcountpigout + +# This section defines the list of jobs +# A node can be a job or a flow +# In this example, all nodes are jobs +nodes: + # Job definition + # The job definition is like a YAMLified version of properties file + # with one major difference. All custom properties are now clubbed together + # in a config section in the definition. + # The first line describes the name of the job + - name: AZTest + type: noop + # The dependsOn section contains the list of parent nodes the current + # node depends on + dependsOn: + - hadoopWC1 + - NoOpTest1 + - hive2 + - java1 + - jobCommand2 + + - name: pigWordCount1 + type: pig + # The config section contains custom arguments or parameters which are + # required by the job + config: + pig.script: src/main/pig/wordCountText.pig + + - name: hadoopWC1 + type: hadoopJava + dependsOn: + - pigWordCount1 + config: + classpath: ./* + force.output.overwrite: true + input.path: ${param.inData} + job.class: com.linkedin.wordcount.WordCount + main.args: ${param.inData} ${param.hadoopOutData} + output.path: ${param.hadoopOutData} + + - name: hive1 + type: hive + config: + hive.script: src/main/hive/showdb.q + + - name: NoOpTest1 + type: noop + + - name: hive2 + type: hive + dependsOn: + - hive1 + config: + hive.script: src/main/hive/showTables.sql + + - name: java1 + type: javaprocess + config: + Xms: 96M + java.class: com.linkedin.foo.HelloJavaProcessJob + + - name: jobCommand1 + type: command + config: + command: echo "hello world from job_command_1" + + - name: jobCommand2 + type: command + dependsOn: + - jobCommand1 + config: + command: echo "hello world from job_command_2" +``` + +## 二、YAML语法 + +想要进行Flow流的配置,首先需要了解YAML ,YAML 是一种简洁的非标记语言,有着严格的格式要求的,如果你的格式配置失败,上传到Azkaban的时候就会抛出解析异常。 + +### 2.1 基本规则 + +1. 大小写敏感 +2. 使用缩进表示层级关系 +3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。 +4. 使用#表示注释 +5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号不会对特殊字符转义。 +6. YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。 + +### 2.2 对象的写法 + +```yaml +# value 与 : 符号之间必须要有一个空格 +key: value +``` + +### 2.3 map的写法 + +```yaml +# 写法一 同一缩进的所有键值对属于一个map +key: + key1: value1 + key2: value2 + +# 写法二 +{key1: value1, key2: value2} +``` + +### 2.3 数组的写法 + +```yaml +# 写法一 使用一个短横线加一个空格代表一个数组项 +- a +- b +- c + +# 写法二 +[a,b,c] +``` + +### 2.5 单双引号 + +单引号和双引号都可以使用,双引号不会对特殊字符转义。 + +```yaml +s1: '内容\n字符串' +s2: "内容\n字符串" + +转换后: +{ s1: '内容\\n字符串', s2: '内容\n字符串' } +``` + +### 2.6 特殊符号 + +`---` YAML可以在同一个文件中,使用`---`表示一个文档的开始。 + +### 2.7 配置引用 + +在Azkaban中可以使用`${}`引用定义的配置,同时也建议将公共的参数抽取到config中,并使用`${}`进行引用。 + + + +## 三、简单任务调度 + +### 3.1 任务配置 + +新建`flow`配置文件 + +```yaml +nodes: + - name: jobA + type: command + config: + command: echo "Hello Azkaban Flow 2.0." +``` + +在当前的版本中,由于Azkaban是同时支持Flow 1.0 和 Flow 2.0的,如果你想让Azkaban知道你是希望以2.0方式运行,则需要新建一个`project`文件,指明是使用的Flow 2.0 + +```shell +azkaban-flow-version: 2.0 +``` + +### 3.2 打包上传 + +
+ + + +### 3.3 执行结果 + +由于在1.0 版本中已经介绍过web ui的使用,这里就不再赘述,对于1.0和2.0版本,只有配置的方式是不同的,其他上传执行的操作方式都是相同的。执行结果如下: + +
+ +## 四、多任务调度 + +和1.0给的案例一样,这里假设我们有五个任务(jobA——jobE),D任务需要在A,B,C任务执行完成后才能执行,而E任务则需要在D任务执行完成后才能执行。`Flow`配置如下。可以看到在1.0中我们需要分别定义五个配置文件,而在2.0中我们只需要一个配置文件即可完成配置。 + +```yaml +nodes: + - name: jobE + type: command + config: + command: echo "This is job E" + # jobE depends on jobD + dependsOn: + - jobD + + - name: jobD + type: command + config: + command: echo "This is job D" + # jobD depends on jobA、jobB、jobC + dependsOn: + - jobA + - jobB + - jobC + + - name: jobA + type: command + config: + command: echo "This is job A" + + - name: jobB + type: command + config: + command: echo "This is job B" + + - name: jobC + type: command + config: + command: echo "This is job C" +``` + +## 五、内嵌流 + +Flow2.0 支持在一个Flow中定义另一个Flow,称为内嵌流或者子流。这里给出一个内嵌流的示例,其`Flow`配置如下: + +```yaml +nodes: + - name: jobC + type: command + config: + command: echo "This is job C" + dependsOn: + - embedded_flow + + - name: embedded_flow + type: flow + config: + prop: value + nodes: + - name: jobB + type: command + config: + command: echo "This is job B" + dependsOn: + - jobA + + - name: jobA + type: command + config: + command: echo "This is job A" +``` + +内嵌流的DAG图如下: + +
+ +执行情况如下: + +
+ + + +## 参考资料 + +1. [Azkaban Flow 2.0 Design](https://github.com/azkaban/azkaban/wiki/Azkaban-Flow-2.0-Design) +2. [Getting started with Azkaban Flow 2.0](https://github.com/azkaban/azkaban/wiki/Getting-started-with-Azkaban-Flow-2.0) + diff --git a/notes/Hbase Shell.md b/notes/Hbase Shell.md index 602176b..506952d 100644 --- a/notes/Hbase Shell.md +++ b/notes/Hbase Shell.md @@ -29,6 +29,12 @@ ## 一、基本命令 +首先打开Hbase Shell + +```shell +# habse shell +``` + #### 1.1 获取帮助 ```shell diff --git a/notes/Hbase协处理器.md b/notes/Hbase协处理器.md new file mode 100644 index 0000000..e69de29 diff --git a/notes/Hbase容灾与备份.md b/notes/Hbase容灾与备份.md new file mode 100644 index 0000000..5b2231c --- /dev/null +++ b/notes/Hbase容灾与备份.md @@ -0,0 +1,197 @@ +# Hbase容灾与备份 + + +## 一、前言 + +本文主要介绍Hbase常用的三种简单的容灾备份方案,即CopyTable、Export/Import、Snapshot。分别介绍如下: + + + +## 二、CopyTable + +### 2.1 简介 + +CopyTable 可以将现有表的数据复制到新表中,具有以下特点: + +- 支持时间区间 、row区间,改变表名称, 改变列族名称,指定是否 Copy已经被删除的数据等功能; +- 执行命令前,需先创建与原表结构相同的新表; +- CopyTable工具采用scan查询, 写入新表时采用put和delete API, 全是基于hbase的client Api进行读写。 + +### 2.2 命令格式 + +```shell +Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] +``` + +### 2.3 常用命令 + +1. 同集群下CopyTable + +```shell + hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy tableOrig +``` + +2. 不同集群下CopyTable + +```shell + # 两表名称相同的情况 + hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase tableOrig + + # 也可以指新的表名 + hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase --new.name=tableCopy tableOrig +``` + + +3. 下面是一个官方给的比较完整的例子,指定开始和结束时间,集群地址,以及只复制指定的列族: + +```shell + hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable +``` + +### 2.4 更多参数 + +可以通过`--help`查看更多支持的参数 + +```shell +# hbase org.apache.hadoop.hbase.mapreduce.CopyTable --help +``` + +
+ + + +## 三、Export/Import + +### 3.1 简介 + +- Export可导出数据到HDFS, 然后可通过Import导入数据, Export支持指定开始时间和结束时间, 因此可以做增量备份; +- Export导出工具与CopyTable一样是依赖hbase的scan读取数据 + +### 3.2 命令格式 + +```shell +# Export +bin/hbase org.apache.hadoop.hbase.mapreduce.Export [ [ []]] + +# Inport +bin/hbase org.apache.hadoop.hbase.mapreduce.Import +``` + ++ 对于导出,`outputdir`目录可以不用预先创建,程序会自动创建。导出完成后,导出的文件将由调用导出命令的用户拥有。 ++ 默认情况下,仅导出给定`Cell`的最新版本,而不管存储的版本数量。要导出多个版本,需要将\替换为所需的版本数。 + +### 3.3 常用命令 + +1. 导出命令 + +```shell +hbase org.apache.hadoop.hbase.mapreduce.Export tableName hdfs路径/tableName.db +``` + +2. 导入命令 + +``` +hbase org.apache.hadoop.hbase.mapreduce.Import tableName hdfs路径/tableName.db +``` + + + +## 四、Snapshot + +### 4.1 简介 + +HBase快照(Snapshot)允许您获取表的副本(包括内容和元数据),并且性能开销很小。因为快照存储的仅仅是表的元数据和HFiles的信息。 + +快照的“clone”操作会从该快照创建新表,快照的“restore”将表的内容还原到快照节点。“clone”和“restore”操作不需要复制任何数据,因为底层HFiles(包含HBase表数据的文件)不会被任何操作修改,修改的只是表的元数据信息。 + +其实在版本0.94.6之前,备份或克隆表的唯一方法是使用CopyTable / ExportTable,或者在禁用表后复制HDFS中的所有HFiles。这些方都会降低Region服务器性能(复制/导出表),且在禁用表,会导致表无法读取或写入,这在实际的生产环境中都是不允许的。 + +### 4.2 配置 + + Snapshot快照功能默认是没有开启的,如果要开启快照,则需要预先在`hbase-site.xml`文件中添加如下配置项: + +```xml + + hbase.snapshot.enabled + true + +``` + + + +### 4.3 常用命令 + +预先说明一下之前的CopyTable、Export/Import命令都是在系统环境下直接执行的,而快照的所有命令都需要在Hbase Shell交互式命令行中执行。 + +#### 1. Take a Snapshot + +```shell +# 拍摄快照 +hbase> snapshot '表名', '快照名' +``` + +默认情况下拍摄快照之前会在内存中执行数据刷新。以保证内存中的数据包含在快照中。但是如果你不希望包含内存中的数据,则可以使用`SKIP_FLUSH`选项禁止刷新。 + +```shell +# 禁止内存刷新 +hbase> snapshot '表名', '快照名', {SKIP_FLUSH => true} +``` + +#### 2. Listing Snapshots + +```shell +# 获取快照列表 +hbase> list_snapshots +``` + +#### 3. Deleting Snapshots + +```shell +# 删除快照 +hbase> delete_snapshot '快照名' +``` + +#### 4. Clone a table from snapshot + +```shell +# 从现有的快照创建一张新表 +hbase> clone_snapshot '快照名', '新表名' +``` + +#### 5. Restore a snapshot + +将表恢复到快照节点,恢复操作需要先禁用表 + +```shell +hbase> disable '表名' +hbase> restore_snapshot '快照名' +``` + +这里还需要注意的:是如果Hbase配置了基于Replication的主从复制,由于Replication在日志级别工作,而快照在文件系统级别工作,因此在还原之后,会出现副本与主服务器处于不同的状态的情况。这时候可以先停止同步,所有服务器还原到一致的数据点后再重新建立同步。 + + + +## 参考资料 + +1. [Online Apache HBase Backups with CopyTable](https://blog.cloudera.com/blog/2012/06/online-hbase-backups-with-copytable-2/) +2. [Apache HBase ™ Reference Guide](http://hbase.apache.org/book.htm) \ No newline at end of file diff --git a/notes/installation/Hbase基本环境搭建.md b/notes/installation/Hbase基本环境搭建.md index 9ae75d0..35a2f42 100644 --- a/notes/installation/Hbase基本环境搭建.md +++ b/notes/installation/Hbase基本环境搭建.md @@ -202,7 +202,15 @@ hadoop001 -### 3.6 验证启动是否成功 +### 3.6 启动 + +```shell +# bin/start-hbase.sh +``` + + + +### 3.7 验证启动是否成功 验证方式一:JPS 查看进程,其中HMaster,HRegionServer,HQuorumPeer三个进程是HBase的进程(其中HQuorumPeer是Hbase内置的Zookeeper的进程),其余的为HDFS和YARN的进程。 diff --git a/notes/installation/Linux环境下Hive的安装部署.md b/notes/installation/Linux环境下Hive的安装部署.md index 8e26546..8fcc2c5 100644 --- a/notes/installation/Linux环境下Hive的安装部署.md +++ b/notes/installation/Linux环境下Hive的安装部署.md @@ -4,6 +4,14 @@ > > 系统环境:Centos 7.6 + ### 1.1 下载并解压 下载所需版本的Hive,这里我下载的是`cdh5.15.2`版本的Hive。下载地址为:http://archive.cloudera.com/cdh5/cdh/5/ @@ -86,7 +94,7 @@ HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2 将MySQL驱动拷贝到Hive安装目录的`lib`目录下, MySQL驱动的下载地址为https://dev.mysql.com/downloads/connector/j/ , 在本仓库的resources目录下我也上传了一份,有需要的可以自行下载。 -![hive-mysql](D:\BigData-Notes\pictures\hive-mysql.png) +
@@ -111,8 +119,8 @@ HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2 # Hive ``` -![hive-install](D:\BigData-Notes\pictures\hive-install-2.png) +
在Mysql中也能看到Hive创建的库和存放元数据信息的表 -![hive-mysql-tables](D:\BigData-Notes\pictures\hive-mysql-tables.png) \ No newline at end of file +
\ No newline at end of file diff --git a/pictures/hbase-copy-table.png b/pictures/hbase-copy-table.png new file mode 100644 index 0000000..10868d0 Binary files /dev/null and b/pictures/hbase-copy-table.png differ