一.簡述html
上一篇瞭解了Zookeeper和HDFS的一些概念,今天就帶你們從頭至尾搭建一下,其中遇到的一些坑也順便記錄下。java
1.1 搭建的拓撲圖以下:node
1.2 部署環境:Centos3.1,java1.8.0 ,Hadoop3.2,Zookeeper3.5.5linux
Linux環境搭建我這裏就不介紹了,請自行百度(PS:須要注意的一點是,最後一步硬盤大小最好改大一些,好比60G)。web
1.3 搭建Linux的時候可能會遇到這麼幾個問題:apache
首先安裝系統的時候不要選擇精簡版,這樣會有不少軟件不全,儘可能去選擇全一些的版本,好比我選擇的Infrastucture Server,而後全勾上了,這樣雖然佔用空間大了些,可是省去了後續安裝不少組件的煩惱。bootstrap
二.正文vim
小技巧:在搭建以前先說個小技巧,咱們搭建的時候能夠先在一臺虛擬機上部署,而後經過克隆到其它機器,修改部分該修改的參數就好了,這樣就方便了環境的頻繁部署。服務器
2.1 配置環境網絡
2.1.1 設置固定ip
1.進入到 /etc/sysconfig/network-scripts
2.點擊Vmware上面的編輯->虛擬網絡編輯器 點開NAT設置,裏面能夠看到網關IP
3.編輯ifcfg配置文件,修改固定ip,網關地址,DNS映射,子網掩碼等
vim ifcfg-eno16777736
TYPE=Ethernet
#標記顯示固定ip
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes
#ip地址,這個以tuge1舉例,我設定的爲100,後面的tuge2,tuge3,tuge4能夠分別設置爲101,102,103
IPADDR=192.168.40.100
#網關地址,這個根據上面第二步能夠得到
GATEWAY=192.168.40.2
NETMASK=255.255.255.0
#DNS地址
DNS1=114.114.114.114
DNS2=8.8.8.8
4.重啓服務:service network restart
2.1.2 配置hadoop環境
1.打開tuge1,在/opt/ 下面建立一個文件夾hadoop
cd /opt/
mkdir hadoop
2.進入到hadoop,在官網找到對應的hadoop版本進行下載,而後對文件進行解壓
cd hadoop
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
tar -xvf hadoop-3.2.0.tar.gz
2.1.3 配置java環境
3.而後回到/opt/下面建立一個java文件
cd /opt/
mkdir java
4.進入到java,經過ftp將jdk上傳到此目錄,並進行解壓
cd java
tar -xvf jdk-8u221-linux-x64.tar.gz
2.1.4 配置Zookeeper環境
1.進入到 /opt/下面建立zookeeper文件夾
cd /opt/
mkdir zookeeper
2.進入到zookeeper文件夾,下載zookeeper,而後對文件進行解壓
cd zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz
tar -xvf apache-zookeeper-3.5.5-bin.tar.gz
2.1.5 將配置寫入配置文件
打開/etc/profile 配置Hadoop和Java環境
vim /etc/profile
export JAVA_HOME=/opt/java/jdk1.8.0_221
export HADOOP_HDFS_HOME=/opt/hadoop/hadoop-3.2.0
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-3.2.0/etc/hadoop
export HADOOP_HOME=/opt/hadoop/hadoop-3.2.0
export ZK_HOME=/opt/zookeeper/apache-zookeeper-3.5.5-bin
PATH=$JAVA_HOME/bin:$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$ZK_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH CLASSPATH
配置好後,使用source /etc/profile 從新加載配置文件。
2.1.6 驗證環境配置
java --version
hadoop version
10.將上面配置好的tuge1克隆到tuge2,tuge3,tuge4,並修改對應的ip爲101,102,103
有關Linux克隆自行百度
2.1.7 修改主機別名
vim /etc/hosts 修改成 127.0.0.1 localhost tuge1 localhost4 localhost4.localdomain4
vim /etc/hostname 修改成tuge1
vim /etc/sysconfig/network 修改成
NETWORKING=yes
HOSTNAME=tuge1
PS:其它服務器照着配置便可
2.1.8 修改host文件添加映射別名
vim /etc/hosts 添加
192.168.40.100 tuge1
192.168.40.101 tuge2
192.168.40.102 tuge3
192.168.40.103 tuge4
2.2 搭建HDFS-Zookeeper
上面配置好環境後,接下來就是搭建HDFS了。這個能夠參照官網一步一步來:
2.2.1 安裝SSH:
yum install openssh-server
2.2.2 配置免密登錄
cd /.ssh
ssh-keygen -t rsa
ssh-copy-id localhost
(以上配置四臺都執行,而後都能免密訪問了)
在tuge1和tuge2服務器之間也設置互相免密,這樣方便之後使用journalnode同步
另外把tuge1的密鑰分發到tuge2,tuge3,tuge4上面,方便tuge1對全部機器的控制
2.2.3 配置namenode節點爲tuge1,tuge2,並設置遇到故障自動切換
編輯hadoop配置文件:
cd /opt/hadoop/hadoop-3.2.0/etc/hadoop
vim hdfs-site.xml
---------------------------------------------
<configuration>
<property>
<!-- DataNode副本數,僞分佈模式配置爲1 -->
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
<!-- 啓用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--指定hdfs的nameservice爲mycluster,須要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]爲在nameservice中的每個NameNode設置惟一標示符。
配置一個逗號分隔的NameNode ID列表。這將是被DataNode識別爲全部的NameNode。
例如,若是使用"node1"做爲nameservice ID,而且使用"nn1"和"nn2"做爲NameNodes標示符
-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- tuge1下面有一個NameNode,tuge2下面有一個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>tuge1:9000</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>tuge1:50070</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>tuge2:9000</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>tuge2:50070</value>
</property>
<!-- 指定NameNode的edits元數據的共享存儲位置。也就是JournalNode列表
該url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId推薦使用nameservice,默認端口號是:8485 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://tuge2:8485;tuge3:8485;tuge4:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/hadoop-3.2.0/ha/jn</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 肯定處於Active的Node -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔離機制時須要ssh免登錄 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id__dsa</value>
</property>
</configuration>
---------------------------------------------
cd /opt/hadoop
vim core.site.xml
-----------------------------------------
<configuration>
<property>
<!-- 元數據文件存放位置,真正使用的時候會被加載到內容中 -->
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/hadoop-3.2.0/ha</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>tuge1:2181,tuge2:2181,tuge3:2181,tuge4:2181</value>
</property>
</configuration>
------------------------------------------
PS:不要忘了,在一臺機器上配置便可,而後分發到其它機器就好了
2.2.4 指定DataNode在tuge3和tuge4上
cd /opt/hadoop/hadoop-3.2.0/etc/hadoop
在workers文件裏面指定DataNode
vim workers
------------------------
tuge3
tuge4
--------------------------
PS:弄完了分發到其它機器便可
2.2.5 指定zookeeper在tuge1,tuge2,tuge3和tuge4上
cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/conf
將zoo_sample.cfg複製一份重命名爲zoo.cfg
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
-------------------------------------
dataDir=/opt/zookeeper/apache-zookeeper-3.5.5-bin/zkData
server.1=tuge1:2888:3888
server.2=tuge2:2888:3888
server.3=tuge3:2888:3888
server.4=tuge4:2888:3888
------------------------------------
PS:弄完了,進行分發
2.2.6 建立myid文件,指定每臺機器的zookeeper ID
cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/
mkdir zkData --其它服務器也相應建立下
touch myid
vim myid --若是是tuge1就寫1,tuge2就寫2
---------------------------
1
---------------
PS:分發myid到其它機器,並修改數字
2.2.7 格式化NameNode
在格式化之間,要先開啓journalnode
hdfs --daemon start journalnode
查看防火牆狀態: systemctl status firewalld.service
執行關閉命令: systemctl stop firewalld.service
再次執行查看防火牆命令:systemctl status firewalld.service
執行開機禁用防火牆自啓命令 : systemctl disable firewalld.service
作完以上步驟後在如下文件添加點內容:
在start-dfs.sh和stop-dfs.sh文件裏面添加
---------------------------------------------
HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
在$HADOOP_HOME/etc/hadoop/hadoop-env.sh下面添加
export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export JAVA_HOME=/opt/java/jdk1.8.0_221
-----------------------------------------------
添加完後分發。
而後選擇任意一臺NameNode開始格式化
hdfs namenode -format
格式化完成後,在另外一臺同步元數據
hdfs namenode -bootstrapStandby
2.2.8 格式化Zookeeper
首先啓動Zookeeper (下面兩個命令tuge1,tuge2,tuge3,tuge4都執行一遍)
cd /opt/zookeeper/apache-zookeeper-3.5.5-bin/bin
./zkServer.sh start
查看Zookeeper啓動狀態
./zkServer.sh status
使用jps查看全部java進程
開始格式化
hdfs zkfc -formatZK
好了,通過無數採坑,按照上面步驟終於搭建完了,最終貼下效果圖:
運行命令:
cd /opt/hadoop/hadoop-3.2.0/sbin
./start-dfs.sh
瀏覽效果: