集羣規劃:
主機名 IP 安裝的軟件
master 192.168.1.201 jdk、hadoop、zookeeper
slave1 192.168.1.202 jdk、hadoop、zookeeper
slave2 192.168.1.203 jdk、hadoop、zookeeper
虛擬機安裝技巧快速法: 先裝master鏡像,先操作後面“先在master上安裝jdk(建議非openjdk)“這一節中的教程,安裝ntp同步時間,接着按下面常用命令分別修改master主機名,ip地址和綁定hostname與ip,ip和主機名均按上面集羣規劃修改, 然後將master鏡像克隆兩個,分別爲slave1、slave2,當然可以更多,接着按下面常用命令分別修改克隆的主機名,ip地址,再開啓所有虛擬機並在master節點配置ssh免密登錄到slave節點,接着按後面教程搭建hadoop集羣 zookeeper Hbase集羣。
注意版本兼容問題
本博客:
jdk1.7
zookeeper3.4.14
hbase 1.5.0
hadoop 2.8.5
下面爲版本兼容列表:
jdk與hbase兼容問題
安集羣常用命令
root@master
即當前用戶@主機名(hostname)
在master鏡像中最好創建一個用戶叫hadoop,解壓什麼的所有操作都用hadoop來操作
修改主機名
vim /etc/hostname
立即生效: hostname 主機名
修改ip地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0
重啓服務:
service network restart
綁定hostname與ip
vim /etc/hosts
ntp同步時間
sudo yum install ntp.x86_64
systemctl start ntpd
ntpdate time1.aliyun.com
date
#重啓命令
systemctl restart ntpd
配置ssh免密登錄
1.客戶端生成公私鑰
本地客戶端生成公私鑰:(一路回車默認即可)
ssh-keygen
上面這個命令會在用戶目錄.ssh文件夾下創建公私鑰
cd ~/.ssh
ls
下創建兩個密鑰:
- id_rsa (私鑰)
- id_rsa.pub (公鑰)
2 免密登錄集羣其他服務器salve2 slave1
還有 ssh-copy-id master@master
測試成功
同理分別在slave1 slave2上執行同樣的免密操作
先在master上安裝jdk(建議非openjdk)
先下載jdk for linux,本文後綴爲.zip其實是一樣的,下載鏈接:https://download.csdn.net/download/Justdoforever/12527560
tar.gz後綴格式JDK安裝方式
安裝jdk-7u79-linux-x64.tar.gz。
在/usr目錄下新建java文件夾,命令行:
[root@localhost Desktop]# mkdir /usr/java
進入JDK壓縮包所在目錄,將壓縮包複製到java文件夾中。複製文件用cp xxx命令,複製文件夾用cp -r xxx,命令行:
[root@localhost Desktop]# cp jdk-7u79-linux-x64.gz /usr/java
然後返回到根目錄,再進入java目錄,命令行:
[root@localhost Desktop]# cd /
[root@localhost Desktop]# cd /usr/java
壓縮包解壓,命令行:
[root@localhost Desktop]# tar xvf jdk-7u79-linux-x64.gz
或者 [root@localhost Desktop]# unzip jdk-7u79-linux-x64.zip
刪除壓縮包,輸入yes確認刪除。命令行:
[root@localhost java]# rm jdk-7u79-linux-x64.gz
rm: remove regular file `jdk-7u79-linux-x64.gz'? yes
設置對所有用戶有效方式:修改/etc/profile文件設置系統變量,設置jdk環境變量,該方式對所有用戶有效。
使用VI編輯,輸入命令,回車確認。命令行:
[root@localhost Desktop]# vi /etc/profile
打開之後在文件末尾添加下面配置。通過鼠標滑輪滾動到文件末尾,上下左右方向鍵控制光標輸入位置。
export JAVA_HOME=/usr/java/jdk1.7.0_79
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
配置好後,按Esc退出,按Shift加英文冒號shift + : 然後輸入wq,按Enter回車鍵確認。取消編輯按Ctrl+z。
使profile配置生效。命令行:
[root@localhost Desktop]# source /etc/profile
安裝步驟:
1.安裝配置zooekeeper集羣(在master上操作)3.4.14版本鏈接https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.4.14/ 用什麼版本下面替換一下就好了
1.1解壓
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
1.2修改配置
cd /usr/local/zookeeper-3.4.6/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
server.id=host:port1:port2
其中id爲一個數字,表示zk進程的id,這個id也是dataDir目錄下myid文件的內容。
host是該zk進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。
dataDir
其配置的含義跟單機模式下的含義類似,不同的是集羣模式下還有一個myid文件。myid文件的內容只有一行,且內容只能爲1 - 255之間的數字,這個數字亦即上面介紹server.id中的id,表示zk進程的id。
修改:dataDir=/usr/local/zookeeper-3.4.6/tmp
在最後添加:
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
保存退出
然後創建一個tmp文件夾
mkdir /usr/local/zookeeper-3.4.6/tmp
再創建一個空文件
touch /usr/local/zookeeper-3.4.6/tmp/myid
最後向該文件寫入ID
echo 1 > /usr/local/zookeeper-3.4.6/tmp/myid
1.3將配置好的zookeeper拷貝到其他節點(首先分別在slave1、slave2創建相應目錄:mkdir /usr/local)
scp -r /usr/local/zookeeper-3.4.6/ slave1:/usr/local/
scp -r /usr/local/zookeeper-3.4.6/ slave2:/usr/local/
注意:修改slave1、slave2對應/usr/local/zookeeper-3.4.6/tmp/myid內容
slave1:
echo 2 > /usr/local/zookeeper-3.4.6/tmp/myid
slave2:
echo 3 > /usr/local/zookeeper-3.4.6/tmp/myid
2.安裝配置hadoop集羣(在master上操作)下載鏈接爲zip,解壓命令換爲unzip,具體命令百度,可能要安裝該命令:https://download.csdn.net/download/Justdoforever/12487962
2.1解壓
tar -zxvf hadoop-2.4.0.tar.gz -C /usr/local/
2.2配置HDFS(hadoop2.0以上所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下)
#將hadoop添加到環境變量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export HADOOP_HOME=/usr/local/hadoop-2.4.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#使變量生效
source /etc/profile
#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /usr/local/hadoop-2.4.0/etc/hadoop
2.2.1修改hadoo-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_55
2.2.2修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice爲master -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>master</value>
</property>
<!--zookeeper配置-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- 指定緩存大小 -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.8.5/tmp</value>
</property>
</configuration>
hadoop中有3個核心組件:
分佈式文件系統:HDFS —— 實現將文件分佈式存儲在很多的服務器上
分佈式運算編程框架:MAPREDUCE —— 實現在很多機器上分佈式並行運算
分佈式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,併合理分配運算資源
2.2.3修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice爲master,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>master</value>
</property>
<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.master</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.master.nn1</name>
<value>192.168.1.201:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.master.nn1</name>
<value>192.168.1.201:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.master.nn2</name>
<value>192.168.1.202:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.master.nn2</name>
<value>192.168.1.202:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.1.201:8485;192.168.1.202:8485;192.168.1.203:8485/master</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-2.8.5/journal</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.master</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 注意一下標紅的路徑名,爲master登錄用戶的名字,不是hostname-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
2.2.4修改mapred-site.xml
<configuration>
<!-- 指定mr框架爲yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Yarn 框架相對於老的 MapReduce 框架什麼優勢呢?我們可以看到:
1. 這個設計大大減小了 JobTracker(也就是現在的 ResourceManager)的資源消耗,並且讓監測每一個 Job 子任務 (tasks) 狀態的程序分佈式化了,更安全、更優美。
2. 在新的 Yarn 中,ApplicationMaster 是一個可變更的部分,用戶可以對不同的編程模型寫自己的 AppMst,讓更多類型的編程模型能夠跑在 Hadoop 集羣中,可以參考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
3. 對於資源的表示以內存爲單位 ( 在目前版本的 Yarn 中,沒有考慮 cpu 的佔用 ),比之前以剩餘 slot 數目更合理。
4. 老的框架中,JobTracker 一個很大的負擔就是監控 job 下的 tasks 的運行狀況,現在,這個部分就扔給 ApplicationMaster 做了,而 ResourceManager 中有一個模塊叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是監測 ApplicationMaster 的運行狀況,如果出問題,會將其在其他機器上重啓。
5. Container 是 Yarn 爲了將來作資源隔離而提出的一個框架。這一點應該借鑑了 Mesos 的工作,目前是一個框架,僅僅提供 java 虛擬機內存的隔離 ,hadoop 團隊的設計思路應該後續能支持更多的資源調度和控制 , 既然資源表示成內存量,那就沒有了之前的 map slot/reduce slot 分開造成集羣資源閒置的尷尬情況。
2.2.5修改yarn-site.xml
<configuration>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.2.6修改slaves(slaves是指定子節點的位置,因爲要在itcast01上啓動HDFS、在itcast03啓動yarn,所以itcast01上的slaves文件指定的是datanode的位置,itcast03上的slaves文件指定的是nodemanager的位置)
slave1
slave2
2.4將配置好的hadoop拷貝到其他節點
scp -r /usr/local/hadoop-2.4.0/ slave1:/usr/local/
scp -r /usr/local/hadoop-2.4.0/ slave2:/usr/local/
拷貝完要配置環境,slave1 slave2
#將hadoop添加到環境變量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export HADOOP_HOME=/usr/local/hadoop-2.4.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#使變量生效
source /etc/profile
###注意:嚴格按照下面的步驟
2.5啓動zookeeper集羣(分別在master、slave1、slave2上啓動zk)
cd /usr/local/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看狀態:一個leader,兩個follower
./zkServer.sh status
2.6啓動journalnode(分別在在master、slave1、slave2上執行)
cd /usr/local/hadoop-2.4.0
sbin/hadoop-daemon.sh start journalnode
#運行jps命令檢驗,master、slave1、slave2上多了JournalNode進程
1〉上面在Active Namenode與StandBy Namenode之間的綠色區域就是JournalNode,當然數量不一定只有1個,作用相當於NFS共享文件系統.Active Namenode往裏寫editlog數據,StandBy再從裏面讀取數據進行同步.
2〉 NameNode之間共享數據(NFS 、Quorum Journal Node(用得多))
3〉兩個NameNode爲了數據同步,會通過一組稱作JournalNodes的獨立進程進行相互通信。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變更信息,並且一直監控edit log的變化,把變化應用於自己的命名空間。standby可以確保在集羣出錯時,命名空間狀態已經完全同步了。
4〉 Hadoop中的NameNode好比是人的心臟,非常重要,絕對不可以停止工作
2.7格式化HDFS
#在master上執行命令: hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這裏我配置的是/usr/local/hadoop-2.4.0/tmp,然後將/usr/local/hadoop-2.4.0/tmp拷貝到slave1的/usr/local/hadoop-2.4.0/下。
scp -r tmp/ slave1:/usr/local/hadoop-2.4.0/
2.8格式化ZK(在master上執行即可)
hdfs zkfc -formatZK
2.9啓動HDFS(在master上執行)
sbin/start-dfs.sh
2.10啓動YARN(在master上操作)
sbin/start-yarn.sh
到此,hadoop-2.8.5配置完畢,可以統計瀏覽器訪問:
http://192.168.1.201:50070
NameNode 'itcast01:9000' (active)
http://192.168.1.202:50070
NameNode 'itcast02:9000' (standby)
至此搞定hadoop~恭喜你也完成了。
最開始hbase用的1.1.5後面查資料,發現不兼容,後選1.5.0
wget http://archive.apache.org/dist/hbase/1.5.0/hbase-1.5.0-bin.tar.gz
一定記得同步三臺機器時間
1.上傳hbase安裝包
2.解壓
3.配置hbase集羣,要修改3個文件(首先zk集羣已經安裝好了)
注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
3.1修改hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_80
//告訴hbase使用外部的zk
export HBASE_MANAGES_ZK=false
3.1修改hbase-site.xml
vim hbase-site.xml<configuration>
<!-- 指定hbase在HDFS上存儲的路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.1.201:9000/hbase</value>
</property>
<!-- 指定hbase是分佈式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多個用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>
vim regionservers
master
slave1
slave2
3.2拷貝hbase到其他節點
scp -r /usr/local/hbase-0.96.2-hadoop2/ slave1:/usr/local/
scp -r /usr/local/hbase-0.96.2-hadoop2/ slave2:/usr/local/4.將配置好的HBase拷貝到每一個節點並同步時間。
5.啓動所有的hbase
分別啓動zk
./zkServer.sh start
啓動hbase集羣
start-dfs.sh
啓動hbase,在主節點上運行:
start-hbase.sh
6.通過瀏覽器訪問hbase管理頁面
192.168.1.201:16010
7.爲保證集羣的可靠性,要啓動多個HMaster
hbase-daemon.sh start master
自此大功告成,花費了我5天時間, 太難了,以後裝軟件之間一定要考慮版本兼容性問題。共勉!!!