使用Centos7來進行完全分布式的叢集搭建,一般我們用僞分布式的叢集就可以了,不需要配置完全分布式的叢集
和我們搭建僞分布式叢集一樣,我們首先要現在好安裝包,以及我們需要配置配置JDK,SSH免秘鑰登陸,以及Zookeeper分布式的搭建等,下面就開始我們的搭建過程
一、配置Linux虛拟機
1.配置主機名以及主機映射
我們配置叢集環境的時候,設定固定的主機名和主機映射能夠友善的讓我我們使用
修改主機名
修改主機名的時候,Centos6和Centos7完全不一樣。下面是Centos7為例來修改我們的主機名
vim /etc/hostname
删除原來的主機名,修改為我們自己的要配置的,在這裡我修改的主機名為zj01,zj02,zj03,一般我們都是設定的master,slave1,slave2。按照個人喜好修改主機名
注意:修改主機名後我們需要重新開機虛拟機才會生效,使用reboot指令重新開機虛拟機
reboot
補充:Centos6修改主機名
vim /etc/sysconfig/network
将裡面原來資訊修改為如下資訊:
NETWORKING=yes
HOSTNAME=zj01
修改完成後重新開機虛拟機
配置主機映射
修改配置檔案hosts
vim /etc/hosts
根據自己的ip資訊,添加如下資訊:
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.130 zj01
192.168.8.131 zj02
192.168.8.132 zj03
再修改我們的主機映射的時候,我們可以通過ifconfig來檢視我們自己的ip資訊,進行配置
ifconfig
主機映射配置完畢
2.關閉防火牆
Centos7系統預設防火牆不是iptables,而是firewall,那就得使用以下方式關閉防火牆了。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
此時Centos7的防火牆就關閉了。
補充:Centos6關閉防火牆
service iptables status #檢視防火牆狀态
service iptables stop #關閉防火牆,但是重新開機後會恢複原來狀态
chkconfig iptables --list #檢視系統中防火牆的自動
chkconfig iptables off #關閉防火牆自啟動
chkconfig iptables --list #再次檢視防火牆自啟動的情況,所有啟動狀态都變成額off
常時間沒有用過Centos6了,應該是–list,如果不是直接關閉就行了,不用糾結這個指令
二、SSH免秘鑰的配置
執行以下指令來生成相應得秘鑰
ssh-keygen -t rsa
一路回車,生成私有秘鑰
cd /root/.ssh
ls
一般在第一次執行的時候,隻有id_rsa、id_rsa.pub這兩個檔案,但是id_rsa.pub檔案存的是私有秘鑰,要想讓其他節點來連接配接本台機器我們需要生成公鑰,執行ssh-copy-id可以将秘鑰轉成公鑰,在三台節點上執行以下指令:
ssh-copy-id zj01
ssh-copy-id zj02
ssh-copy-id zj03
執行過次語句後,每台節點上都會生成以下兩個檔案authorized_keys,known_hosts,檢視兩個檔案的内容,執行此語句的時候需要我們先輸入yes統一連接配接,再輸入要連接配接節點的密碼就可以了。
cat authorized_keys
此檔案裡面存儲的是三台節點的秘鑰。
檢視known_hosts檔案
cat known_hosts
此檔案主要記錄的是我們使用ssh連接配接過的主機名。
相對而言authorized_keys檔案是最重要的,有了這個檔案我們再使用ssh連接配接的時候直接就連接配接了,不用我們再輸入密碼。
自此SSH免秘鑰設定完畢。我們可以繼續下面元件的安裝配置。
三、JDK的安裝部署
建立一個目錄,用來存放所有的安裝目錄。在這裡我建立的是目錄是/apps/,我們可以将所有的安裝包上傳到這個檔案中,解壓後再将安裝包删除。
注意:jdk三台都需要配置
1.解除安裝系統自帶的jdk
rpm -qa | grep java
使用rpm進行解除安裝
rpm -e java-xxx
rpm -e --nodeps java-xxx #強制解除安裝
2.下載下傳jdk安裝包并上傳到虛拟機中
在官網上進行下載下傳jdk的安裝包
官網路徑:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
我這裡面使用的XShell連接配接的虛拟機,在XShell連接配接的時候,執行以下語句就可以實驗windows和虛拟機之間的檔案傳輸
yum install lrzsz -y
執行完成後就可以将文拖到虛拟機終端裡面進行檔案的上傳。
注意:這隻是其中的一種解決方案,我們還可以下載下傳winscp來實作檔案的上傳下載下傳。
3.安裝jdk
解壓并重新指令
tar -zxvf jdk-8u162-linux-x64.tar.gz ./
mv jdk-1.8.0_162 jdk
rm -rf jdk-8u162-linux-x64.tar.gz
修改環境變量(三個節點都配置)
vim /etc/profile
配置如下:
#JDK 1.8
export JAVA_HOME=/apps/jdk
export PATH=$PATH:$JAVA_HOME/bin
重新整理環境變量
source /etc/profile
驗證jdk是否安裝成功
java -version
輸出如下:
我們可以通過以下指令将jdk檔案上傳到其餘的節點中
scp -r /apps/jdk zj02:/apps/
scp -r /apps/jdk zj03:/apps/
這樣我們就可以在02,03節點上/apps/目錄下檢視我們上傳的jdk檔案,需要我們配置環境變量就可以了。
四、Zookeeper的安裝部署
要配置完全分布式的Hadoop叢集,Zookeeper的主要作用就是協調叢集的運作,在Hadoop生态圈中zookeeper的作用是至關重要的。
下載下傳zookeeper的安裝包
首先我們要先下載下傳zookeeper的安裝包,在管網上下載下傳安裝包就可以了
管網路徑:https://archive.apache.org/dist/zookeeper/
這裡面有好多版本,我們可以選擇自己版本進行下載下傳。
将下載下傳後的安裝包,上傳到zj01的/apps目錄下。
安裝zookeeper
解壓zookeeper的安裝包并重名為zookeeper
tar -zxvf zookeeper-3.4.12.tar.gz
mv zookeeper-3.4.12 zookeeper
rm -rf zookeeper-3.4.12.tar.gz
修改環境變量(三個節點都配置)
vim /etc/profile
在檔案末尾添加一下資訊
#zookeeper
export ZOOKEEPER_HOME=/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
配置到檔案後我們要重新整理一下環境變量,讓我們的配置資訊生效
source /etc/profile
配置zookeeper
進入zookeeper的conf目錄下,将zoo_example.cfg複制出來一個為zoo.cfg
cp zoo_example.cfg zoo.cfg
修改zoo.cfg檔案
vim zoo.cfg
配置資訊如下
server.0=zj01:2888:3888
server.1=zj02:2888:3888
server.2=zj03:2888:3888
其中0、1、2分别代表的是zj01、zj02、zj03的辨別符。
建立辨別符
進入dataDir設定的目錄/apps/zookeeper/tmp,在此目錄下建立一個myid檔案,用來存放我們設定的辨別符
cd /apps/zookeeper/tmp
echo 1 > myid
檢視辨別符
分發檔案到其餘的兩個節點
scp -r /apps/zookeeper slave2:/apps/zookeeper
scp -r /apps/zookeeper slave3:/apps/zookeeper
記得修改zj02,zj03的辨別符為1和2
啟動zookeeper
zkServer.sh stat
檢視每台zookeeper的狀态,會出現一個leader,兩個flower。此時zookeeper的叢集搭建完畢
五、Hadoop的安裝部署
下載下傳安裝包
我們可以在官網上進行下載下傳安裝包
官網:https://archive.apache.org/dist/hadoop/common/
進入官網選擇自己想要下載下傳的安裝包進行下載下傳,切記下載下傳64位的tar.gz安裝包
将下載下傳好的安裝包上傳到zj01的/apps/目錄下。
安裝hadoop
解壓并重命名為hadoop
tar -zxvf hadoop-2.7.5.tar.gz
mv hadoop-2.7.5 hadoop
rm -rf hadoop-2.7.5.tar.gz
修改環境變量(三個節點都配置)
vim /etc/profile
在檔案末尾添加一下資訊
#hadoop
export HADOOP_HOME=/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
配置到檔案後我們要重新整理一下環境變量,讓我們的配置資訊生效
source /etc/profile
修改配置檔案
進入hadoop配置檔案所在目錄
cd /apps/hadoop/etc/hadoop
我們在此目錄下需要修改5個配置檔案
修改hadoop-env.sh
需要我們指定jdk的版本資訊
export JAVA_HOME=/apps/jdk
修改core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!--指定檔案系統的主節點-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata</value>
</property>
<!--hadoop的日志路徑-->
<property>
<name>hadoop.tmp.dir</name>
<value>/apps/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<!--指定可以在任何 IP 通路-->
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<!--指定所有使用者可以通路-->
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
<!--這裡是 ZooKeeper 叢集的位址和端口。注意,數量一定是奇數,且不少于三個節點-->
<property>
<name>ha.zookeeper.quorum</name>
<value>zj01:2181,zj02:2181,zj03:2181</value>
</property>
</configuration>
修改hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!--指定 hdfs 的叢集名為 bigdata -->
<property>
<name>dfs.nameservices</name>
<value>bigdata</value>
</property>
<!-- ns1 下面有兩個 NameNode,分别是 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.bigdata</name>
<value>nn1, nn2</value>
</property>
<!-- nn1 的 RPC 通信位址 -->
<property>
<name>dfs.namenode.rpc-address.bigdata.nn1</name>
<value>zj01:9000</value>
</property>
<!-- nn2 的 RPC 通信位址 -->
<property>
<name>dfs.namenode.rpc-address.bigdata.nn2</name>
<value>zj02:9000</value>
</property>
<!-- nn1 的 http 通信位址 -->
<property>
<name>dfs.namenode.http-address.bigdata.nn1</name>
<value>zj01:50070</value>
</property>
<!-- nn2 的 http 通信位址 -->
<property>
<name>dfs.namenode.http-address.bigdata.nn2</name>
<value>zj02:50070</value>
</property>
<!--指定 JournalNode 叢集在對 NameNode 的目錄進行共享時,自己存儲資料的磁盤路徑-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop/journaldata</value>
</property>
<!-- 指定 cluster1 的兩個 NameNode 共享 edits 檔案目錄時,使用的JournalNode 叢集資訊-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://zj01:8485;zj02:8485;zj03:8485/bigdata</value>
</property>
<!-- qj 方式共享 edits。使用此方式-->
<property>
<name>dfs.namenode.edits.journal-plugin.qjournal </name>
<value>org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager</value>
</property>
<!--開啟 NameNode 失敗自動切換-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--設定為 true,允許 NN 嘗試恢複之前失敗的 dfs.namenode.name.dir 目錄。在建立 checkpoint 是做此嘗試。如果設定多個磁盤,建議允許-->
<property>
<name>dfs.namenode.name.dir.restore</name>
<value>true</value>
</property>
<!--指定出故障時,哪個實作類負責執行故障切換-->
<property>
<name>dfs.client.failover.proxy.provider.bigdata</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--一旦需要 NameNode 切換,使用 ssh 方式進行操作-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!--如果使用 ssh 進行故障切換,使用 ssh 通信時用的密鑰存儲的位置-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--指定 namenode 名稱空間的存儲位址, 可以是按逗号分隔的目錄清單-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///apps/hadoop/dfsdata/name</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>67108864</value>
</property>
<!--指定 datanode 資料存儲位址, 可以是按逗号分隔的目錄清單-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///apps/hadoop/dfsdata/data</value>
</property>
<!--指定資料備援份數,不超過機器數即可-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定可以通過 web 通路 hdfs 目錄-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
修改mapred-site.xml
複制mapred-site.xml.template為mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
具體配置資訊如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!--指定運作 mapreduce 的環境是 yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<configuration>
<!--rm 失聯後重新連結的時間-->
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<!--開啟 resource manager HA,預設為 false-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--配置 resource manager 命名-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>zj01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>zj02</value>
</property>
<!--開啟 resourcemanager 故障自動切換,指定機器-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--在 zj01 上配置 rm1,在 zj02 上配置 rm2,注意:一般都喜歡把配置好的檔案遠端複制到其它機器上,但這個在 YARN 的另一個機器上一定要修改,其他機器上不配置此項-->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<!--開啟 resourcemanager 自動恢複功能-->
<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>
<!--連接配接zookeeper位址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zj01:2181,zj02:2181,zj03:2181</value>
</property>
<!--失聯等待連接配接時間-->
<property>
<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
<value>5000</value>
</property>
<!-- 叢集的 Id,使用該值確定 RM 不會做為其它叢集的 active -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>bigdata</value>
</property>
<!--配置 rm1-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>zj01:8132</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>zj01:8130</value>
</property>
<!-- RM 的網頁接口位址:端口-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>zj01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>zj01:8131</value>
</property>
<!-- RM 管理接口位址:端口-->
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>zj01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm1</name>
<value>zj01:23142</value>
</property>
<!--配置 rm2-->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>zj02:8132</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>zj02:8130</value>
</property>
<!-- RM 的網頁接口位址:端口-->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>zj02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>zj02:8131</value>
</property>
<!-- RM 管理接口位址:端口-->
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>zj02:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm2</name>
<value>zj02:23142</value>
</property>
<!--請配置為:mapreduce_shuffle,在 Yarn 上開啟 MR 的必須項-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- nodemanager 本地檔案存儲目錄-->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/apps/hadoop/dfsdata/yarn/local</value>
</property>
<!--存儲 container 日志的地方-->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/apps/hadoop/dfsdata/logs</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
<discription>每個節點可用記憶體,機關 MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>258</value>
<discription>單個任務可申請最少記憶體,預設 1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>512</value>
<discription>單個任務可申請最大記憶體,預設 8192MB</discription>
</property>
<property>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:8042</value>
</property>
</configuration>
修改slaves檔案
zj01
zj02
zj03
分發hadoop檔案到其他節點
scp -r /apps/hadoop slave2:/apps/
scp -r /apps/hadoop slave3:/apps/
初始化hadoop
在執行格式化的時候開啟一個程序:
hadoop-daemon.sh start journalnode
格式化之後将name檔案拷貝到zj02中,按理說應該是自動生成的,我的沒有自動生成,是自己拷貝進去的
hadoop namennode -format
啟動hadoop叢集
#先啟動zookeeper,再啟動hadoop叢集
start-all.sh
啟動情況如下:
檢視虛拟機的各個程序:
通路zj01:50070端口和zj02:50070端口
http://zj01:50070
http://zj02:50070
通路zj01:8088端口
http://zj01:8088
hadoop集安裝成功,如果安裝有什麼問題,可以随時提喲,希望能幫助您。
如果你在安裝碰見了什麼樣問題,或者我的檔案寫的有不合理之處,歡迎指出謝謝。