From 2d31205175c221bda3a193cd1882976f92082118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Sun, 7 Apr 2019 12:06:32 +0800 Subject: [PATCH] =?UTF-8?q?Hbase=E5=AE=B9=E7=81=BE=E4=B8=8E=E5=A4=87?= =?UTF-8?q?=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Azkaban Flow 1.0 的使用.md | 449 ++++++------- notes/Azkaban Flow 2.0 的使用.md | 601 +++++++++--------- notes/Hbase Shell.md | 6 + notes/Hbase协处理器.md | 0 notes/Hbase容灾与备份.md | 197 ++++++ notes/installation/Hbase基本环境搭建.md | 10 +- .../Linux环境下Hive的安装部署.md | 14 +- pictures/hbase-copy-table.png | Bin 0 -> 51382 bytes 8 files changed, 767 insertions(+), 510 deletions(-) create mode 100644 notes/Hbase协处理器.md create mode 100644 notes/Hbase容灾与备份.md create mode 100644 pictures/hbase-copy-table.png 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 0000000000000000000000000000000000000000..10868d0488f5ab6adf112f1f073590d99e62f6c0 GIT binary patch literal 51382 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ε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 literal 0 HcmV?d00001