新增离线版文档

This commit is contained in:
罗祥
2019-11-14 16:43:57 +08:00
parent 5b7eaa95ad
commit 0c6e80a589
102 changed files with 26321 additions and 1 deletions

View File

@@ -0,0 +1,124 @@
# Azkaban 3.x 编译及部署
<nav>
<a href="#一Azkaban-源码编译">一、Azkaban 源码编译</a><br/>
<a href="#二Azkaban-部署模式">二、Azkaban 部署模式</a><br/>
<a href="#三-Solo-Server-模式部署">三、Solo Server 模式部署</a><br/>
</nav>
## 一、Azkaban 源码编译
### 1.1 下载并解压
Azkaban 在 3.0 版本之后就不提供对应的安装包,需要自己下载源码进行编译。
下载所需版本的源码Azkaban 的源码托管在 GitHub 上,地址为 https://github.com/azkaban/azkaban 。可以使用 `git clone` 的方式获取源码,也可以使用 `wget` 直接下载对应 release 版本的 `tar.gz` 文件,这里我采用第二种方式:
```shell
# 下载
wget https://github.com/azkaban/azkaban/archive/3.70.0.tar.gz
# 解压
tar -zxvf azkaban-3.70.0.tar.gz
```
### 1.2 准备编译环境
#### 1. JDK
Azkaban 编译依赖 JDK 1.8+ JDK 安装方式见本仓库:
> [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
#### 2. Gradle
Azkaban 3.70.0 编译需要依赖 `gradle-4.6-all.zip`。Gradle 是一个项目自动化构建开源工具,类似于 Maven但由于采用 Groovy 语言进行项目配置,所以比 Maven 更为灵活,目前广泛用于 Android 开发、Spring 项目的构建。
需要注意的是不同版本的 Azkaban 依赖 Gradle 版本不同,可以在解压后的 `/gradle/wrapper/gradle-wrapper.properties` 文件查看
![https://github.com/heibaiying](../../pictures/azkaban-gradle-wrapper.png)
在编译时程序会自动去图中所示的地址进行下载,但是下载速度很慢。为避免影响编译过程,建议先手动下载至 `/gradle/wrapper/` 目录下:
```shell
# wget https://services.gradle.org/distributions/gradle-4.6-all.zip
```
然后修改配置文件 `gradle-wrapper.properties` 中的 `distributionUrl` 属性,指明使用本地的 gradle。
![https://github.com/heibaiying](../../pictures/azkaban-gradle-wrapper-2.png)
#### 3. Git
Azkaban 的编译过程需要用 Git 下载部分 JAR 包,所以需要预先安装 Git
```shell
# yum install git
```
### 1.3 项目编译
在根目录下执行编译命令,编译成功后会有 `BUILD SUCCESSFUL` 的提示:
```shell
# ./gradlew build installDist -x test
```
编译过程中需要注意以下问题:
+ 因为编译的过程需要下载大量的 Jar 包,下载速度根据网络情况而定,通常都不会很快,如果网络不好,耗费半个小时,一个小时都是很正常的;
+ 编译过程中如果出现网络问题而导致 JAR 无法下载编译可能会被强行终止这时候重复执行编译命令即可gradle 会把已经下载的 JAR 缓存到本地,所以不用担心会重复下载 JAR 包。
## 二、Azkaban 部署模式
>After version 3.0, we provide two modes: the stand alone “solo-server” mode and distributed multiple-executor mode. The following describes thedifferences between the two modes.
按照官方文档的说明Azkaban 3.x 之后版本提供 2 种运行模式:
+ **solo server model(单服务模式)** :元数据默认存放在内置的 H2 数据库(可以修改为 MySQL该模式中 `webServer`(管理服务器) 和 `executorServer`(执行服务器) 运行在同一个进程中,进程名是 `AzkabanSingleServer`。该模式适用于小规模工作流的调度。
- **multiple-executor(分布式多服务模式)** :存放元数据的数据库为 MySQLMySQL 应采用主从模式进行备份和容错。这种模式下 `webServer``executorServer` 在不同进程中运行,彼此之间互不影响,适合用于生产环境。
下面主要介绍 `Solo Server` 模式。
## 三 、Solo Server 模式部署
### 2.1 解压
Solo Server 模式安装包在编译后的 `/azkaban-solo-server/build/distributions` 目录下,找到后进行解压即可:
```shell
# 解压
tar -zxvf azkaban-solo-server-3.70.0.tar.gz
```
### 2.2 修改时区
这一步不是必须的。但是因为 Azkaban 默认采用的时区是 `America/Los_Angeles`,如果你的调度任务中有定时任务的话,就需要进行相应的更改,这里我更改为常用的 `Asia/Shanghai`
![https://github.com/heibaiying](../../pictures/azkaban-setting.png)
### 2.3 启动
执行启动命令,需要注意的是一定要在根目录下执行,不能进入 `bin` 目录下执行,不然会抛出 `Cannot find 'database.properties'` 异常。
```shell
# bin/start-solo.sh
```
### 2.4 验证
验证方式一:使用 `jps` 命令查看是否有 `AzkabanSingleServer` 进程:
![https://github.com/heibaiying](../../pictures/akaban-jps.png)
<br/>
验证方式二:访问 8081 端口,查看 Web UI 界面,默认的登录名密码都是 `azkaban`,如果需要修改或新增用户,可以在 `conf/azkaban-users.xml ` 文件中进行配置:
![https://github.com/heibaiying](../../pictures/azkaban-web-ui.png)

View File

@@ -0,0 +1,270 @@
# Flink Standalone Cluster
<nav>
<a href="#一部署模式">一、部署模式</a><br/>
<a href="#二单机模式">二、单机模式</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-安装部署">2.1 安装部署</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-作业提交">2.2 作业提交</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-停止作业">2.3 停止作业</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-停止-Flink">2.4 停止 Flink </a><br/>
<a href="#三Standalone-Cluster">三、Standalone Cluster</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-前置条件">3.1 前置条件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-搭建步骤">3.2 搭建步骤</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-可选配置">3.3 可选配置</a><br/>
<a href="#四Standalone-Cluster-HA">四、Standalone Cluster HA</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-前置条件">4.1 前置条件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-搭建步骤">4.2 搭建步骤</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-常见异常">4.3 常见异常</a><br/>
</nav>
## 一、部署模式
Flink 支持使用多种部署模式来满足不同规模应用的需求常见的有单机模式Standalone Cluster 模式,同时 Flink 也支持部署在其他第三方平台上,如 YARNMesosDockerKubernetes 等。以下主要介绍其单机模式和 Standalone Cluster 模式的部署。
## 二、单机模式
单机模式是一种开箱即用的模式,可以在单台服务器上运行,适用于日常的开发和调试。具体操作步骤如下:
### 2.1 安装部署
**1. 前置条件**
Flink 的运行依赖 JAVA 环境,故需要预先安装好 JDK具体步骤可以参考[Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
**2. 下载 & 解压 & 运行**
Flink 所有版本的安装包可以直接从其[官网](https://flink.apache.org/downloads.html)进行下载,这里我下载的 Flink 的版本为 `1.9.1` ,要求的 JDK 版本为 `1.8.x +`。 下载后解压到指定目录:
```shell
tar -zxvf flink-1.9.1-bin-scala_2.12.tgz -C /usr/app
```
不需要进行任何配置,直接使用以下命令就可以启动单机版本的 Flink
```shell
bin/start-cluster.sh
```
**3. WEB UI 界面**
Flink 提供了 WEB 界面用于直观的管理 Flink 集群,访问端口为 `8081`
![https://github.com/heibaiying](../../pictures/flink-dashboard.png)
Flink 的 WEB UI 界面支持大多数常用功能,如提交作业,取消作业,查看各个节点运行情况,查看作业执行情况等,大家可以在部署完成后,进入该页面进行详细的浏览。
### 2.2 作业提交
启动后可以运行安装包中自带的词频统计案例,具体步骤如下:
**1. 开启端口**
```shell
nc -lk 9999
```
**2. 提交作业**
```shell
bin/flink run examples/streaming/SocketWindowWordCount.jar --port 9999
```
该 JAR 包的源码可以在 Flink 官方的 GitHub 仓库中找到,地址为 [SocketWindowWordCount](https://github.com/apache/flink/blob/master/flink-examples/flink-examples-streaming/src/main/java/org/apache/flink/streaming/examples/socket/SocketWindowWordCount.java) ,可选传参有 hostname port对应的词频数据需要使用空格进行分割。
**3. 输入测试数据**
```shell
a a b b c c c a e
```
**4. 查看控制台输出**
可以通过 WEB UI 的控制台查看作业统运行情况:
![https://github.com/heibaiying](../../pictures/flink-socket-wordcount.png)
也可以通过 WEB 控制台查看到统计结果:
![https://github.com/heibaiying](../../pictures/flink-socket-wordcount-stdout.png)
### 2.3 停止作业
可以直接在 WEB 界面上点击对应作业的 `Cancel Job` 按钮进行取消,也可以使用命令行进行取消。使用命令行进行取消时,需要先获取到作业的 JobId可以使用 `flink list` 命令查看,输出如下:
```shell
[root@hadoop001 flink-1.9.1]# ./bin/flink list
Waiting for response...
------------------ Running/Restarting Jobs -------------------
05.11.2019 08:19:53 : ba2b1cc41a5e241c32d574c93de8a2bc : Socket Window WordCount (RUNNING)
--------------------------------------------------------------
No scheduled jobs.
```
获取到 JobId 后,就可以使用 `flink cancel` 命令取消作业:
```shell
bin/flink cancel ba2b1cc41a5e241c32d574c93de8a2bc
```
### 2.4 停止 Flink
命令如下:
```shell
bin/stop-cluster.sh
```
## 三、Standalone Cluster
Standalone Cluster 模式是 Flink 自带的一种集群模式,具体配置步骤如下:
### 3.1 前置条件
使用该模式前,需要确保所有服务器间都已经配置好 SSH 免密登录服务。这里我以三台服务器为例,主机名分别为 hadoop001hadoop002hadoop003 , 其中 hadoop001 为 master 节点,其余两台为 slave 节点,搭建步骤如下:
### 3.2 搭建步骤
修改 `conf/flink-conf.yaml` 中 jobmanager 节点的通讯地址为 hadoop001:
```yaml
jobmanager.rpc.address: hadoop001
```
修改 `conf/slaves` 配置文件,将 hadoop002 和 hadoop003 配置为 slave 节点:
```shell
hadoop002
hadoop003
```
将配置好的 Flink 安装包分发到其他两台服务器上:
```shell
scp -r /usr/app/flink-1.9.1 hadoop002:/usr/app
scp -r /usr/app/flink-1.9.1 hadoop003:/usr/app
```
在 hadoop001 上使用和单机模式相同的命令来启动集群:
```shell
bin/start-cluster.sh
```
此时控制台输出如下:
![https://github.com/heibaiying](../../pictures/flink-start-cluster-shell.png)
启动完成后可以使用 `Jps` 命令或者通过 WEB 界面来查看是否启动成功。
### 3.3 可选配置
除了上面介绍的 *jobmanager.rpc.address* 是必选配置外Flink h还支持使用其他可选参数来优化集群性能主要如下
- **jobmanager.heap.size**JobManager 的 JVM 堆内存大小,默认为 1024m 。
- **taskmanager.heap.size**Taskmanager 的 JVM 堆内存大小,默认为 1024m 。
- **taskmanager.numberOfTaskSlots**Taskmanager 上 slots 的数量,通常设置为 CPU 核心的数量,或其一半。
- **parallelism.default**:任务默认的并行度。
- **io.tmp.dirs**:存储临时文件的路径,如果没有配置,则默认采用服务器的临时目录,如 LInux 的 `/tmp` 目录。
更多配置可以参考 Flink 的官方手册:[Configuration](https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/config.html)
## 四、Standalone Cluster HA
上面我们配置的 Standalone 集群实际上只有一个 JobManager此时是存在单点故障的所以官方提供了 Standalone Cluster HA 模式来实现集群高可用。
### 4.1 前置条件
在 Standalone Cluster HA 模式下,集群可以由多个 JobManager但只有一个处于 active 状态其余的则处于备用状态Flink 使用 ZooKeeper 来选举出 Active JobManager并依赖其来提供一致性协调服务所以需要预先安装 ZooKeeper 。
另外在高可用模式下,还需要使用分布式文件系统来持久化存储 JobManager 的元数据,最常用的就是 HDFS所以 Hadoop 也需要预先安装。关于 Hadoop 集群和 ZooKeeper 集群的搭建可以参考:
+ [Hadoop 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop集群环境搭建.md)
+ [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
### 4.2 搭建步骤
修改 `conf/flink-conf.yaml` 文件,增加如下配置:
```yaml
# 配置使用zookeeper来开启高可用模式
high-availability: zookeeper
# 配置zookeeper的地址采用zookeeper集群时可以使用逗号来分隔多个节点地址
high-availability.zookeeper.quorum: hadoop003:2181
# 在zookeeper上存储flink集群元信息的路径
high-availability.zookeeper.path.root: /flink
# 集群id
high-availability.cluster-id: /standalone_cluster_one
# 持久化存储JobManager元数据的地址zookeeper上存储的只是指向该元数据的指针信息
high-availability.storageDir: hdfs://hadoop001:8020/flink/recovery
```
修改 `conf/masters` 文件,将 hadoop001 和 hadoop002 都配置为 master 节点:
```shell
hadoop001:8081
hadoop002:8081
```
确保 Hadoop 和 ZooKeeper 已经启动后,使用以下命令来启动集群:
```shell
bin/start-cluster.sh
```
此时输出如下:
![https://github.com/heibaiying](../../pictures/flink-standalone-cluster-ha.png)
可以看到集群已经以 HA 的模式启动,此时还需要在各个节点上使用 `jps` 命令来查看进程是否启动成功,正常情况如下:
![https://github.com/heibaiying](../../pictures/flink-standalone-cluster-jps.png)
只有 hadoop001 和 hadoop002 的 JobManager 进程hadoop002 和 hadoop003 上的 TaskManager 进程都已经完全启动,才表示 Standalone Cluster HA 模式搭建成功。
### 4.3 常见异常
如果进程没有启动,可以通过查看 `log` 目录下的日志来定位错误,常见的一个错误如下:
```shell
2019-11-05 09:18:35,877 INFO org.apache.flink.runtime.entrypoint.ClusterEntrypoint
- Shutting StandaloneSessionClusterEntrypoint down with application status FAILED. Diagnostics
java.io.IOException: Could not create FileSystem for highly available storage (high-availability.storageDir)
.......
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file
system implementation for scheme 'hdfs'. The scheme is not directly supported by Flink and no
Hadoop file system to support this scheme could be loaded.
.....
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Hadoop is not in
the classpath/dependencies.
......
```
可以看到是因为在 classpath 目录下找不到 Hadoop 的相关依赖,此时需要检查是否在环境变量中配置了 Hadoop 的安装路径,如果路径已经配置但仍然存在上面的问题,可以从 [Flink 官网](https://flink.apache.org/downloads.html)下载对应版本的 Hadoop 组件包:
![https://github.com/heibaiying](../../pictures/flink-optional-components.png)
下载完成后,将该 JAR 包上传至**所有** Flink 安装目录的 `lib` 目录即可。
## 参考资料
+ [Standalone Cluster](https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/deployment/cluster_setup.html#standalone-cluster)
+ [JobManager High Availability (HA)](https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/jobmanager_high_availability.html)

View File

@@ -0,0 +1,227 @@
# HBase基本环境搭建
<nav>
<a href="#一安装前置条件说明">一、安装前置条件说明</a><br/>
<a href="#二Standalone-模式">二、Standalone 模式</a><br/>
<a href="#三伪集群模式安装Pseudo-Distributed">三、伪集群模式安装Pseudo-Distributed</a><br/>
</nav>
## 一、安装前置条件说明
### 1.1 JDK版本说明
HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ 。JDK 安装方式见本仓库:
> [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
### 1.2 Standalone模式和伪集群模式的区别
+ 在 `Standalone` 模式下,所有守护进程都运行在一个 `jvm` 进程/实例中;
+ 在伪分布模式下HBase 仍然在单个主机上运行,但是每个守护进程 (HMasterHRegionServer 和 ZooKeeper) 则分别作为一个单独的进程运行。
**说明:两种模式任选其一进行部署即可,对于开发测试来说区别不大。**
## 二、Standalone 模式
### 2.1 下载并解压
从[官方网站](https://hbase.apache.org/downloads.html) 下载所需要版本的二进制安装包,并进行解压:
```shell
# tar -zxvf hbase-2.1.4-bin.tar.gz
```
### 2.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export HBASE_HOME=/usr/app/hbase-2.1.4
export PATH=$HBASE_HOME/bin:$PATH
```
使得配置的环境变量生效:
```shell
# source /etc/profile
```
### 2.3 进行HBase相关配置
修改安装目录下的 `conf/hbase-env.sh`,指定 JDK 的安装路径:
```shell
# The java implementation to use. Java 1.8+ required.
export JAVA_HOME=/usr/java/jdk1.8.0_201
```
修改安装目录下的 `conf/hbase-site.xml`,增加如下配置:
```xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/hbase/rootdir</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/zookeeper/dataDir</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
```
`hbase.rootdir`: 配置 hbase 数据的存储路径;
`hbase.zookeeper.property.dataDir`: 配置 zookeeper 数据的存储路径;
`hbase.unsafe.stream.capability.enforce`: 使用本地文件系统存储,不使用 HDFS 的情况下需要禁用此配置,设置为 false。
### 2.4 启动HBase
由于已经将 HBase 的 bin 目录配置到环境变量,直接使用以下命令启动:
```shell
# start-hbase.sh
```
### 2.5 验证启动是否成功
验证方式一 :使用 `jps` 命令查看 HMaster 进程是否启动。
```
[root@hadoop001 hbase-2.1.4]# jps
16336 Jps
15500 HMaster
```
验证方式二 :访问 HBaseWeb UI 页面,默认端口为 `16010`
![https://github.com/heibaiying](../../pictures/hbase-web-ui.png)
## 三、伪集群模式安装Pseudo-Distributed
### 3.1 Hadoop单机伪集群安装
这里我们采用 HDFS 作为 HBase 的存储方案,需要预先安装 Hadoop。Hadoop 的安装方式单独整理至:
> [Hadoop 单机伪集群搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop单机版本环境搭建.md)
### 3.2 Hbase版本选择
HBase 的版本必须要与 Hadoop 的版本兼容,不然会出现各种 Jar 包冲突。这里我 Hadoop 安装的版本为 `hadoop-2.6.0-cdh5.15.2`,为保持版本一致,选择的 HBase 版本为 `hbase-1.2.0-cdh5.15.2` 。所有软件版本如下:
+ Hadoop 版本: hadoop-2.6.0-cdh5.15.2
+ HBase 版本: hbase-1.2.0-cdh5.15.2
+ JDK 版本JDK 1.8
### 3.3 软件下载解压
下载后进行解压下载地址http://archive.cloudera.com/cdh5/cdh/5/
```shell
# tar -zxvf hbase-1.2.0-cdh5.15.2.tar.gz
```
### 3.4 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export HBASE_HOME=/usr/app/hbase-1.2.0-cdh5.15.2
export PATH=$HBASE_HOME/bin:$PATH
```
使得配置的环境变量生效:
```shell
# source /etc/profile
```
### 3.5 进行HBase相关配置
1.修改安装目录下的 `conf/hbase-env.sh`,指定 JDK 的安装路径:
```shell
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/usr/java/jdk1.8.0_201
```
2.修改安装目录下的 `conf/hbase-site.xml`,增加如下配置 (hadoop001 为主机名)
```xml
<configuration>
<!--指定 HBase 以分布式模式运行-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--指定 HBase 数据存储路径为 HDFS 上的 hbase 目录,hbase 目录不需要预先创建,程序会自动创建-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop001:8020/hbase</value>
</property>
<!--指定 zookeeper 数据的存储位置-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/zookeeper/dataDir</value>
</property>
</configuration>
```
3.修改安装目录下的 `conf/regionservers`,指定 region servers 的地址,修改后其内容如下:
```shell
hadoop001
```
### 3.6 启动
```shell
# bin/start-hbase.sh
```
### 3.7 验证启动是否成功
验证方式一 :使用 `jps` 命令查看进程。其中 `HMaster``HRegionServer` 是 HBase 的进程,`HQuorumPeer` 是 HBase 内置的 Zookeeper 的进程,其余的为 HDFS 和 YARN 的进程。
```shell
[root@hadoop001 conf]# jps
28688 NodeManager
25824 GradleDaemon
10177 Jps
22083 HRegionServer
20534 DataNode
20807 SecondaryNameNode
18744 Main
20411 NameNode
21851 HQuorumPeer
28573 ResourceManager
21933 HMaster
```
验证方式二 :访问 HBase Web UI 界面,需要注意的是 1.2 版本的 HBase 的访问端口为 `60010`
![https://github.com/heibaiying](../../pictures/hbase-60010.png)

View File

@@ -0,0 +1,200 @@
# HBase集群环境配置
<nav>
<a href="#一集群规划">一、集群规划</a><br/>
<a href="#二前置条件">二、前置条件</a><br/>
<a href="#三集群搭建">三、集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-下载并解压">3.1 下载并解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-配置环境变量">3.2 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-集群配置">3.3 集群配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-HDFS客户端配置">3.4 HDFS客户端配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#35-安装包分发">3.5 安装包分发</a><br/>
<a href="#四启动集群">四、启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-启动ZooKeeper集群">4.1 启动ZooKeeper集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-启动Hadoop集群">4.2 启动Hadoop集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-启动HBase集群">4.3 启动HBase集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#45-查看服务">4.5 查看服务</a><br/>
</nav>
## 一、集群规划
这里搭建一个 3 节点的 HBase 集群,其中三台主机上均为 `Regin Server`。同时为了保证高可用,除了在 hadoop001 上部署主 `Master` 服务外,还在 hadoop002 上部署备用的 `Master` 服务。Master 服务由 Zookeeper 集群进行协调管理,如果主 `Master` 不可用,则备用 `Master` 会成为新的主 `Master`
![https://github.com/heibaiying](../../pictures/hbase集群规划.png)
## 二、前置条件
HBase 的运行需要依赖 Hadoop 和 JDK(`HBase 2.0+` 对应 `JDK 1.8+`) 。同时为了保证高可用,这里我们不采用 HBase 内置的 Zookeeper 服务,而采用外置的 Zookeeper 集群。相关搭建步骤可以参阅:
- [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
- [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
- [Hadoop 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop集群环境搭建.md)
## 三、集群搭建
### 3.1 下载并解压
下载并解压,这里我下载的是 CDH 版本 HBase下载地址为http://archive.cloudera.com/cdh5/cdh/5/
```shell
# tar -zxvf hbase-1.2.0-cdh5.15.2.tar.gz
```
### 3.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export HBASE_HOME=usr/app/hbase-1.2.0-cdh5.15.2
export PATH=$HBASE_HOME/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 3.3 集群配置
进入 `${HBASE_HOME}/conf` 目录下,修改配置:
#### 1. hbase-env.sh
```shell
# 配置JDK安装位置
export JAVA_HOME=/usr/java/jdk1.8.0_201
# 不使用内置的zookeeper服务
export HBASE_MANAGES_ZK=false
```
#### 2. hbase-site.xml
```xml
<configuration>
<property>
<!-- 指定 hbase 以分布式集群的方式运行 -->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<!-- 指定 hbase 在 HDFS 上的存储位置 -->
<name>hbase.rootdir</name>
<value>hdfs://hadoop001:8020/hbase</value>
</property>
<property>
<!-- 指定 zookeeper 的地址-->
<name>hbase.zookeeper.quorum</name>
<value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
</property>
</configuration>
```
#### 3. regionservers
```
hadoop001
hadoop002
hadoop003
```
#### 4. backup-masters
```
hadoop002
```
` backup-masters` 这个文件是不存在的,需要新建,主要用来指明备用的 master 节点,可以是多个,这里我们以 1 个为例。
### 3.4 HDFS客户端配置
这里有一个可选的配置:如果您在 Hadoop 集群上进行了 HDFS 客户端配置的更改,比如将副本系数 `dfs.replication` 设置成 5则必须使用以下方法之一来使 HBase 知道,否则 HBase 将依旧使用默认的副本系数 3 来创建文件:
> 1. Add a pointer to your `HADOOP_CONF_DIR` to the `HBASE_CLASSPATH` environment variable in *hbase-env.sh*.
> 2. Add a copy of *hdfs-site.xml* (or *hadoop-site.xml*) or, better, symlinks, under *${HBASE_HOME}/conf*, or
> 3. if only a small set of HDFS client configurations, add them to *hbase-site.xml*.
以上是官方文档的说明,这里解释一下:
**第一种** :将 Hadoop 配置文件的位置信息添加到 `hbase-env.sh``HBASE_CLASSPATH` 属性,示例如下:
```shell
export HBASE_CLASSPATH=usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop
```
**第二种** :将 Hadoop 的 ` hdfs-site.xml``hadoop-site.xml` 拷贝到 `${HBASE_HOME}/conf ` 目录下,或者通过符号链接的方式。如果采用这种方式的话,建议将两者都拷贝或建立符号链接,示例如下:
```shell
# 拷贝
cp core-site.xml hdfs-site.xml /usr/app/hbase-1.2.0-cdh5.15.2/conf/
# 使用符号链接
ln -s /usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop/core-site.xml
ln -s /usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop/hdfs-site.xml
```
> 注:`hadoop-site.xml` 这个配置文件现在叫做 `core-site.xml`
**第三种** :如果你只有少量更改,那么直接配置到 `hbase-site.xml` 中即可。
### 3.5 安装包分发
将 HBase 的安装包分发到其他服务器,分发后建议在这两台服务器上也配置一下 HBase 的环境变量。
```shell
scp -r /usr/app/hbase-1.2.0-cdh5.15.2/ hadoop002:usr/app/
scp -r /usr/app/hbase-1.2.0-cdh5.15.2/ hadoop003:usr/app/
```
## 四、启动集群
### 4.1 启动ZooKeeper集群
分别到三台服务器上启动 ZooKeeper 服务:
```shell
zkServer.sh start
```
### 4.2 启动Hadoop集群
```shell
# 启动dfs服务
start-dfs.sh
# 启动yarn服务
start-yarn.sh
```
### 4.3 启动HBase集群
进入 hadoop001 的 `${HBASE_HOME}/bin`,使用以下命令启动 HBase 集群。执行此命令后,会在 hadoop001 上启动 `Master` 服务,在 hadoop002 上启动备用 `Master` 服务,在 `regionservers` 文件中配置的所有节点启动 `region server` 服务。
```shell
start-hbase.sh
```
### 4.5 查看服务
访问 HBase 的 Web-UI 界面,这里我安装的 HBase 版本为 1.2,访问端口为 `60010`,如果你安装的是 2.0 以上的版本,则访问端口号为 `16010`。可以看到 `Master` 在 hadoop001 上,三个 `Regin Servers` 分别在 hadoop001hadoop002和 hadoop003 上,并且还有一个 `Backup Matser` 服务在 hadoop002 上。
![https://github.com/heibaiying](../../pictures/hbase-集群搭建1.png)
<br/>
hadoop002 上的 HBase 出于备用状态:
<br/>
![https://github.com/heibaiying](../../pictures/hbase-集群搭建2.png)

View File

@@ -0,0 +1,262 @@
# Hadoop单机版环境搭建
<nav>
<a href="#一前置条件">一、前置条件</a><br/>
<a href="#二配置-SSH-免密登录">二、配置 SSH 免密登录</a><br/>
<a href="#三HadoopHDFS环境搭建">三、Hadoop(HDFS)环境搭建</a><br/>
<a href="#四HadoopYARN环境搭建">四、Hadoop(YARN)环境搭建</a><br/>
</nav>
## 一、前置条件
Hadoop 的运行依赖 JDK需要预先安装安装步骤见
+ [Linux 下 JDK 的安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
## 二、配置免密登录
Hadoop 组件之间需要基于 SSH 进行通讯。
#### 2.1 配置映射
配置 ip 地址和主机名映射:
```shell
vim /etc/hosts
# 文件末尾增加
192.168.43.202 hadoop001
```
### 2.2 生成公私钥
执行下面命令行生成公匙和私匙:
```
ssh-keygen -t rsa
```
### 3.3 授权
进入 `~/.ssh` 目录下,查看生成的公匙和私匙,并将公匙写入到授权文件:
```shell
[root@@hadoop001 sbin]# cd ~/.ssh
[root@@hadoop001 .ssh]# ll
-rw-------. 1 root root 1675 315 09:48 id_rsa
-rw-r--r--. 1 root root 388 315 09:48 id_rsa.pub
```
```shell
# 写入公匙到授权文件
[root@hadoop001 .ssh]# cat id_rsa.pub >> authorized_keys
[root@hadoop001 .ssh]# chmod 600 authorized_keys
```
## 三、Hadoop(HDFS)环境搭建
### 3.1 下载并解压
下载 Hadoop 安装包,这里我下载的是 CDH 版本的下载地址为http://archive.cloudera.com/cdh5/cdh/5/
```shell
# 解压
tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz
```
### 3.2 配置环境变量
```shell
# vi /etc/profile
```
配置环境变量:
```
export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2
export PATH=${HADOOP_HOME}/bin:$PATH
```
执行 `source` 命令,使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 3.3 修改Hadoop配置
进入 `${HADOOP_HOME}/etc/hadoop/ ` 目录下,修改以下配置:
#### 1. hadoop-env.sh
```shell
# JDK安装路径
export JAVA_HOME=/usr/java/jdk1.8.0_201/
```
#### 2. core-site.xml
```xml
<configuration>
<property>
<!--指定 namenode 的 hdfs 协议文件系统的通信地址-->
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:8020</value>
</property>
<property>
<!--指定 hadoop 存储临时文件的目录-->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
```
#### 3. hdfs-site.xml
指定副本系数和临时文件存储位置:
```xml
<configuration>
<property>
<!--由于我们这里搭建是单机版本,所以指定 dfs 的副本系数为 1-->
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
```
#### 4. slaves
配置所有从属节点的主机名或 IP 地址,由于是单机版本,所以指定本机即可:
```shell
hadoop001
```
### 3.4 关闭防火墙
不关闭防火墙可能导致无法访问 Hadoop 的 Web UI 界面:
```shell
# 查看防火墙状态
sudo firewall-cmd --state
# 关闭防火墙:
sudo systemctl stop firewalld.service
```
### 3.5 初始化
第一次启动 Hadoop 时需要进行初始化,进入 `${HADOOP_HOME}/bin/` 目录下,执行以下命令:
```shell
[root@hadoop001 bin]# ./hdfs namenode -format
```
### 3.6 启动HDFS
进入 `${HADOOP_HOME}/sbin/` 目录下,启动 HDFS
```shell
[root@hadoop001 sbin]# ./start-dfs.sh
```
### 3.7 验证是否启动成功
方式一:执行 `jps` 查看 `NameNode``DataNode` 服务是否已经启动:
```shell
[root@hadoop001 hadoop-2.6.0-cdh5.15.2]# jps
9137 DataNode
9026 NameNode
9390 SecondaryNameNode
```
方式二:查看 Web UI 界面,端口为 `50070`
![https://github.com/heibaiying](../../pictures/hadoop安装验证.png)
## 四、Hadoop(YARN)环境搭建
### 4.1 修改配置
进入 `${HADOOP_HOME}/etc/hadoop/ ` 目录下,修改以下配置:
#### 1. mapred-site.xml
```shell
# 如果没有mapred-site.xml则拷贝一份样例文件后再修改
cp mapred-site.xml.template mapred-site.xml
```
```xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
```
#### 2. yarn-site.xml
```xml
<configuration>
<property>
<!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
```
### 4.2 启动服务
进入 `${HADOOP_HOME}/sbin/` 目录下,启动 YARN
```shell
./start-yarn.sh
```
#### 4.3 验证是否启动成功
方式一:执行 `jps` 命令查看 `NodeManager``ResourceManager` 服务是否已经启动:
```shell
[root@hadoop001 hadoop-2.6.0-cdh5.15.2]# jps
9137 DataNode
9026 NameNode
12294 NodeManager
12185 ResourceManager
9390 SecondaryNameNode
```
方式二:查看 Web UI 界面,端口号为 `8088`
![https://github.com/heibaiying](../../pictures/hadoop-yarn安装验证.png)

View File

@@ -0,0 +1,233 @@
# Hadoop集群环境搭建
<nav>
<a href="#一集群规划">一、集群规划</a><br/>
<a href="#二前置条件">二、前置条件</a><br/>
<a href="#三配置免密登录">三、配置免密登录</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-生成密匙">3.1 生成密匙</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-免密登录">3.2 免密登录</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-验证免密登录">3.3 验证免密登录</a><br/>
<a href="#四集群搭建">四、集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-下载并解压">3.1 下载并解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-配置环境变量">3.2 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-修改配置">3.3 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-分发程序">3.4 分发程序</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#35--初始化">3.5 初始化</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#36-启动集群">3.6 启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#37-查看集群">3.7 查看集群</a><br/>
<a href="#五提交服务到集群">五、提交服务到集群</a><br/>
</nav>
## 一、集群规划
这里搭建一个 3 节点的 Hadoop 集群,其中三台主机均部署 `DataNode``NodeManager` 服务,但只有 hadoop001 上部署 `NameNode``ResourceManager` 服务。
![https://github.com/heibaiying](../../pictures/hadoop集群规划.png)
## 二、前置条件
Hadoop 的运行依赖 JDK需要预先安装。其安装步骤单独整理至
+ [Linux 下 JDK 的安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
## 三、配置免密登录
### 3.1 生成密匙
在每台主机上使用 `ssh-keygen` 命令生成公钥私钥对:
```shell
ssh-keygen
```
### 3.2 免密登录
`hadoop001` 的公钥写到本机和远程机器的 ` ~/ .ssh/authorized_key` 文件中:
```shell
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop001
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop002
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop003
```
### 3.3 验证免密登录
```she
ssh hadoop002
ssh hadoop003
```
## 四、集群搭建
### 3.1 下载并解压
下载 Hadoop。这里我下载的是 CDH 版本 Hadoop下载地址为http://archive.cloudera.com/cdh5/cdh/5/
```shell
# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz
```
### 3.2 配置环境变量
编辑 `profile` 文件:
```shell
# vim /etc/profile
```
增加如下配置:
```
export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2
export PATH=${HADOOP_HOME}/bin:$PATH
```
执行 `source` 命令,使得配置立即生效:
```shell
# source /etc/profile
```
### 3.3 修改配置
进入 `${HADOOP_HOME}/etc/hadoop` 目录下,修改配置文件。各个配置文件内容如下:
#### 1. hadoop-env.sh
```shell
# 指定JDK的安装位置
export JAVA_HOME=/usr/java/jdk1.8.0_201/
```
#### 2. core-site.xml
```xml
<configuration>
<property>
<!--指定 namenode 的 hdfs 协议文件系统的通信地址-->
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:8020</value>
</property>
<property>
<!--指定 hadoop 集群存储临时文件的目录-->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
```
#### 3. hdfs-site.xml
```xml
<property>
<!--namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔-->
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/namenode/data</value>
</property>
<property>
<!--datanode 节点数据(即数据块)的存放位置-->
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/datanode/data</value>
</property>
```
#### 4. yarn-site.xml
```xml
<configuration>
<property>
<!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--resourcemanager 的主机名-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop001</value>
</property>
</configuration>
```
#### 5. mapred-site.xml
```xml
<configuration>
<property>
<!--指定 mapreduce 作业运行在 yarn 上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
```
#### 5. slaves
配置所有从属节点的主机名或 IP 地址,每行一个。所有从属节点上的 `DataNode` 服务和 `NodeManager` 服务都会被启动。
```properties
hadoop001
hadoop002
hadoop003
```
### 3.4 分发程序
将 Hadoop 安装包分发到其他两台服务器,分发后建议在这两台服务器上也配置一下 Hadoop 的环境变量。
```shell
# 将安装包分发到hadoop002
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
# 将安装包分发到hadoop003
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/
```
### 3.5 初始化
`Hadoop001` 上执行 namenode 初始化命令:
```
hdfs namenode -format
```
### 3.6 启动集群
进入到 `Hadoop001``${HADOOP_HOME}/sbin` 目录下,启动 Hadoop。此时 `hadoop002``hadoop003` 上的相关服务也会被启动:
```shell
# 启动dfs服务
start-dfs.sh
# 启动yarn服务
start-yarn.sh
```
### 3.7 查看集群
在每台服务器上使用 `jps` 命令查看服务进程,或直接进入 Web-UI 界面进行查看,端口为 `50070`。可以看到此时有三个可用的 `Datanode`
![https://github.com/heibaiying](../../pictures/hadoop-集群环境搭建.png)
<BR/>
点击 `Live Nodes` 进入,可以看到每个 `DataNode` 的详细情况:
![https://github.com/heibaiying](../../pictures/hadoop-集群搭建2.png)
<BR/>
接着可以查看 Yarn 的情况,端口号为 `8088`
![https://github.com/heibaiying](../../pictures/hadoop-集群搭建3.png)
## 五、提交服务到集群
提交作业到集群的方式和单机环境完全一致,这里以提交 Hadoop 内置的计算 Pi 的示例程序为例,在任何一个节点上执行都可以,命令如下:
```shell
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
```

View File

@@ -0,0 +1,68 @@
# Linux下Flume的安装
## 一、前置条件
Flume 需要依赖 JDK 1.8+JDK 安装方式见本仓库:
> [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
## 二 、安装步骤
### 2.1 下载并解压
下载所需版本的 Flume这里我下载的是 `CDH` 版本的 Flume。下载地址为http://archive.cloudera.com/cdh5/cdh/5/
```shell
# 下载后进行解压
tar -zxvf flume-ng-1.6.0-cdh5.15.2.tar.gz
```
### 2.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export FLUME_HOME=/usr/app/apache-flume-1.6.0-cdh5.15.2-bin
export PATH=$FLUME_HOME/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 2.3 修改配置
进入安装目录下的 `conf/` 目录,拷贝 Flume 的环境配置模板 `flume-env.sh.template`
```shell
# cp flume-env.sh.template flume-env.sh
```
修改 `flume-env.sh`,指定 JDK 的安装路径:
```shell
# Enviroment variables can be set here.
export JAVA_HOME=/usr/java/jdk1.8.0_201
```
### 2.4 验证
由于已经将 Flume 的 bin 目录配置到环境变量,直接使用以下命令验证是否配置成功:
```shell
# flume-ng version
```
出现对应的版本信息则代表配置成功。
![flume-version](../../pictures/flume-version.png)

View File

@@ -0,0 +1,55 @@
# Linux下JDK的安装
>**系统环境**centos 7.6
>
>**JDK 版本**jdk 1.8.0_20
### 1. 下载并解压
在[官网](https://www.oracle.com/technetwork/java/javase/downloads/index.html) 下载所需版本的 JDK这里我下载的版本为[JDK 1.8](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) ,下载后进行解压:
```shell
[root@ java]# tar -zxvf jdk-8u201-linux-x64.tar.gz
```
### 2. 设置环境变量
```shell
[root@ java]# vi /etc/profile
```
添加如下配置:
```shell
export JAVA_HOME=/usr/java/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
```
执行 `source` 命令,使得配置立即生效:
```shell
[root@ java]# source /etc/profile
```
### 3. 检查是否安装成功
```shell
[root@ java]# java -version
```
显示出对应的版本信息则代表安装成功。
```shell
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
```

View File

@@ -0,0 +1,71 @@
## Linux下Python安装
>**系统环境**centos 7.6
>
>**Python 版本**Python-3.6.8
### 1. 环境依赖
Python3.x 的安装需要依赖这四个组件gcc zlibzlib-developenssl-devel所以需要预先安装命令如下
```shell
yum install gcc -y
yum install zlib -y
yum install zlib-devel -y
yum install openssl-devel -y
```
### 2. 下载编译
Python 源码包下载地址: https://www.python.org/downloads/
```shell
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
```
### 3. 解压编译
```shell
# tar -zxvf Python-3.6.8.tgz
```
进入根目录进行编译,可以指定编译安装的路径,这里我们指定为 `/usr/app/python3.6`
```shell
# cd Python-3.6.8
# ./configure --prefix=/usr/app/python3.6
# make && make install
```
### 4. 环境变量配置
```shell
vim /etc/profile
```
```shell
export PYTHON_HOME=/usr/app/python3.6
export PATH=${PYTHON_HOME}/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
source /etc/profile
```
### 5. 验证安装是否成功
输入 `python3` 命令,如果能进入 python 交互环境,则代表安装成功:
```shell
[root@hadoop001 app]# python3
Python 3.6.8 (default, Mar 29 2019, 10:17:41)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> exit()
[root@hadoop001 app]#
```

View File

@@ -0,0 +1,181 @@
# Linux环境下Hive的安装
<nav>
<a href="#一安装Hive">一、安装Hive</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#11-下载并解压">1.1 下载并解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-配置环境变量">1.2 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#13-修改配置">1.3 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#14-拷贝数据库驱动">1.4 拷贝数据库驱动</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#15-初始化元数据库">1.5 初始化元数据库</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#16-启动">1.6 启动</a><br/>
<a href="#二HiveServer2beeline">二、HiveServer2/beeline</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-修改Hadoop配置">2.1 修改Hadoop配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-启动hiveserver2">2.2 启动hiveserver2</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-使用beeline">2.3 使用beeline</a><br/>
</nav>
## 一、安装Hive
### 1.1 下载并解压
下载所需版本的 Hive这里我下载版本为 `cdh5.15.2`。下载地址http://archive.cloudera.com/cdh5/cdh/5/
```shell
# 下载后进行解压
tar -zxvf hive-1.1.0-cdh5.15.2.tar.gz
```
### 1.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export HIVE_HOME=/usr/app/hive-1.1.0-cdh5.15.2
export PATH=$HIVE_HOME/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 1.3 修改配置
**1. hive-env.sh**
进入安装目录下的 `conf/` 目录,拷贝 Hive 的环境配置模板 `flume-env.sh.template`
```shell
cp hive-env.sh.template hive-env.sh
```
修改 `hive-env.sh`,指定 Hadoop 的安装路径:
```shell
HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2
```
**2. hive-site.xml**
新建 hive-site.xml 文件,内容如下,主要是配置存放元数据的 MySQL 的地址、驱动、用户名和密码等信息:
```xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop001:3306/hadoop_hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
```
### 1.4 拷贝数据库驱动
将 MySQL 驱动包拷贝到 Hive 安装目录的 `lib` 目录下, MySQL 驱动的下载地址为https://dev.mysql.com/downloads/connector/j/ , 在本仓库的[resources](https://github.com/heibaiying/BigData-Notes/tree/master/resources) 目录下我也上传了一份,有需要的可以自行下载。
![https://github.com/heibaiying](../../pictures/hive-mysql.png)
### 1.5 初始化元数据库
+ 当使用的 hive 是 1.x 版本时可以不进行初始化操作Hive 会在第一次启动的时候会自动进行初始化,但不会生成所有的元数据信息表,只会初始化必要的一部分,在之后的使用中用到其余表时会自动创建;
+ 当使用的 hive 是 2.x 版本时,必须手动初始化元数据库。初始化命令:
```shell
# schematool 命令在安装目录的 bin 目录下,由于上面已经配置过环境变量,在任意位置执行即可
schematool -dbType mysql -initSchema
```
这里我使用的是 CDH 的 `hive-1.1.0-cdh5.15.2.tar.gz`,对应 `Hive 1.1.0` 版本,可以跳过这一步。
### 1.6 启动
由于已经将 Hive 的 bin 目录配置到环境变量,直接使用以下命令启动,成功进入交互式命令行后执行 `show databases` 命令,无异常则代表搭建成功。
```shell
# hive
```
![https://github.com/heibaiying](../../pictures/hive-install-2.png)
在 Mysql 中也能看到 Hive 创建的库和存放元数据信息的表
![https://github.com/heibaiying](../../pictures/hive-mysql-tables.png)
## 二、HiveServer2/beeline
Hive 内置了 HiveServer 和 HiveServer2 服务,两者都允许客户端使用多种编程语言进行连接,但是 HiveServer 不能处理多个客户端的并发请求,因此产生了 HiveServer2。HiveServer2HS2允许远程客户端可以使用各种编程语言向 Hive 提交请求并检索结果支持多客户端并发访问和身份验证。HS2 是由多个服务组成的单个进程,其包括基于 Thrift 的 Hive 服务TCP 或 HTTP和用于 Web UI 的 Jetty Web 服务。
HiveServer2 拥有自己的 CLI 工具——Beeline。Beeline 是一个基于 SQLLine 的 JDBC 客户端。由于目前 HiveServer2 是 Hive 开发维护的重点,所以官方更加推荐使用 Beeline 而不是 Hive CLI。以下主要讲解 Beeline 的配置方式。
### 2.1 修改Hadoop配置
修改 hadoop 集群的 core-site.xml 配置文件,增加如下配置,指定 hadoop 的 root 用户可以代理本机上所有的用户。
```xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
```
之所以要配置这一步,是因为 hadoop 2.0 以后引入了安全伪装机制,使得 hadoop 不允许上层系统(如 hive直接将实际用户传递到 hadoop 层,而应该将实际用户传递给一个超级代理,由该代理在 hadoop 上执行操作,以避免任意客户端随意操作 hadoop。如果不配置这一步在之后的连接中可能会抛出 `AuthorizationException` 异常。
>关于 Hadoop 的用户代理机制,可以参考:[hadoop 的用户代理机制](https://blog.csdn.net/u012948976/article/details/49904675#官方文档解读) 或 [Superusers Acting On Behalf Of Other Users](http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/Superusers.html)
### 2.2 启动hiveserver2
由于上面已经配置过环境变量,这里直接启动即可:
```shell
# nohup hiveserver2 &
```
### 2.3 使用beeline
可以使用以下命令进入 beeline 交互式命令行,出现 `Connected` 则代表连接成功。
```shell
# beeline -u jdbc:hive2://hadoop001:10000 -n root
```
![https://github.com/heibaiying](../../pictures/hive-beeline-cli.png)

View File

@@ -0,0 +1,178 @@
# Spark开发环境搭建
<nav>
<a href="#一安装Spark">一、安装Spark</a><br/>
<a href="#二词频统计案例">二、词频统计案例</a><br/>
<a href="#三Scala开发环境配置">三、Scala开发环境配置</a><br/>
</nav>
## 一、安装Spark
### 1.1 下载并解压
官方下载地址http://spark.apache.org/downloads.html ,选择 Spark 版本和对应的 Hadoop 版本后再下载:
![https://github.com/heibaiying](../../pictures/spark-download.png)
解压安装包:
```shell
# tar -zxvf spark-2.2.3-bin-hadoop2.6.tgz
```
### 1.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export SPARK_HOME=/usr/app/spark-2.2.3-bin-hadoop2.6
export PATH=${SPARK_HOME}/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 1.3 Local模式
Local 模式是最简单的一种运行方式,它采用单节点多线程方式运行,不用部署,开箱即用,适合日常测试开发。
```shell
# 启动spark-shell
spark-shell --master local[2]
```
- **local**:只启动一个工作线程;
- **local[k]**:启动 k 个工作线程;
- **local[*]**:启动跟 cpu 数目相同的工作线程数。
![https://github.com/heibaiying](../../pictures/spark-shell-local.png)
<br/>
进入 spark-shell 后,程序已经自动创建好了上下文 `SparkContext`,等效于执行了下面的 Scala 代码:
```scala
val conf = new SparkConf().setAppName("Spark shell").setMaster("local[2]")
val sc = new SparkContext(conf)
```
## 二、词频统计案例
安装完成后可以先做一个简单的词频统计例子,感受 spark 的魅力。准备一个词频统计的文件样本 `wc.txt`,内容如下:
```txt
hadoop,spark,hadoop
spark,flink,flink,spark
hadoop,hadoop
```
在 scala 交互式命令行中执行如下 Scala 语句:
```scala
val file = spark.sparkContext.textFile("file:///usr/app/wc.txt")
val wordCounts = file.flatMap(line => line.split(",")).map((word => (word, 1))).reduceByKey(_ + _)
wordCounts.collect
```
执行过程如下,可以看到已经输出了词频统计的结果:
![https://github.com/heibaiying](../../pictures/spark-shell.png)
同时还可以通过 Web UI 查看作业的执行情况,访问端口为 `4040`
![https://github.com/heibaiying](../../pictures/spark-shell-web-ui.png)
## 三、Scala开发环境配置
Spark 是基于 Scala 语言进行开发的,分别提供了基于 Scala、Java、Python 语言的 API如果你想使用 Scala 语言进行开发,则需要搭建 Scala 语言的开发环境。
### 3.1 前置条件
Scala 的运行依赖于 JDK所以需要你本机有安装对应版本的 JDK最新的 Scala 2.12.x 需要 JDK 1.8+。
### 3.2 安装Scala插件
IDEA 默认不支持 Scala 语言的开发,需要通过插件进行扩展。打开 IDEA依次点击 **File** => **settings**=> **plugins** 选项卡,搜索 Scala 插件 (如下图)。找到插件后进行安装,并重启 IDEA 使得安装生效。
![https://github.com/heibaiying](../../pictures/idea-scala-plugin.png)
### 3.3 创建Scala项目
在 IDEA 中依次点击 **File** => **New** => **Project** 选项卡,然后选择创建 `Scala—IDEA` 工程:
<div align="center"> <img width="700px" src="../../pictures/idea-newproject-scala.png"/> </div>
### 3.4 下载Scala SDK
#### 1. 方式一
此时看到 `Scala SDK` 为空,依次点击 `Create` => `Download` ,选择所需的版本后,点击 `OK` 按钮进行下载,下载完成点击 `Finish` 进入工程。
<div align="center"> <img width="700px" src="../../pictures/idea-scala-select.png"/> </div>
#### 2. 方式二
方式一是 Scala 官方安装指南里使用的方式,但下载速度通常比较慢,且这种安装下并没有直接提供 Scala 命令行工具。所以个人推荐到官网下载安装包进行安装下载地址https://www.scala-lang.org/download/
这里我的系统是 Windows下载 msi 版本的安装包后,一直点击下一步进行安装,安装完成后会自动配置好环境变量。
<div align="center"> <img width="700px" src="../../pictures/scala-other-resources.png"/> </div>
由于安装时已经自动配置好环境变量,所以 IDEA 会自动选择对应版本的 SDK。
<div align="center"> <img width="700px" src="../../pictures/idea-scala-2.1.8.png"/> </div>
### 3.5 创建Hello World
在工程 `src` 目录上右击 **New** => **Scala class** 创建 `Hello.scala`。输入代码如下,完成后点击运行按钮,成功运行则代表搭建成功。
<div align="center"> <img width="700px" src="../../pictures/scala-hello-world.png"/> </div>
### 3.6 切换Scala版本
在日常的开发中,由于对应软件(如 Spark的版本切换可能导致需要切换 Scala 的版本,则可以在 `Project Structures` 中的 `Global Libraries` 选项卡中进行切换。
<div align="center"> <img width="700px" src="../../pictures/idea-scala-change.png"/> </div>
### 3.7 可能出现的问题
在 IDEA 中有时候重新打开项目后,右击并不会出现新建 `scala` 文件的选项,或者在编写时没有 Scala 语法提示,此时可以先删除 `Global Libraries` 中配置好的 SDK之后再重新添加
![https://github.com/heibaiying](../../pictures/scala-sdk.png)
**另外在 IDEA 中以本地模式运行 Spark 项目是不需要在本机搭建 Spark 和 Hadoop 环境的。**

View File

@@ -0,0 +1,190 @@
# 基于ZooKeeper搭建Spark高可用集群
<nav>
<a href="#一集群规划">一、集群规划</a><br/>
<a href="#二前置条件">二、前置条件</a><br/>
<a href="#三Spark集群搭建">三、Spark集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-下载解压">3.1 下载解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-配置环境变量">3.2 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-集群配置">3.3 集群配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-安装包分发">3.4 安装包分发</a><br/>
<a href="#四启动集群">四、启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-启动ZooKeeper集群">4.1 启动ZooKeeper集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-启动Hadoop集群">4.2 启动Hadoop集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-启动Spark集群">4.3 启动Spark集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#44-查看服务">4.4 查看服务</a><br/>
<a href="#五验证集群高可用">五、验证集群高可用</a><br/>
<a href="#六提交作业">六、提交作业</a><br/>
</nav>
## 一、集群规划
这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 `Worker` 服务。同时为了保证高可用,除了在 hadoop001 上部署主 `Master` 服务外,还在 hadoop002 和 hadoop003 上分别部署备用的 `Master` 服务Master 服务由 Zookeeper 集群进行协调管理,如果主 `Master` 不可用,则备用 `Master` 会成为新的主 `Master`
![https://github.com/heibaiying](../../pictures/spark集群规划.png)
## 二、前置条件
搭建 Spark 集群前,需要保证 JDK 环境、Zookeeper 集群和 Hadoop 集群已经搭建,相关步骤可以参阅:
- [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
- [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
- [Hadoop 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop集群环境搭建.md)
## 三、Spark集群搭建
### 3.1 下载解压
下载所需版本的 Spark官网下载地址http://spark.apache.org/downloads.html
![https://github.com/heibaiying](../../pictures/spark-download.png)
下载后进行解压:
```shell
# tar -zxvf spark-2.2.3-bin-hadoop2.6.tgz
```
### 3.2 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export SPARK_HOME=/usr/app/spark-2.2.3-bin-hadoop2.6
export PATH=${SPARK_HOME}/bin:$PATH
```
使得配置的环境变量立即生效:
```shell
# source /etc/profile
```
### 3.3 集群配置
进入 `${SPARK_HOME}/conf` 目录,拷贝配置样本进行修改:
#### 1. spark-env.sh
```she
cp spark-env.sh.template spark-env.sh
```
```shell
# 配置JDK安装位置
JAVA_HOME=/usr/java/jdk1.8.0_201
# 配置hadoop配置文件的位置
HADOOP_CONF_DIR=/usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop
# 配置zookeeper地址
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop001:2181,hadoop002:2181,hadoop003:2181 -Dspark.deploy.zookeeper.dir=/spark"
```
#### 2. slaves
```
cp slaves.template slaves
```
配置所有 Woker 节点的位置:
```properties
hadoop001
hadoop002
hadoop003
```
### 3.4 安装包分发
将 Spark 的安装包分发到其他服务器,分发后建议在这两台服务器上也配置一下 Spark 的环境变量。
```shell
scp -r /usr/app/spark-2.4.0-bin-hadoop2.6/ hadoop002:usr/app/
scp -r /usr/app/spark-2.4.0-bin-hadoop2.6/ hadoop003:usr/app/
```
## 四、启动集群
### 4.1 启动ZooKeeper集群
分别到三台服务器上启动 ZooKeeper 服务:
```shell
zkServer.sh start
```
### 4.2 启动Hadoop集群
```shell
# 启动dfs服务
start-dfs.sh
# 启动yarn服务
start-yarn.sh
```
### 4.3 启动Spark集群
进入 hadoop001 的 ` ${SPARK_HOME}/sbin` 目录下,执行下面命令启动集群。执行命令后,会在 hadoop001 上启动 `Maser` 服务,会在 `slaves` 配置文件中配置的所有节点上启动 `Worker` 服务。
```shell
start-all.sh
```
分别在 hadoop002 和 hadoop003 上执行下面的命令,启动备用的 `Master` 服务:
```shell
# ${SPARK_HOME}/sbin 下执行
start-master.sh
```
### 4.4 查看服务
查看 Spark 的 Web-UI 页面,端口为 `8080`。此时可以看到 hadoop001 上的 Master 节点处于 `ALIVE` 状态,并有 3 个可用的 `Worker` 节点。
![https://github.com/heibaiying](../../pictures/spark-集群搭建1.png)
而 hadoop002 和 hadoop003 上的 Master 节点均处于 `STANDBY` 状态,没有可用的 `Worker` 节点。
![https://github.com/heibaiying](../../pictures/spark-集群搭建2.png)
![https://github.com/heibaiying](../../pictures/spark-集群搭建3.png)
## 五、验证集群高可用
此时可以使用 `kill` 命令杀死 hadoop001 上的 `Master` 进程,此时备用 `Master` 会中会有一个再次成为 ` 主 Master`,我这里是 hadoop002可以看到 hadoop2 上的 `Master` 经过 `RECOVERING` 后成为了新的主 `Master`,并且获得了全部可以用的 `Workers`
![https://github.com/heibaiying](../../pictures/spark-集群搭建4.png)
Hadoop002 上的 `Master` 成为主 `Master`,并获得了全部可以用的 `Workers`
![https://github.com/heibaiying](../../pictures/spark-集群搭建5.png)
此时如果你再在 hadoop001 上使用 `start-master.sh` 启动 Master 服务,那么其会作为备用 `Master` 存在。
## 六、提交作业
和单机环境下的提交到 Yarn 上的命令完全一致,这里以 Spark 内置的计算 Pi 的样例程序为例,提交命令如下:
```shell
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 1G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100
```

View File

@@ -0,0 +1,81 @@
# Storm单机版本环境搭建
### 1. 安装环境要求
> you need to install Storm's dependencies on Nimbus and the worker machines. These are:
>
> 1. Java 7+ (Apache Storm 1.x is tested through travis ci against both java 7 and java 8 JDKs)
> 2. Python 2.6.6 (Python 3.x should work too, but is not tested as part of our CI enviornment)
按照[官方文档](http://storm.apache.org/releases/1.2.2/Setting-up-a-Storm-cluster.html) 的说明storm 运行依赖于 Java 7+ 和 Python 2.6.6 +,所以需要预先安装这两个软件。由于这两个软件在多个框架中都有依赖,其安装步骤单独整理至
+ [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
+ [Linux 环境下 Python 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下Python安装.md)
### 2. 下载并解压
下载并解压官方下载地址http://storm.apache.org/downloads.html
```shell
# tar -zxvf apache-storm-1.2.2.tar.gz
```
### 3. 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export STORM_HOME=/usr/app/apache-storm-1.2.2
export PATH=$STORM_HOME/bin:$PATH
```
使得配置的环境变量生效:
```shell
# source /etc/profile
```
### 4. 启动相关进程
因为要启动多个进程,所以统一采用后台进程的方式启动。进入到 `${STORM_HOME}/bin` 目录下,依次执行下面的命令:
```shell
# 启动zookeeper
nohup sh storm dev-zookeeper &
# 启动主节点 nimbus
nohup sh storm nimbus &
# 启动从节点 supervisor
nohup sh storm supervisor &
# 启动UI界面 ui
nohup sh storm ui &
# 启动日志查看服务 logviewer
nohup sh storm logviewer &
```
### 5. 验证是否启动成功
验证方式一jps 查看进程:
```shell
[root@hadoop001 app]# jps
1074 nimbus
1283 Supervisor
620 dev_zookeeper
1485 core
9630 logviewer
```
验证方式二: 访问 8080 端口,查看 Web-UI 界面:
![https://github.com/heibaiying](../../pictures/storm-web-ui.png)

View File

@@ -0,0 +1,167 @@
# Storm集群环境搭建
<nav>
<a href="#一集群规划">一、集群规划</a><br/>
<a href="#二前置条件">二、前置条件</a><br/>
<a href="#三集群搭建">三、集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-下载并解压">1. 下载并解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-配置环境变量">2. 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#3-集群配置">3. 集群配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#4-安装包分发">4. 安装包分发</a><br/>
<a href="#四-启动集群">四. 启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-启动ZooKeeper集群">4.1 启动ZooKeeper集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-启动Storm集群">4.2 启动Storm集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-查看集群">4.3 查看集群</a><br/>
<a href="#五高可用验证">五、高可用验证</a><br/>
</nav>
## 一、集群规划
这里搭建一个 3 节点的 Storm 集群:三台主机上均部署 `Supervisor``LogViewer` 服务。同时为了保证高可用,除了在 hadoop001 上部署主 `Nimbus` 服务外,还在 hadoop002 上部署备用的 `Nimbus` 服务。`Nimbus` 服务由 Zookeeper 集群进行协调管理,如果主 `Nimbus` 不可用,则备用 `Nimbus` 会成为新的主 `Nimbus`
![https://github.com/heibaiying](../../pictures/storm-集群规划.png)
## 二、前置条件
Storm 运行依赖于 Java 7+ 和 Python 2.6.6 +,所以需要预先安装这两个软件。同时为了保证高可用,这里我们不采用 Storm 内置的 Zookeeper而采用外置的 Zookeeper 集群。由于这三个软件在多个框架中都有依赖,其安装步骤单独整理至
- [Linux 环境下 JDK 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
- [Linux 环境下 Python 安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下Python安装.md)
- [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
## 三、集群搭建
### 1. 下载并解压
下载安装包之后进行解压。官方下载地址http://storm.apache.org/downloads.html
```shell
# 解压
tar -zxvf apache-storm-1.2.2.tar.gz
```
### 2. 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export STORM_HOME=/usr/app/apache-storm-1.2.2
export PATH=$STORM_HOME/bin:$PATH
```
使得配置的环境变量生效:
```shell
# source /etc/profile
```
### 3. 集群配置
修改 `${STORM_HOME}/conf/storm.yaml` 文件,配置如下:
```yaml
# Zookeeper集群的主机列表
storm.zookeeper.servers:
- "hadoop001"
- "hadoop002"
- "hadoop003"
# Nimbus的节点列表
nimbus.seeds: ["hadoop001","hadoop002"]
# Nimbus和Supervisor需要使用本地磁盘上来存储少量状态如jar包配置文件等
storm.local.dir: "/home/storm"
# workers进程的端口每个worker进程会使用一个端口来接收消息
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
```
`supervisor.slots.ports` 参数用来配置 workers 进程接收消息的端口,默认每个 supervisor 节点上会启动 4 个 worker当然你也可以按照自己的需要和服务器性能进行设置假设只想启动 2 个 worker 的话,此处配置 2 个端口即可。
### 4. 安装包分发
将 Storm 的安装包分发到其他服务器,分发后建议在这两台服务器上也配置一下 Storm 的环境变量。
```shell
scp -r /usr/app/apache-storm-1.2.2/ root@hadoop002:/usr/app/
scp -r /usr/app/apache-storm-1.2.2/ root@hadoop003:/usr/app/
```
## 四. 启动集群
### 4.1 启动ZooKeeper集群
分别到三台服务器上启动 ZooKeeper 服务:
```shell
zkServer.sh start
```
### 4.2 启动Storm集群
因为要启动多个进程,所以统一采用后台进程的方式启动。进入到 `${STORM_HOME}/bin` 目录下,执行下面的命令:
**hadoop001 & hadoop002 **
```shell
# 启动主节点 nimbus
nohup sh storm nimbus &
# 启动从节点 supervisor
nohup sh storm supervisor &
# 启动UI界面 ui
nohup sh storm ui &
# 启动日志查看服务 logviewer
nohup sh storm logviewer &
```
**hadoop003 **
hadoop003 上只需要启动 `supervisor` 服务和 `logviewer` 服务:
```shell
# 启动从节点 supervisor
nohup sh storm supervisor &
# 启动日志查看服务 logviewer
nohup sh storm logviewer &
```
### 4.3 查看集群
使用 `jps` 查看进程,三台服务器的进程应该分别如下:
![https://github.com/heibaiying](../../pictures/storm-集群-shell.png)
<br/>
访问 hadoop001 或 hadoop002 的 `8080` 端口,界面如下。可以看到有一主一备 2 个 `Nimbus` 和 3 个 `Supervisor`,并且每个 `Supervisor` 有四个 `slots`,即四个可用的 `worker` 进程,此时代表集群已经搭建成功。
![https://github.com/heibaiying](../../pictures/storm-集群搭建1.png)
## 五、高可用验证
这里手动模拟主 `Nimbus` 异常的情况,在 hadoop001 上使用 `kill` 命令杀死 `Nimbus` 的线程,此时可以看到 hadoop001 上的 `Nimbus` 已经处于 `offline` 状态,而 hadoop002 上的 `Nimbus` 则成为新的 `Leader`
![https://github.com/heibaiying](../../pictures/storm集群搭建2.png)

View File

@@ -0,0 +1,187 @@
# Zookeeper单机环境和集群环境搭建
<nav>
<a href="#一单机环境搭建">一、单机环境搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#11-下载">1.1 下载</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-解压">1.2 解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#13-配置环境变量">1.3 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#14-修改配置">1.4 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#15-启动">1.5 启动</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#16-验证">1.6 验证</a><br/>
<a href="#二集群环境搭建">二、集群环境搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-修改配置">2.1 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-标识节点">2.2 标识节点</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-启动集群">2.3 启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-集群验证">2.4 集群验证</a><br/>
</nav>
## 一、单机环境搭建
### 1.1 下载
下载对应版本 Zookeeper这里我下载的版本 `3.4.14`。官方下载地址https://archive.apache.org/dist/zookeeper/
```shell
# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
```
### 1.2 解压
```shell
# tar -zxvf zookeeper-3.4.14.tar.gz
```
### 1.3 配置环境变量
```shell
# vim /etc/profile
```
添加环境变量:
```shell
export ZOOKEEPER_HOME=/usr/app/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH
```
使得配置的环境变量生效:
```shell
# source /etc/profile
```
### 1.4 修改配置
进入安装目录的 `conf/` 目录下,拷贝配置样本并进行修改:
```
# cp zoo_sample.cfg zoo.cfg
```
指定数据存储目录和日志文件目录(目录不用预先创建,程序会自动创建),修改后完整配置如下:
```properties
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
```
>配置参数说明:
>
>- **tickTime**:用于计算的基础时间单元。比如 session 超时N*tickTime
>- **initLimit**:用于集群,允许从节点连接并同步到 master 节点的初始化连接时间,以 tickTime 的倍数来表示;
>- **syncLimit**:用于集群, master 主节点与从节点之间发送消息,请求和应答时间长度(心跳机制);
>- **dataDir**:数据存储位置;
>- **dataLogDir**:日志目录;
>- **clientPort**:用于客户端连接的端口,默认 2181
### 1.5 启动
由于已经配置过环境变量,直接使用下面命令启动即可:
```
zkServer.sh start
```
### 1.6 验证
使用 JPS 验证进程是否已经启动,出现 `QuorumPeerMain` 则代表启动成功。
```shell
[root@hadoop001 bin]# jps
3814 QuorumPeerMain
```
## 二、集群环境搭建
为保证集群高可用Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里演示搭建一个三个节点的集群。这里我使用三台主机进行搭建,主机名分别为 hadoop001hadoop002hadoop003。
### 2.1 修改配置
解压一份 zookeeper 安装包,修改其配置文件 `zoo.cfg`,内容如下。之后使用 scp 命令将安装包分发到三台服务器上:
```shell
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-cluster/data/
dataLogDir=/usr/local/zookeeper-cluster/log/
clientPort=2181
# server.1 这个1是服务器的标识可以是任意有效数字标识这是第几个服务器节点这个标识要写到dataDir目录下面myid文件里
# 指名集群间通讯端口和选举端口
server.1=hadoop001:2287:3387
server.2=hadoop002:2287:3387
server.3=hadoop003:2287:3387
```
### 2.2 标识节点
分别在三台主机的 `dataDir` 目录下新建 `myid` 文件,并写入对应的节点标识。Zookeeper 集群通过 `myid` 文件识别集群节点,并通过上文配置的节点通信端口和选举端口来进行节点通信,选举出 Leader 节点。
创建存储目录:
```shell
# 三台主机均执行该命令
mkdir -vp /usr/local/zookeeper-cluster/data/
```
创建并写入节点标识到 `myid` 文件:
```shell
# hadoop001主机
echo "1" > /usr/local/zookeeper-cluster/data/myid
# hadoop002主机
echo "2" > /usr/local/zookeeper-cluster/data/myid
# hadoop003主机
echo "3" > /usr/local/zookeeper-cluster/data/myid
```
### 2.3 启动集群
分别在三台主机上,执行如下命令启动服务:
```shell
/usr/app/zookeeper-cluster/zookeeper/bin/zkServer.sh start
```
### 2.4 集群验证
启动后使用 `zkServer.sh status` 查看集群各个节点状态。如图所示:三个节点进程均启动成功,并且 hadoop002 为 leader 节点hadoop001 和 hadoop003 为 follower 节点。
![https://github.com/heibaiying](../../pictures/zookeeper-hadoop001.png)
![https://github.com/heibaiying](../../pictures/zookeeper-hadoop002.png)
![https://github.com/heibaiying](../../pictures/zookeeper-hadoop003.png)

View File

@@ -0,0 +1,514 @@
# 基于ZooKeeper搭建Hadoop高可用集群
<nav>
<a href="#一高可用简介">一、高可用简介</a><br/>
<a href="#二集群规划">二、集群规划</a><br/>
<a href="#三前置条件">三、前置条件</a><br/>
<a href="#四集群配置">四、集群配置</a><br/>
<a href="#五启动集群">五、启动集群</a><br/>
<a href="#六查看集群">六、查看集群</a><br/>
<a href="#七集群的二次启动">七、集群的二次启动</a><br/>
</nav>
## 一、高可用简介
Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解:
### 1.1 高可用整体架构
HDFS 高可用架构如下:
![https://github.com/heibaiying](../../pictures/HDFS-HA-Architecture-Edureka.png)
> *图片引用自https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/*
HDFS 高可用架构主要由以下组件所构成:
+ **Active NameNode 和 Standby NameNode**:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode另外一台处于 Standby 状态,为备 NameNode只有主 NameNode 才能对外提供读写服务。
+ **主备切换控制器 ZKFailoverController**ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
+ **Zookeeper 集群**:为主备切换控制器提供主备选举支持。
+ **共享存储系统**:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
+ **DataNode 节点**:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
### 1.2 基于 QJM 的共享存储系统的数据同步机制分析
目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作为共享的存储系统,这里以 QJM 集群为例进行说明Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。
需要说明的是向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以你至少要有 3 个 JournalNode 节点,当然你也可以继续增加节点数量,但是应该保证节点总数是奇数。同时如果有 2N+1 台 JournalNode那么根据过半写的原则最多可以容忍有 N 台 JournalNode 节点挂掉。
![https://github.com/heibaiying](../../pictures/hadoop-QJM-同步机制.png)
### 1.3 NameNode 主备切换
NameNode 实现主备切换的流程下图所示:
![https://github.com/heibaiying](../../pictures/hadoop-namenode主备切换.png)
1. HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。
2. HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。
3. 如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。
4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。
5. ActiveStandbyElector 在主备选举完成后,会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。
6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。
### 1.4 YARN高可用
YARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。
![https://github.com/heibaiying](../../pictures/hadoop-rm-ha-overview.png)
## 二、集群规划
按照高可用的设计目标:需要保证至少有两个 NameNode (一主一备) 和 两个 ResourceManager (一主一备) ,同时为满足“过半写入则成功”的原则,需要至少要有 3 个 JournalNode 节点。这里使用三台主机进行搭建,集群规划如下:
![https://github.com/heibaiying](../../pictures/hadoop高可用集群规划.png)
## 三、前置条件
+ 所有服务器都安装有 JDK安装步骤可以参见[Linux 下 JDK 的安装](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下JDK安装.md)
+ 搭建好 ZooKeeper 集群,搭建步骤可以参见:[Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
+ 所有服务器之间都配置好 SSH 免密登录。
## 四、集群配置
### 4.1 下载并解压
下载 Hadoop。这里我下载的是 CDH 版本 Hadoop下载地址为http://archive.cloudera.com/cdh5/cdh/5/
```shell
# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz
```
### 4.2 配置环境变量
编辑 `profile` 文件:
```shell
# vim /etc/profile
```
增加如下配置:
```
export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2
export PATH=${HADOOP_HOME}/bin:$PATH
```
执行 `source` 命令,使得配置立即生效:
```shell
# source /etc/profile
```
### 4.3 修改配置
进入 `${HADOOP_HOME}/etc/hadoop` 目录下,修改配置文件。各个配置文件内容如下:
#### 1. hadoop-env.sh
```shell
# 指定JDK的安装位置
export JAVA_HOME=/usr/java/jdk1.8.0_201/
```
#### 2. core-site.xml
```xml
<configuration>
<property>
<!-- 指定 namenode 的 hdfs 协议文件系统的通信地址 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:8020</value>
</property>
<property>
<!-- 指定 hadoop 集群存储临时文件的目录 -->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<!-- ZooKeeper 集群的地址 -->
<name>ha.zookeeper.quorum</name>
<value>hadoop001:2181,hadoop002:2181,hadoop002:2181</value>
</property>
<property>
<!-- ZKFC 连接到 ZooKeeper 超时时长 -->
<name>ha.zookeeper.session-timeout.ms</name>
<value>10000</value>
</property>
</configuration>
```
#### 3. hdfs-site.xml
```xml
<configuration>
<property>
<!-- 指定 HDFS 副本的数量 -->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!-- namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/namenode/data</value>
</property>
<property>
<!-- datanode 节点数据(即数据块)的存放位置 -->
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/datanode/data</value>
</property>
<property>
<!-- 集群服务的逻辑名称 -->
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<!-- NameNode ID 列表-->
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<!-- nn1 的 RPC 通信地址 -->
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop001:8020</value>
</property>
<property>
<!-- nn2 的 RPC 通信地址 -->
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop002:8020</value>
</property>
<property>
<!-- nn1 的 http 通信地址 -->
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop001:50070</value>
</property>
<property>
<!-- nn2 的 http 通信地址 -->
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop002:50070</value>
</property>
<property>
<!-- NameNode 元数据在 JournalNode 上的共享存储目录 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
</property>
<property>
<!-- Journal Edit Files 的存储目录 -->
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journalnode/data</value>
</property>
<property>
<!-- 配置隔离机制,确保在任何给定时间只有一个 NameNode 处于活动状态 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- 使用 sshfence 机制时需要 ssh 免密登录 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!-- SSH 超时时间 -->
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<!-- 访问代理类,用于确定当前处于 Active 状态的 NameNode -->
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 开启故障自动转移 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
```
#### 4. yarn-site.xml
```xml
<configuration>
<property>
<!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 是否启用日志聚合 (可选) -->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!-- 聚合日志的保存时间 (可选) -->
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<property>
<!-- 启用 RM HA -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- RM 集群标识 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>my-yarn-cluster</value>
</property>
<property>
<!-- RM 的逻辑 ID 列表 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- RM1 的服务地址 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop002</value>
</property>
<property>
<!-- RM2 的服务地址 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop003</value>
</property>
<property>
<!-- RM1 Web 应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop002:8088</value>
</property>
<property>
<!-- RM2 Web 应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop003:8088</value>
</property>
<property>
<!-- ZooKeeper 集群的地址 -->
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
</property>
<property>
<!-- 启用自动恢复 -->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!-- 用于进行持久化存储的类 -->
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
```
#### 5. mapred-site.xml
```xml
<configuration>
<property>
<!--指定 mapreduce 作业运行在 yarn 上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
```
#### 5. slaves
配置所有从属节点的主机名或 IP 地址,每行一个。所有从属节点上的 `DataNode` 服务和 `NodeManager` 服务都会被启动。
```properties
hadoop001
hadoop002
hadoop003
```
### 4.4 分发程序
将 Hadoop 安装包分发到其他两台服务器,分发后建议在这两台服务器上也配置一下 Hadoop 的环境变量。
```shell
# 将安装包分发到hadoop002
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
# 将安装包分发到hadoop003
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/
```
## 五、启动集群
### 5.1 启动ZooKeeper
分别到三台服务器上启动 ZooKeeper 服务:
```ssh
zkServer.sh start
```
### 5.2 启动Journalnode
分别到三台服务器的的 `${HADOOP_HOME}/sbin` 目录下,启动 `journalnode` 进程:
```shell
hadoop-daemon.sh start journalnode
```
### 5.3 初始化NameNode
`hadop001` 上执行 `NameNode` 初始化命令:
```
hdfs namenode -format
```
执行初始化命令后,需要将 `NameNode` 元数据目录的内容,复制到其他未格式化的 `NameNode` 上。元数据存储目录就是我们在 `hdfs-site.xml` 中使用 `dfs.namenode.name.dir` 属性指定的目录。这里我们需要将其复制到 `hadoop002` 上:
```shell
scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/
```
### 5.4 初始化HA状态
在任意一台 `NameNode` 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:
```shell
hdfs zkfc -formatZK
```
### 5.5 启动HDFS
进入到 `hadoop001``${HADOOP_HOME}/sbin` 目录下,启动 HDFS。此时 `hadoop001``hadoop002` 上的 `NameNode` 服务,和三台服务器上的 `DataNode` 服务都会被启动:
```shell
start-dfs.sh
```
### 5.6 启动YARN
进入到 `hadoop002``${HADOOP_HOME}/sbin` 目录下,启动 YARN。此时 `hadoop002` 上的 `ResourceManager` 服务,和三台服务器上的 `NodeManager` 服务都会被启动:
```SHEll
start-yarn.sh
```
需要注意的是,这个时候 `hadoop003` 上的 `ResourceManager` 服务通常是没有启动的,需要手动启动:
```shell
yarn-daemon.sh start resourcemanager
```
## 六、查看集群
### 6.1 查看进程
成功启动后,每台服务器上的进程应该如下:
```shell
[root@hadoop001 sbin]# jps
4512 DFSZKFailoverController
3714 JournalNode
4114 NameNode
3668 QuorumPeerMain
5012 DataNode
4639 NodeManager
[root@hadoop002 sbin]# jps
4499 ResourceManager
4595 NodeManager
3465 QuorumPeerMain
3705 NameNode
3915 DFSZKFailoverController
5211 DataNode
3533 JournalNode
[root@hadoop003 sbin]# jps
3491 JournalNode
3942 NodeManager
4102 ResourceManager
4201 DataNode
3435 QuorumPeerMain
```
### 6.2 查看Web UI
HDFS 和 YARN 的端口号分别为 `50070``8080`,界面应该如下:
此时 hadoop001 上的 `NameNode` 处于可用状态:
![https://github.com/heibaiying](../../pictures/hadoop高可用集群1.png)
而 hadoop002 上的 `NameNode` 则处于备用状态:
<br/>
![https://github.com/heibaiying](../../pictures/hadoop高可用集群3.png)
<br/>
hadoop002 上的 `ResourceManager` 处于可用状态:
<br/>
![https://github.com/heibaiying](../../pictures/hadoop高可用集群4.png)
<br/>
hadoop003 上的 `ResourceManager` 则处于备用状态:
<br/>
![https://github.com/heibaiying](../../pictures/hadoop高可用集群5.png)
<br/>
同时界面上也有 `Journal Manager` 的相关信息:
<br/>
![https://github.com/heibaiying](../../pictures/hadoop高可用集群2.png)
## 七、集群的二次启动
上面的集群初次启动涉及到一些必要初始化操作,所以过程略显繁琐。但是集群一旦搭建好后,想要再次启用它是比较方便的,步骤如下(首选需要确保 ZooKeeper 集群已经启动):
` hadoop001` 启动 HDFS此时会启动所有与 HDFS 高可用相关的服务,包括 NameNodeDataNode 和 JournalNode
```shell
start-dfs.sh
```
`hadoop002` 启动 YARN
```SHEll
start-yarn.sh
```
这个时候 `hadoop003` 上的 `ResourceManager` 服务通常还是没有启动的,需要手动启动:
```shell
yarn-daemon.sh start resourcemanager
```
## 参考资料
以上搭建步骤主要参考自官方文档:
+ [HDFS High Availability Using the Quorum Journal Manager](https://hadoop.apache.org/docs/r3.1.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html)
+ [ResourceManager High Availability](https://hadoop.apache.org/docs/r3.1.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html)
关于 Hadoop 高可用原理的详细分析,推荐阅读:
[Hadoop NameNode 高可用 (High Availability) 实现解析](https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/index.html)

View File

@@ -0,0 +1,239 @@
# 基于Zookeeper搭建Kafka高可用集群
<nav>
<a href="#一Zookeeper集群搭建">一、Zookeeper集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#11-下载--解压">1.1 下载 & 解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-修改配置">1.2 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#13-标识节点">1.3 标识节点</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#14-启动集群">1.4 启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#15-集群验证">1.5 集群验证</a><br/>
<a href="#二Kafka集群搭建">二、Kafka集群搭建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-下载解压">2.1 下载解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-拷贝配置文件">2.2 拷贝配置文件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-修改配置">2.3 修改配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-启动集群">2.4 启动集群</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#25-创建测试主题">2.5 创建测试主题</a><br/>
</nav>
## 一、Zookeeper集群搭建
为保证集群高可用Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群。
### 1.1 下载 & 解压
下载对应版本 Zookeeper这里我下载的版本 `3.4.14`。官方下载地址https://archive.apache.org/dist/zookeeper/
```shell
# 下载
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
# 解压
tar -zxvf zookeeper-3.4.14.tar.gz
```
### 1.2 修改配置
拷贝三份 zookeeper 安装包。分别进入安装目录的 `conf` 目录,拷贝配置样本 `zoo_sample.cfg ``zoo.cfg` 并进行修改,修改后三份配置文件内容分别如下:
zookeeper01 配置:
```shell
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-cluster/data/01
dataLogDir=/usr/local/zookeeper-cluster/log/01
clientPort=2181
# server.1 这个1是服务器的标识可以是任意有效数字标识这是第几个服务器节点这个标识要写到dataDir目录下面myid文件里
# 指名集群间通讯端口和选举端口
server.1=127.0.0.1:2287:3387
server.2=127.0.0.1:2288:3388
server.3=127.0.0.1:2289:3389
```
> 如果是多台服务器则集群中每个节点通讯端口和选举端口可相同IP 地址修改为每个节点所在主机 IP 即可。
zookeeper02 配置,与 zookeeper01 相比,只有 `dataLogDir``dataLogDir` 不同:
```shell
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-cluster/data/02
dataLogDir=/usr/local/zookeeper-cluster/log/02
clientPort=2182
server.1=127.0.0.1:2287:3387
server.2=127.0.0.1:2288:3388
server.3=127.0.0.1:2289:3389
```
zookeeper03 配置,与 zookeeper0102 相比,也只有 `dataLogDir``dataLogDir` 不同:
```shell
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-cluster/data/03
dataLogDir=/usr/local/zookeeper-cluster/log/03
clientPort=2183
server.1=127.0.0.1:2287:3387
server.2=127.0.0.1:2288:3388
server.3=127.0.0.1:2289:3389
```
> 配置参数说明:
>
> - **tickTime**:用于计算的基础时间单元。比如 session 超时N*tickTime
> - **initLimit**:用于集群,允许从节点连接并同步到 master 节点的初始化连接时间,以 tickTime 的倍数来表示;
> - **syncLimit**:用于集群, master 主节点与从节点之间发送消息,请求和应答时间长度(心跳机制);
> - **dataDir**:数据存储位置;
> - **dataLogDir**:日志目录;
> - **clientPort**:用于客户端连接的端口,默认 2181
### 1.3 标识节点
分别在三个节点的数据存储目录下新建 `myid` 文件,并写入对应的节点标识。Zookeeper 集群通过 `myid` 文件识别集群节点,并通过上文配置的节点通信端口和选举端口来进行节点通信,选举出 leader 节点。
创建存储目录:
```shell
# dataDir
mkdir -vp /usr/local/zookeeper-cluster/data/01
# dataDir
mkdir -vp /usr/local/zookeeper-cluster/data/02
# dataDir
mkdir -vp /usr/local/zookeeper-cluster/data/03
```
创建并写入节点标识到 `myid` 文件:
```shell
#server1
echo "1" > /usr/local/zookeeper-cluster/data/01/myid
#server2
echo "2" > /usr/local/zookeeper-cluster/data/02/myid
#server3
echo "3" > /usr/local/zookeeper-cluster/data/03/myid
```
### 1.4 启动集群
分别启动三个节点:
```shell
# 启动节点1
/usr/app/zookeeper-cluster/zookeeper01/bin/zkServer.sh start
# 启动节点2
/usr/app/zookeeper-cluster/zookeeper02/bin/zkServer.sh start
# 启动节点3
/usr/app/zookeeper-cluster/zookeeper03/bin/zkServer.sh start
```
### 1.5 集群验证
使用 jps 查看进程,并且使用 `zkServer.sh status` 查看集群各个节点状态。如图三个节点进程均启动成功,并且两个节点为 follower 节点,一个节点为 leader 节点。
![https://github.com/heibaiying](../../pictures/zookeeper-cluster.png)
## 二、Kafka集群搭建
### 2.1 下载解压
Kafka 安装包官方下载地址http://kafka.apache.org/downloads ,本用例下载的版本为 `2.2.0`,下载命令:
```shell
# 下载
wget https://www-eu.apache.org/dist/kafka/2.2.0/kafka_2.12-2.2.0.tgz
# 解压
tar -xzf kafka_2.12-2.2.0.tgz
```
>这里 j 解释一下 kafka 安装包的命名规则:以 `kafka_2.12-2.2.0.tgz` 为例,前面的 2.12 代表 Scala 的版本号Kafka 采用 Scala 语言进行开发),后面的 2.2.0 则代表 Kafka 的版本号。
### 2.2 拷贝配置文件
进入解压目录的 ` config` 目录下 ,拷贝三份配置文件:
```shell
# cp server.properties server-1.properties
# cp server.properties server-2.properties
# cp server.properties server-3.properties
```
### 2.3 修改配置
分别修改三份配置文件中的部分配置,如下:
server-1.properties
```properties
# The id of the broker. 集群中每个节点的唯一标识
broker.id=0
# 监听地址
listeners=PLAINTEXT://hadoop001:9092
# 数据的存储位置
log.dirs=/usr/local/kafka-logs/00
# Zookeeper连接地址
zookeeper.connect=hadoop001:2181,hadoop001:2182,hadoop001:2183
```
server-2.properties
```properties
broker.id=1
listeners=PLAINTEXT://hadoop001:9093
log.dirs=/usr/local/kafka-logs/01
zookeeper.connect=hadoop001:2181,hadoop001:2182,hadoop001:2183
```
server-3.properties
```properties
broker.id=2
listeners=PLAINTEXT://hadoop001:9094
log.dirs=/usr/local/kafka-logs/02
zookeeper.connect=hadoop001:2181,hadoop001:2182,hadoop001:2183
```
这里需要说明的是 `log.dirs` 指的是数据日志的存储位置,确切的说,就是分区数据的存储位置,而不是程序运行日志的位置。程序运行日志的位置是通过同一目录下的 `log4j.properties` 进行配置的。
### 2.4 启动集群
分别指定不同配置文件,启动三个 Kafka 节点。启动后可以使用 jps 查看进程,此时应该有三个 zookeeper 进程和三个 kafka 进程。
```shell
bin/kafka-server-start.sh config/server-1.properties
bin/kafka-server-start.sh config/server-2.properties
bin/kafka-server-start.sh config/server-3.properties
```
### 2.5 创建测试主题
创建测试主题:
```shell
bin/kafka-topics.sh --create --bootstrap-server hadoop001:9092 \
--replication-factor 3 \
--partitions 1 --topic my-replicated-topic
```
创建后可以使用以下命令查看创建的主题信息:
```shell
bin/kafka-topics.sh --describe --bootstrap-server hadoop001:9092 --topic my-replicated-topic
```
![https://github.com/heibaiying](../../pictures/kafka-cluster-shell.png)
可以看到分区 0 的有 0,1,2 三个副本,且三个副本都是可用副本,都在 ISR(in-sync Replica 同步副本) 列表中,其中 1 为首领副本,此时代表集群已经搭建成功。

View File

@@ -0,0 +1,118 @@
# 虚拟机静态IP及多IP配置
<nav>
<a href="#一虚拟机静态IP配置">一、虚拟机静态IP配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-编辑网络配置文件">1. 编辑网络配置文件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-重启网络服务">2. 重启网络服务</a><br/>
<a href="#二虚拟机多个静态IP配置">二、虚拟机多个静态IP配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-配置多网卡">1. 配置多网卡</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-查看网卡名称">2. 查看网卡名称</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#3-配置第二块网卡">3. 配置第二块网卡</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#4-重启网络服务器">4. 重启网络服务器</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#5-使用说明">5. 使用说明</a><br/>
</nav>
## 一、虚拟机静态IP配置
### 1. 编辑网络配置文件
```shell
# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
```
添加如下网络配置:
+ IPADDR 需要和宿主机同一个网段;
+ GATEWAY 保持和宿主机一致;
```properties
BOOTPROTO=static
IPADDR=192.168.0.107
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1
ONBOOT=yes
```
我的主机配置:
![https://github.com/heibaiying](../../pictures/ipconfig.png)
修改后完整配置如下:
```properties
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.0.107
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
BROADCAST=192.168.0.255
DNS1=192.168.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=03d45df1-8514-4774-9b47-fddd6b9d9fca
DEVICE=enp0s3
ONBOOT=yes
```
### 2. 重启网络服务
```shell
# systemctl restart network
```
## 二、虚拟机多个静态IP配置
如果一台虚拟机需要经常在不同网络环境使用,可以配置多个静态 IP。
### 1. 配置多网卡
这里我是用的虚拟机是 virtualBox开启多网卡配置方式如下
![https://github.com/heibaiying](../../pictures/virtualbox-multi-network.png)
### 2. 查看网卡名称
使用 `ifconfig`,查看第二块网卡名称,这里我的名称为 `enp0s8`
![https://github.com/heibaiying](../../pictures/mutli-net-ip.png)
### 3. 配置第二块网卡
开启多网卡后并不会自动生成配置文件,需要拷贝 `ifcfg-enp0s3` 进行修改:
```shell
# cp ifcfg-enp0s3 ifcfg-enp0s8
```
静态 IP 配置方法如上,这里不再赘述。除了静态 IP 参数外以下三个参数还需要修改UUID 必须与 `ifcfg-enp0s3` 中的不一样:
```properties
NAME=enp0s8
UUID=03d45df1-8514-4774-9b47-fddd6b9d9fcb
DEVICE=enp0s8
```
### 4. 重启网络服务器
```shell
# systemctl restart network
```
### 5. 使用说明
使用时只需要根据所处的网络环境,勾选对应的网卡即可,不使用的网卡尽量不要勾选启动。
![https://github.com/heibaiying](../../pictures/virtualbox启用网络.png)