最近在看hadoop的一些知識,下面搭建一個ha (高可用)的hadoop完整分佈式集羣:html
hadoop2.8 ha 集羣搭建shell
hbase完整分佈式集羣搭建apache
hadoop完整集羣遇到問題彙總centos
主機 | 別名 | 安裝軟件 | 現有進程 | 服務地址 |
192.168.248.138 | cdh1 | hadoop2.8 jdk1.8 | namenode DFSZKFailoverController | http://cdh1:50070 |
192.168.248.139 | cdh2 | hadoop2.8 jdk1.8 | namenode DFSZKFailoverController | http://cdh1:50070 |
192.168.248.140 | cdh3 | hadoop2.8 jdk1.8 | ResourceManager | |
192.168.248.141 | cdh4 | hadoop2.8 jdk1.8 zookeeper3.4.13 | QuorumPeerMain JournalNode DataNode NodeManager | http://cdh3:8088 |
192.168.248.142 | cdh5 | hadoop2.8 jdk1.8 zookeeper3.4.13 | QuorumPeerMain JournalNode DataNode NodeManager | |
192.168.248.143 | cdh6 | hadoop2.8 jdk1.8 zookeeper3.4.13 | QuorumPeerMain JournalNode DataNode NodeManager | |
192.168.248.144 | cdh7 | hadoop2.8 jdk1.8 | JournalNode DataNode NodeManager |
1> 關閉防火牆,禁止設置開機啓動:bash
(1) //臨時關閉 systemctl stop firewalld服務器
(2) //禁止開機啓動 systemctl disable firewalldssh
注意:centos7防火牆默認是:firewalld 分佈式
centos6 的命令是:
//臨時關閉
service iptables stop
//禁止開機啓動
chkconfig iptables off
2> 修改selinux 屬性爲disabled
注意:修改了selinux或者修改了hostname須要重啓使其生效【在這我沒當即啓動,下面配置好基礎環境後再統一啓動】
3> Yum 安裝net-tools.x86_64和lrzsz.x86_64
(1) Net-tools是爲了ifconfig yum install -y net-tools.x86_64
(2) Lrzsz是方便拖文件上傳 yum install -y lrzsz.x86_64
由於個人鏡像是,mini版的centos,除了基礎命令和yum其餘命令都須要本身安裝。若是用完整版centos這些命令都已經集成進去了。
4> 準備集羣所須要的相應軟件安裝包
(1) Jdk1.8
(2) Hadoop2.8
(3) Zookeeper3.4.13
暫時準備這這些基本軟件,在cdh家目錄下建立一個hadoop目錄,把上述基本軟件上傳到該家目錄下的hadoop文件夾下。
(4) 安裝jdk【用root權限去安裝】
① [cdh@localhost hadoop]$ tar -zxvf jdk-8u181-linux-x64.tar.gz
② 修改環境變量 vi ~/.bash_profile | vi /etc/profile
source ~/.bash_profile 使其生效
Java -version 驗證安裝是否成功
到這cdh1號機器基本軟件安裝完成:下面我來關閉cdh1來克隆幾份服務器,這樣cdh1安裝配置那些軟件和配置都會同步過去。克隆步驟以下
(1) 首先關閉cdh1服務器,由於在啓動和掛起的狀態下沒法克隆機器。
啓動cdh1-cdh7 在xshell中創建對七個虛機的鏈接
注意,在這我使用的不是root用戶,都是普通用戶cdh
5> 安裝hadoop集羣的準備工做:
(1) 修改主機名:
root用戶登陸
vi /etc/hostname
自定義主機名
重啓 reboot
(2) ssh免密登陸問題。
分別在每一個節點上生成公鑰私鑰:
cd /root/.ssh
ssh-keygen -t rsa三次回車
cp id_rsa.pub authorized_keys
複製祕鑰報錯,是由於解析主機報錯。配置/etc/hosts便可
將cdh2、cdh3、cdh4、cdh5、cdh6,cdh7的私鑰複製到cdh1節點上:
在cdh2節點上執行:ssh-copy-id -i cdh1
在cdh3節點上執行:ssh-copy-id -i cdh1
在cdh4節點上執行:ssh-copy-id -i cdh1
在cdh5節點上執行:ssh-copy-id -i cdh1
在cdh6節點上執行:ssh-copy-id -i cdh1
在cdh7節點上執行:ssh-copy-id -i cdh1
將cdh1節點上的authorized_keys複製給cdh2、cdh3、cdh4、cdh5、cdh6,cdh7節點:
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh2:/root/.ssh/
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh3:/root/.ssh/
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh4:/root/.ssh/
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh5:/root/.ssh/
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh6:/root/.ssh/
在cdh1節點上執行:scp /root/.ssh/authorized_keys cdh7:/root/.ssh/
驗證ssh免密碼登陸(包括登陸本身):
在cdh1節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh2節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh3節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh4節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh5節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh6節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
在cdh7節點上執行:ssh cdh1、ssh cdh2、ssh cdh3、ssh cdh4、ssh cdh5、ssh cdh6,ssh cdh7
6> 在cdh1節點上配置hadoop2.8
(1) 配置hadoop環境變量
source /etc/profile 保存生效
(2) 修改位於hadoop/etc/hadoop下的配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves)
修改hadoop-env.sh:
修改core-site.xml
修改hdfs-site.xml
<configuration> <!--指定hdfs的nameservice爲ns1,須要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>cdh1:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>cdh1:50070</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>cdh2:9000</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>cdh2:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://cdh4:8485;cdh5:8485;cdh6:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/cloud/hadoop/journal</value> </property> <!-- 開啓NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔離機制時須要ssh免登錄 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> </configuration>
修改mapred-site.xml
修改yarn-site.xml
修改slaves:(datanode節點設置,cdh7是我預留的機器,裝ozzie或者pig的暫時不放入datanode節點中)【若是須要把其餘機器做爲datanode節點。只須要在這配置,而後同步到其餘機器上,而後namenode從新格式化便可】
cdh4
cdh5
cdh6
注意:core-site.xml中指定了hadoop數據存放的本地磁盤路徑是/hadoop/data,而這個/hadoop/下data文件夾是不存在須要建立;
hdfs-site.xml中指定了JournalNode在本地磁盤存放數據的位置是/hadoop/journal,而/hadoop/下的journal文件夾是不存在的須要建立。
此上6個配置文件都是hdp1節點上的,修改完成後將配置好的環境變量/etc/profile文件、/cloud/jdk文件夾和/cloud/hadoop文件夾複製到其餘節點:
在hdp1節點上執行: scp -r /hadoop/ cdh2:/
在hdp1節點上執行: scp -r /hadoop/ cdh3:/
在hdp1節點上執行: scp -r /hadoop/ cdh4:/
在hdp1節點上執行: scp -r /hadoop/ cdh5:/
在hdp1節點上執行: scp -r /hadoop/ cdh6:/
在hdp1節點上執行: scp -r /hadoop/ cdh7:/
將環境變量/etc/profile文件複製到其餘節點(在其餘節點上要執行source /etc/profile使其修改當即生效):
scp /etc/profile cdh2:/etc/
scp /etc/profile cdh3:/etc/
scp /etc/profile cdh4:/etc/
scp /etc/profile cdh5:/etc/
scp /etc/profile cdh6:/etc/
scp /etc/profile cdh7:/etc/
7> 在cdh4,cdh5,cdh6配置zk集羣
cd /hadoop/目錄下
解壓zookeeper-3.4.13.tar.gz:tar -zxvf zookeeper-3.4.13.tar.gz(當前目錄下多了一個zookeeper-3.4.13文件夾)
重命名zookeeper-3.4.13:mv zookeeper-3.4.13 zookeeper
cd到/hadoop/zookeeper/conf/目錄下:cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/hadoop/zookeeper/data
在最後面添加:
server.1=cdh4:2888:3888
server.2=cdh5:2888:3888
server.3=cdh6:2888:3888
在/hadoop/zookeeper/建立data文件夾,進入/hadoop/zookeeper/data下建立myid文件,內容爲1
將/hadoop/zookeeper文件夾複製到cdh5和cdh6下:
在cdh4節點上執行:scp -r /hadoop/zookeeper cdh5:/hadoop/
在cdh4節點上執行:scp -r /hadoop/zookeeper cdh6:/hadoop/
在cdh5節點上修改/hadoop/zookeeper/data/myid爲2
在cdh6節點上修改/hadoop/zookeeper/data/myid爲3
啓動zk集羣:
啓動cdh4、cdh5和cdh6節點上的zk
分別在每一個節點上執行:
cd /hadoop/zookeeper/bin目錄下
啓動zk:./zkServer.sh start
查看狀態:
zkServer.sh status(leader或follower)
jps後多出來個quorumpeerMain
8> 8在cdh1節點上啓動journalnode(會啓動全部journalnode)
cd /hadoop/hadoop-2.8.0/sbin目錄下
啓動journalnode:hadoop-daemons.sh start journalnode(在cdh4、cdh5和cdh6節點上運行jps命令檢驗,多了JournalNode進程)
9> 在hdp1節點上格式化HDFS
格式化HDFS:hadoop namenode -format
將格式化後生成的hadoop的數據文件都在hdp1節點上,須要將hdp1節點上的數據同步到hdp2節點上,由於hdp1節點和hdp2節點是ha,這裏我直接複製:
scp -r /hadoop/data hdp2:/hadoop
10> 在cdh1節點上格式化ZK
格式化ZK:hdfs zkfc -formatZK
11> 在cdh1節點上啓動HDFS
cd /cloud/hadoop/sbin目錄下
啓動HDFS:start-dfs.sh
12> 在cdh3節點上啓動YARN
cd /hadoop/hadoop2.8.0/sbin目錄下
啓動YARN:start-yarn.sh
13> 驗證namenode
驗證cdh1節點上的NameNode:jps或者http://cdh1:50070
驗證cdh2節點上的NameNode:jps或者http://cdh2:50070
驗證cdh3節點上的YARN:jps或者http://cdh3:8088/
到這,hadoop的高可用集羣已經搭建好了,有興趣的能夠仔細看看搭建過程
補充:各節點的啓動進程 (jps看)