hadoop集羣搭建詳述

1、集羣搭建策略


   分析:
我手上只有3臺電腦,兩臺華碩筆記本i7、i3的處理器,一臺臺式機Pentium4處理器。爲了更好的測試zookeeper的功能,
我們總共需要6臺ubuntu(Ubuntu 14.04.3 LTS)的主機。以下是我的主機分佈策略:
i7:開啓4臺ubuntu虛擬機分別是
虛擬機名 內存       硬盤  網絡連接
master      1G        20G    橋接
master2    1G        20G    橋接
rm 512M    20G    橋接
slave3 1G        20G    橋接
i3: 安裝ubuntu系統 ,作爲Datanode節點slave1
P4: 安裝ubuntu系統 ,作爲Datanode節點slave2

2、修改hosts文件
    所有機器統一使用ubuntu這個賬號,並建立hadoop組,將ubuntu添加至hadoop組中。
     添加用戶:
su   //切換至 root
useradd -d /home/ubuntu -m ubuntu    //添加密碼
passwd ubuntu   //設置密碼

    添加組:

groupadd hadoop

將ubuntu添加至hadoop:
usermod -g hadoop ubuntu 
    查看當前用戶所在的組:
exit ubuntu
groups
顯示
hadoop

   編輯hosts:
sudo nano /etc/hosts

   修改成如下內容

127.0.0.1localhost

127.0.1.1ubuntu

#根據實際ip修改

192.168.0.7 master
192.168.0.10 master2
192.168.0.4 slave1
192.168.0.9 slave2
192.168.0.3 slave3
192.168.0.8 rm

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

3、ssh無密登陸
(1)master
需要無密登錄所有的機器
(2)master2
需要無密登錄master
(3)rm
需要無密登錄slave1 slave2 slave3
(4)無密登陸實現
以master登陸到master2爲例
當前位置master,執行
如未安裝ssh,執行
sudo apt-get install openssh-server
成功後,執行
ssh-keygen -t rsa
一路enter即可
cd ~
cd .ssh
ls 
authorized_keys id_rsa id_rsa.pub
其中 id_rsa是私鑰 本機保存不動,id_rsa.pub是公鑰需要交給mater2
給id_rsa.pub備份
cp id_rsa.pub id_rsa_m.pub
        首先給自己一份
cat id_rsa_m.pub >> authorized_keys
然後發給master2
scp id_rsa_m.pub ubuntu@master2:~/.ssh
切換到master2,執行
cd ~
cd .ssh
cat id_rsa_m.pub >> authorized_keys
切換master,執行

ssh master2

成功登陸到了master2

ubuntu@master2:
exit
ubuntu@master:
3、安裝jdk
jdk版本: jdk-8u91-linux-x64.tar.gz   117.118M
將jdk-8u91-linux-x64.tar.gz拷貝至master的/tmp目錄下,解壓至 /home/ubuntu/solf下,
所有與hadoop有關的軟件我們都將安裝到這個目錄
    開始解壓
tar -zxvf jdk-8u91-linux-x64.tar.gz -C /home/ubuntu/solf
cd ~/solf
ls
  jdk1.8.0_91
   添加環境變量,編輯/etc/profile,在文件末尾添加如下內容
JAVA_HOME = /home/ubuntu/solf/jdk1.8.0_91
export PATH=$PATH:$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/jre

source /etc/profile

ubuntu@master:~/solf$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
        表示jdk安裝成功

4、安裝hadoop
hadoop版本:hadoop-2.7.2.tar.gz   207.077M
將hadoop-2.7.2.tar.gz解壓至 /home/ubuntu/solf
tar -zxvf hadoop-2.7.2.tar.gz -C /home/ubuntu/solf
ls
hadoop-2.7.2 jdk1.8.0_91
     添加環境變量,編輯/etc/profile,在文件末尾添加如下內容
HADOOP_INSTALL =/home/ubuntu/solf/hadoop-2.7.2
export PATH=$PATH:$HADOOP_INSTALL
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin

source /etc/profile
ubuntu@master:~/solf$ hadoop version
Hadoop 2.7.2
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41
Compiled by jenkins on 2016-01-26T00:08Z
Compiled with protoc 2.5.0
From source with checksum d0fda26633fa762bff87ec759ebe689c
This command was run using /home/ubuntu/solf/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar
表示hadoop安裝成功

5、配置hadoop環境
   hadoop可以配置爲三種模式:獨立、僞分佈、全分佈(集羣)模式
   爲了讓我們的hadoop能夠在各種模式中切換,此處需做一個鏈接操作
   cd ~
   cd solf
   爲了以後cd時方便,此處給hadoop-2.7.2做一個鏈接
   ln -s hadoop-2.7.2 hadoop
   
   cd ~/solf/hadoop/etc/
   ls
   hadoop
   此時只有一個hadoop目錄,此目錄是hadoop默認的配置文件的目錄,如果要做模式切換一個目錄肯定是不行的
   cp -r hadoop hadoop-full    //集羣模式
   cp -r hadoop hadoop-local   //獨立模式
   cp -r hadoop hadoop-presudo   //僞分佈模式
   rm -r hadoop                     //刪除原來的目錄
   如果當前我想使用集羣模式則(其他模式同理)
   ln -s hadoop-full hadoop
   ls -l
         lrwxrwxrwx 1 ubuntu ubuntu   11 Aug  3 07:21 hadoop -> hadoop-full
   drwxr-xr-x 2 ubuntu hadoop 4096 Aug  1 09:55 hadoop-full
drwxr-xr-x 2 ubuntu hadoop 4096 Aug  1 09:55 hadoop-local
drwxr-xr-x 2 ubuntu hadoop 4096 Aug  1 09:55 hadoop-presudo
   此時默認的配置文件指向了hadoop-full
   
   下面來詳細配置hadoop-full中的文件:
    (1)hadoo-env.sh
    只需修改一行,JAVA_HOME配置成/etc/profile裏面 JAVA_HOME的路徑,最好使用絕對路徑
export JAVA_HOME=/home/ubuntu/solf/jdk1.8.0_91
(2)core-site.xml
<!-- 指定hdfs的nameservice爲ns1,ns1中包含了兩個namenode,保證一個namenode宕機了能夠順利由另一個接管-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定定位臨時文件的目錄,默認指向/tmp,該目錄會在重啓後被清空-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/ubuntu/solf/hadoop/tmp</value>
</property>
<!-- 指定zookeeper安裝的位置,此處將在slave1,slave2,slave3上安裝zk,注意安裝zk的機器數一定是大於等於3的奇數-->
<property>
<name>ha.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
(3)hdfs-site.xml
   <!--指定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>master:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>master2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>master2:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/ubuntu/solf/hadoop-2.7.2/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
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--防止出現不允許遠程讀寫hdfs-->    
<property>    
<name>dfs.permissions</name>
<value>false</value>    
</property>  
<!--namenode每三秒發一個心跳信號-->    
<property>    
<name>dfs.heartbeat.interval</name> 
<value>3</value>    
</property>
<!--心跳機制recheck的間隔-->    
<property>    
<name>dfs.namenode.heartbeat.recheck-interval</name> 
<value>35000</value>    
</property>
(4)mapred-site.xml
原目錄下沒有mapred-site.xml,需要cp
cp mapred-site.xml.template mapred-site.xml
修改如下:
<!--指定MapReduce使用的框架是yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(5)yarn-site.xml
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>rm</value>
</property>
<!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
(6)slaves 指定datanode的主機名
slave1
slave2
slave3
   
6、將jdk和hadoop環境發送至所有的機器
cd ~
scp -r solf ubuntu@master2:/home/ubuntu
scp -r solf ubuntu@rm:/home/ubuntu
scp -r solf ubuntu@slave1:/home/ubuntu
scp -r solf ubuntu@slave2:/home/ubuntu
scp -r solf ubuntu@slave3:/home/ubuntu
     
cd /etc
su
切換root用戶
root@master:/etc
scp profile root@master2:/etc
scp profile root@rm:/etc
scp profile root@slave1:/etc
scp profile root@slave2:/etc
scp profile root@slave3:/etc

分別進入到各臺機器中執行
source /etc/profile
java -version
hadoop version
如果都能正確顯示,則說明各臺機器上的jdk和hadoop環境都搭建好了

7、安裝配置zookeeper
zookeeper版本:zookeeper-3.4.5.tar.gz   16.018M
將zookeeper-3.4.5.tar.gz解壓至 /home/ubuntu/solf
tar -zxvf zookeeper-3.4.5.tar.gz -C /home/ubuntu/solf
ls

hadoop-2.7.2 jdk1.8.0_91 zookeeper-3.4.5

進入slave1
(1)修改配置
cd  ~/solf/zookeeper-3.4.5/conf
cp zoo_sample.cfg zoo.cfg
編輯
nano zoo.cfg
修改
dataDir=/home/ubuntu/solf/zookeeper-3.4.5/tmp
文件末尾添加
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888

(2)創建tmp文件
cd  ~/solf/zookeeper-3.4.5
mkdir tmp
cd tmp 
touch myid
echo 1 > myid
查看
cat myid
1
表示配置成功

(3)將配置好的zookeeper-3.4.5發送至slave2、slave3
cd  ~/solf
scp -r zookeeper-3.4.5  ubuntu@slave2:~/solf
scp -r zookeeper-3.4.5  ubuntu@slave3:~/solf

修改myid
slave2下:
echo 2 > myid

slave3下:
echo 3 > myid
至此,六臺機器的hadoop集羣就配置完成了。

啓動集羣:
嚴格按照下面的啓動順序
(1)啓動zk
在slave1 slave2 slave3下一次執行
cd ~/solf/zookeeper-3.4.5/bin
./zkServer.sh start
查看狀態
./zkServer.sh status
JMX enabled by default
Using config: /home/ubuntu/solf/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
查看進程
jps
51858 Jps
51791 QuorumPeerMain
(2)啓動journalnode
在master下,執行
hadoop-daemons.sh start journalnode
slave2: starting journalnode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-journalnode-slave2.out
slave1: starting journalnode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-journalnode-slave1.out
slave3: starting journalnode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-journalnode-slave3.out

在slave1 slave2 slave3上分別查看進程
51958 JournalNode
52007 Jps
51791 QuorumPeerMain
(3)格式化HDFS
如果hdfs從未格式化則在master下,執行
hdfs namenode -format

然後將 hadoop下的tmp文件發送給master3的hadoop目錄下
cd ~/solf/hadoop
scp tmp ubuntu@master2:~/solf/hadoop

(4)格式化zk
   在master下,執行
如果zookeeper從未格式化則在master下,執行
hdfs zkfc -formatZK

(5)啓動hdfs
   在master下,執行
   start-dfs.sh
master2: starting namenode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-namenode-master2.out
master: starting namenode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-namenode-master.out
slave2: starting datanode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-datanode-slave2.out
slave1: starting datanode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-datanode-slave1.out
slave3: starting datanode, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-datanode-slave3.out
Starting journal nodes [slave1 slave2 slave3]
slave2: journalnode running as process 2299. Stop it first.
slave1: journalnode running as process 2459. Stop it first.
slave3: journalnode running as process 51958. Stop it first.
Starting ZK Failover Controllers on NN hosts [master master2]
master: starting zkfc, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-zkfc-master.out
master2: starting zkfc, logging to /home/ubuntu/solf/hadoop-2.7.2/logs/hadoop-ubuntu-zkfc-master2.out

查看本機進程
jps
14481 NameNode
14885 Jps
14780 DFSZKFailoverController
12764 FsShell
查看slave1\2\3的java上的java 進程
jps
51958 JournalNode
52214 Jps
52078 DataNode
51791 QuorumPeerMain
(6)啓動yarn
   在rm下,執行
start-yarn.sh
jps
6965 ResourceManager
7036 Jps
查看slave1\2\3的java 進程
jps
52290 NodeManager
51958 JournalNode
52410 Jps
52078 DataNode
51791 QuorumPeerMain

   若所有進程都如上所示,則hadoop集羣就真正運行起來了,可在瀏覽器中輸入
    192.168.0.7:50070 查看集羣的情況

測試集羣:
1、測試namenode切換
(1)訪問192.168.0.7:50070
顯示 'master:9000'(active)
訪問192。168.0.10:50070
顯示'master2:9000'(standby)
表明當前namenode由master管理,master2作爲備用
(2)在master下kill掉namenode進程
kill -9 14481
jps
   14944 Jps
14780 DFSZKFailoverController
12764 FsShell
再次啓動namenode進程
hadoop-daemon.sh start namenode
            再執行(1)中的操作,顯示如下:
顯示'master:9000'(standby)
'master2:9000'(active)
 如此證明:zookeeper在namenode宕機的情況下能夠正常切換備用的namenode機器
 
2、驗證hdfs文件存儲系統
查看hdfs的文件結構
hadoop fs -ls -R /
 
創建solf文件夾
hadoop fs -mkdir /solf

上傳文件

cd 到文件所在目錄

hadoop fs -put spark-2.0.0-bin-without-hadoop.tgz /solf
查看hdfs的文件結構
hadoop fs -ls -R /
drwxr-xr-x   - ubuntu supergroup          0 2017-08-04 07:16 /solf
-rw-r--r--   3 ubuntu supergroup  114274242 2017-08-04 07:16 /solf/spark-2.0.0-bin-without-hadoop.tgz
        上傳成功!

3、運行wordcount程序
用eclipse生成wordcount.jar或者使用hadoop自帶的例子
將輸入文件上傳至hdfs
cd 到文件所在目錄
hadoop fs -put file*.txt /input

cd到wordcount.jar所在目錄
hadoop jar wordcount.jar  com.will.hadoop.WordCount  /input /wcout

17/08/04 07:42:01 INFO client.RMProxy: Connecting to ResourceManager atrm/192.168.0.8:8032
17/08/04 07:42:02 WARN mapreduce.JobResourceUploader: Hadoop command-line optionparsing not performed. Implement the Tool interface and execute your application withToolRunner to remedy this.
17/08/04 07:42:02 INFO input.FileInputFormat: Total input paths to process : 3
17/08/04 07:42:03 INFO mapreduce.JobSubmitter: number of splits:3
17/08/04 07:42:03 INFO mapreduce.JobSubmitter: Submitting tokens for job:job_1501854022188_0002
17/08/04 07:42:10 INFO impl.YarnClientImpl: Submitted applicationapplication_1501854022188_0002
17/08/04 07:42:11 INFO mapreduce.Job: The url to track the job:http://rm:8088/proxy/application_1501854022188_0002/
17/08/04 07:42:11 INFO mapreduce.Job: Running job: job_1501854022188_0002
17/08/04 07:42:26 INFO mapreduce.Job: Job job_1501854022188_0002 running in ubermode : false
17/08/04 07:42:26 INFO mapreduce.Job:  map 0% reduce 0%
17/08/04 07:42:48 INFO mapreduce.Job:  map 100% reduce 0%
17/08/04 07:43:10 INFO mapreduce.Job:  map 100% reduce 100%
17/08/04 07:43:11 INFO mapreduce.Job: Job job_1501854022188_0002 completedsuccessfully

打開/wcout/part-r-00000
I 2
apple 4
car 4
cat 4
exit 4
feel 2
first 3
good 4
good,so 2
gula
hadoop 3
happy 4
happy! 2
hello 1
is 3
my 3
pande 4
peer 4
quit 4
test 1
testxx 2
this 3

測試成功!
由此可見,hadoop集羣搭建成功!
接下來將陸續引入HBase、Hive至本集羣......


 
 










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章