8節點(hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用叢集詳細配置
配置 hadoop+yarn+hbase+storm+kafka+spark+zookeeper 高可用叢集,同時安裝相關組建:JDK,MySQL,Hive,Flume
環境介紹
節點介紹
-
虛擬機器數量:8 臺
-
作業系統版本:CentOS-7-x86_64-Minimal-1611.iso
每臺虛擬機器的配置如下:
虛擬機器名稱 | CPU核心數 | 記憶體(G) | 硬碟(G) | 網絡卡 |
---|---|---|---|---|
hadoop1 | 2 | 8 | 100 | 2 |
hadoop2 | 2 | 8 | 100 | 2 |
hadoop3 | 2 | 8 | 100 | 2 |
hadoop4 | 2 | 8 | 100 | 2 |
hadoop5 | 2 | 8 | 100 | 2 |
hadoop6 | 2 | 8 | 100 | 2 |
hadoop7 | 2 | 8 | 100 | 2 |
hadoop8 | 2 | 8 | 100 | 2 |
叢集介紹
8節點Hadoop+Yarn+Spark+Hbase+Kafka+Storm+ZooKeeper高可用叢集搭建:
叢集 | 虛擬機器節點 |
---|---|
HadoopHA叢集 | hadoop1,hadoop2,hadoop3,hadoop4,hadoop5,hadoop6,hadoop7,hadoop8 |
ZooKeeper叢集 | hadoop3,hadoop4,hadoop5 |
Hbase叢集 | hadoop3,hadoop4,hadoop5,hadoop6,hadoop7 |
Kafka叢集 | hadoop6,hadoop7,hadoop8 |
Storm叢集 | hadoop3,hadoop4,hadoop5,hadoop6,hadoop7 |
Spark叢集 | hadooop1,hadoop2,hadoop3,hadoop4,hadoop5,hadoop6,hadoop7,hadoop8 |
叢集詳細規劃:
虛擬機器名稱 | IP | 安裝軟體 | 程序 | 功能 |
---|---|---|---|---|
hadoop1 | 59.68.29.79 | jdk,hadoop,mysql | NameNode,ResourceManeger,DFSZKFailoverController(zkfc),master(spark) | hadoop的NameNode節點,spark的master節點,yarn的ResourceManeger節點 |
hadoop2 | 10.230.203.11 | jdk,hadoop,spark | NameNode,ResourceManeger,DFSZKFailoverController(zkfc),worker(spark) | hadoop(yarn)的容災節點 |
hadoop3 | 10.230.203.12 | jdk,hadoop,zookeeper,hbase,storm,spark | DataNode,NodeManager,journalnode,QuorumPeerMain(zk),HMaster,…(storm),worker(spark) | storm,hbase,zookeeper的主節點 |
hadoop4 | 10.230.203.13 | jdk,hadoop,zookeeper,hbase,storm,spark | DataNode,NodeManager,journalnode,QuorumPeerMain(zk),HRegionServer,…(storm),worker(spark) | |
hadoop5 | 10.230.203.14 | jdk,hadoop,zookeeper,hbase,storm,spark | DataNode,NodeManager,journalnode,QuorumPeerMain(zk),HRegionServer,…(storm),worker(spark) | |
hadoop6 | 10.230.203.15 | jdk,hadoop,hbase,storm,kafka,spark | DataNode,NodeManager,journalnode,kafka,HRegionServer,…(storm),worker(spark) | kafka的主節點 |
hadoop7 | 10.230.203.16 | jdk,hadoop,hbase,storm,kafka,spark | DataNode,NodeManager,journalnode,kafka,HRegionServer,…(storm),worker(spark) | |
hadoop8 | 10.230.203.17 | jdk,hadoop,kafka,spark | DataNode,NodeManager,journalnode,kafka,worker(spark) |
軟體版本介紹
-
JDK版本: jdk-8u65-linux-x64.tar.gz
-
hadoop版本: hadoop-2.7.6.tar.gz
-
zookeeper版本: zookeeper-3.4.12.tar.gz
-
hbase版本: hbase-1.2.6-bin.tar.gz
-
Storm版本: apache-storm-1.1.3.tar.gz
-
kafka版本: kafka_2.11-2.0.0.tgz
-
MySQL版本: mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
-
hive版本: apache-hive-2.3.3-bin.tar.gz
-
Flume版本: apache-flume-1.8.0-bin.tar.gz
-
Spark版本: spark-2.3.1-bin-hadoop2.7.tgz
前期準備
相關配置
每臺主機節點都進行相同設定
新建使用者 centos
千萬注意:不要在root許可權下配置叢集
- 新建 centos 使用者組
$> groupadd centos
- 新建使用者 centos,並將該使用者新增到使用者組 centos
$> useradd centos -g centos
- 為 centos 使用者設定密碼
$> passwd centos
新增sudo許可權
- 切換到root使用者,修改 /etc/sudoers 檔案
$> nano /etc/sudoers
新增如下語句:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
centos ALL=(ALL) ALL
更改使用者名稱
- 進入 /etc/hostname 下,將原來的內容刪除,新增新的使用者名稱
$> sudo nano /etc/hostname
使用者名稱:hadoop1,hadoop2.....
主機名與IP對映
- 進入 /etc/hosts,將原來的內容刪除,新增主機節點之間的相互對映
$> sudo nano /etc/hosts
新增內容如下:
127.0.0.1 localhost
59.68.29.79 hadoop1
10.230.203.11 hadoop2
10.230.203.12 hadoop3
10.230.203.13 hadoop4
10.230.203.14 hadoop5
10.230.203.15 hadoop6
10.230.203.16 hadoop7
10.230.203.17 hadoop8
顯示當前檔案的絕對路徑
命令:pwd。形如 ~ 轉換為 /home/centos。方便確定當前檔案的路徑
- 進入 /etc/profile 中進行配置
[centos@hadoop1 ~]$ sudo nano /etc/profile
在末尾新增:
export PS1='[\[email protected]\h `pwd`]\$'
// source /etc/profile 馬上生效
[centos@hadoop1 /home/centos]$
ssh免密登入
hadoop1 和 hadoop2 是容災節點(解決單點故障問題),所以這兩個主機除了能互相訪問之外,還需要登入其他主機節點,可以免密登入
- 檢查是否安裝了ssh相關軟體包(openssh-server + openssh-clients + openssh)
[centos@hadoop1 /home/centos]$ yum list installed | grep ssh
- 檢查是否啟動了sshd程序
[centos@hadoop1 /home/centos]$ ps -Af | grep sshd
- 在hadoop1~hadoop8主機節點的 ~(/home/centos) 目錄下建立 .ssh 檔案目錄,並修改許可權
[centos@hadoop1 /home/centos]$ mkdir .ssh
[centos@hadoop1 /home/centos]$ chmod 700 ~/.ssh
- 在hadoop1主機上生成祕鑰對,追加公鑰到~/.ssh/authorized_keys檔案中,並修改authorized_keys檔案的許可權為644(centos系統)
//生成祕鑰對
[centos@hadoop1 /home/centos]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
//進入 ~/.ssh 資料夾下
[centos@hadoop1 /home/centos]$ cd ~/.ssh
//追加公鑰到~/.ssh/authorized_keys檔案中
[centos@hadoop1 /home/centos/.ssh]$ cat id_rsa.pub >> authorized_keys
// 修改authorized_keys檔案的許可權為644
[centos@hadoop1 /home/centos/.ssh]$ chmod 644 authorized_keys
- 將hadoop1的公鑰檔案id_rsa.pub遠端複製給其他7臺主機節點,並放置在/home/centos/.ssh/authorized_keys下
//重名名
[centos@hadoop2 /home/centos/.ssh]$ mv id_rsa.pub id_rsa_hadoop1.pub
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop2:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop3:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop4:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop5:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop6:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop7:/home/centos/.ssh/authorized_keys
[centos@hadoop1 /home/centos/.ssh]$ scp id_rsa_hadoop1.pub centos@hadoop8:/home/centos/.ssh/authorized_keys
- 在hadoop2主機上生成祕鑰對。為了與hadoop1的公鑰區分,重新命名為 id_rsa_hadoop2.pub。追加公鑰到~/.ssh/authorized_keys檔案中,並分發給其他7臺主機節點
//生成祕鑰對
[centos@hadoop2 /home/centos]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
//重名名
[centos@hadoop2 /home/centos/.ssh]$ mv id_rsa.pub id_rsa_hadoop2.pub
//追加公鑰到~/.ssh/authorized_keys檔案中
[centos@hadoop1 /home/centos/.ssh]$ cat id_rsa_hadoop2.pub >> authorized_keys
//將authorized_keys分發給其他節點
[centos@hadoop1 /home/centos/.ssh]$ scp authorized_keys centos@hadoop:/home/centos/.ssh/
... 分發給其他節點
關閉防火牆
為了保證叢集正常啟動,先要關閉各臺主機的防火牆,一些命令如下:
[cnetos 6.5之前的版本]
$>sudo service firewalld stop //停止服務
$>sudo service firewalld start //啟動服務
$>sudo service firewalld status //檢視狀態
[centos7]
$>sudo systemctl enable firewalld.service //"開機啟動"啟用
$>sudo systemctl disable firewalld.service //"開機自啟"禁用
$>sudo systemctl start firewalld.service //啟動防火牆
$>sudo systemctl stop firewalld.service //停止防火牆
$>sudo systemctl status firewalld.service //檢視防火牆狀態
[開機自啟]
$>sudo chkconfig firewalld on //"開啟自啟"啟用
$>sudo chkconfig firewalld off //"開啟自啟"禁用
兩個批處理指令碼
提示:為了全域性可用,指令碼都放在 /usr/local/bin 目錄下。只在hadoop1和hadoop2節點配置
//以本地使用者身份建立xcall.sh
$>touch ~/xcall.sh //centos
//將其複製到 /usr/local/bin 目錄下
$>sudo mv xcall.sh /usr/local/bin
//修改許可權
$>sudo chmod a+x xcall.sh
//新增指令碼
$>sudo nano xcall.sh
#!/bin/bash
params=[email protected]
i=1
for (( i=1 ; i <= 8 ; i = $i + 1 )) ; do
echo ============= s$i $params =============
ssh hadoop$i "$params"
done
批同步指令碼(xsync.sh):類似於 scp 指令
#!/bin/bash
if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi
p=$1
#echo p=$p
dir=`dirname $p`
#echo dir=$dir
filename=`basename $p`
#echo filename=$filename
cd $dir
fullpath=`pwd -P .`
#echo fullpath=$fullpath
user=`whoami`
for (( i = 1 ; i <= 8 ; i = $i + 1 )) ; do
echo ======= hadoop$i =======
rsync -lr $p ${user}@hadoop$i:$fullpath
done ;
叢集環境搭建
安裝JDK
-
準備JDK:jdk-8u65-linux-x64.tar.gz,將其上傳到主機hadoop1的 /home/centos/localsoft 目錄下,該目錄用於存放所有需要安裝的軟體安裝包
-
在根目錄下(/)新建一個 soft 資料夾,並將該資料夾的使用者組許可權和使用者許可權改為 centos,該資料夾下為所有需要安裝的軟體
//建立soft資料夾
[centos@hadoop1 /home/centos]$ sudo mkdir /soft
//修改許可權(centosmin0是自己的本機使用者名稱)
[centos@hadoop1 /home/centos]$ sudo chown centos:centos /soft
- 解壓 jdk-8u65-linux-x64.tar.gz 到 /soft 目錄下,並建立符號連結
// 從 /home/centos/localsoft 下解壓到 /soft
[centos@hadoop1 /home/centos/localsoft]$ tar -xzvf jdk-8u65-linux-x64.tar.gz -C /soft
// 建立符號連結
[centos@hadoop1 /soft]$ ln -s /soft/jdk1.8.0_65 jdk
- 在 /etc/profile 檔案中配置環境變數,同時 source /etc/profile,使其立即生效
// 進入profile
[centos@hadoop1 /home/centos]$ sudo nano /etc/profile
// 環境變數
# jdk
export JAVA_HOME=/soft/jdk
export PATH=$PATH:$JAVA_HOME/bin
// source 立即生效
[centos@hadoop1 /home/centos]$ source /etc/profile
- 檢驗是否安裝配置成功
[centos@hadoop1 /home/centos]$ java -version
// 顯示如下
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
- 按照以上步驟配置其他主句(hadoop2~hadoop8):可以使用批分發指令(xsync.sh分發檔案給其他7臺主機節點)
Hadoop安裝配置(手動HA搭建)
1. hadoop安裝配置
- 準備hadoop:hadoop-2.7.6.tar.gz,解壓到 /soft 目錄下,建立符號連結
// 從 /home/centos/localsoft 下解壓到 /soft
[centos@hadoop1 /home/centos/localsoft]$ tar -xzvf hadoop-2.7.6.tar.gz -C /soft
// 建立符號連結
[centos@hadoop1 /soft]$ ln -s /soft/hadoop-2.7.6 hadoop
- 在 /etc/profile 下配置環境變數,source /etc/profile 立即生效,使用 hadoop version 檢測是否安裝成功
// 進入profile
[centos@hadoop1 /home/centos]$ sudo nano /etc/profile
// 環境變數
# hadoop
export HADOOP_HOME=/soft/hadoop
export PATH=$PATH:$HADOOP_HOME/bin/:$HADOOP_HOME/sbin
// source 立即生效
[centos@hadoop1 /home/centos]$ source /etc/profilea
// 檢測是否安裝成功
[centos@hadoop1 /home/centos]$ hadoop version
顯示如下:
Hadoop 2.7.6
Subversion https://shv@git-wip-us.apache.org/repos/asf/hadoop.git -r 085099c66cf28be31604560c376fa282e69282b8
Compiled by kshvachk on 2018-04-18T01:33Z
Compiled with protoc 2.5.0
From source with checksum 71e2695531cb3360ab74598755d036
This command was run using /soft/hadoop-2.7.6/share/hadoop/common/hadoop-common-2.7.6.jar
提示: 現在的操作在hadoop1節點上,先不用在其他節點進行安裝配置,等後續配置結束後再一起將配置傳給其他節點,能大大節省工作量。
2. hadoop手動NameNode HA搭建
基於hadoop的原生NameNode HA搭建,後面會與zookeeper叢集進行整合,實現自動容災(Yarn+NameNode)
- 進入 /soft/hadoop/etc 目錄,複製 hadoop 檔案為:full,ha,pesudo,並建立指向ha的符號連結hadoop
[centos@hadoop1 /soft/hadoop/etc]$ cp hadoop ha
[centos@hadoop1 /soft/hadoop/etc]$ cp hadoop full
[centos@hadoop1 /soft/hadoop/etc]$ cp hadoop pesudo
// 建立符號連結
[centos@hadoop1 /soft/hadoop/etc]$ ln -s /soft/hadoop/etc/ha hadoop
- 進入 ha 目錄下配置4個檔案:core-site.xml;hdfs-site.xml;mapred-site.xml;yarn-site.xml
[core-site.xml]
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--- 配置新的本地目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/centos/hadoop</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>20</value>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>5000</value>
</property>
</configuration>
[hdfs-site.xml]
<configuration>
<!-- 配置nameservice -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- myucluster下的名稱節點兩個id -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置每個nn的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>
<!-- 配置webui埠 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 名稱節點共享編輯目錄 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop3:8485;hadoop4:8485;hadoop5:8485;hadoop6:8485;hadoop7:8485;hadoop8:8485/mycluster</value>
</property>
<!-- java類,client使用它判斷哪個節點是啟用態 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 指令碼列表或者java類,在容災情況下保護啟用態的nn -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/centos/.ssh/id_rsa</value>
</property>
<!-- 配置JN存放edit的本地路徑 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/centos/hadoop/journal</value>
</property>
</configuration>
[mapred-site.xml]
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
[yarn-site.xml]
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 配置 slaves 檔案和修改 hadoop-env.sh中的一個細節
// 配置 DataNode 從屬節點
[centos@hadoop1 /soft/hadoop/etc/ha]$ nano slaves
新增如下:
hadoop3
hadoop4
hadoop5
hadoop6
hadoop7
hadoop8
// 修改hadoop-env.sh中的一個細節
[centos@hadoop1 /soft/hadoop/etc/ha]$ nano hadoop