分佈式集羣搭建(hadoop2.6.0+CentOS6.5)

摘要:以前安裝過hadoop1.2.1集羣,發現比較老了,後來安裝cloudera(hadoop2.6.0),發現集成度比較高,想知道原生的hadoop什麼樣子,因而着手搭建一個分佈式集羣(三臺),方便與cloudera的安裝進行對比,來更加深刻學習Hadoop整個生態系統。一開始安裝的CentOS7,發現好多命令都變了,時間成本比較高,爲了之後少些麻煩,仍是果斷換回CentOS6.5了,hadoop果斷選擇2.6.0了。太新的版本須要額外時間來了解,對於加班較多的來講,學習成本過高了。在安裝過程,遇到了好多細節問題,真是「紙上得來終覺淺,絕知此事要躬行」!

在實際安裝以前,先簡單說下VMWare的網絡模式:java

■ VMNet1:使用的是host-only的連接模式,即虛擬機只能與主機構成內部通訊,沒法對外網進行訪問node

■ VMNet0:模式:使用橋接模式,安裝VM後,在VM裏創建虛擬機 默認 就是該模式。linux

      場景:若是你只是須要一臺虛擬機能夠和宿主互通,並能夠訪問外網,此模式便可。ios

      描述:安裝虛擬機系統後不須要調整網絡,物理網絡中的 「路由」 所包含的DHCP服務器會自動識別該虛擬機併爲其分配IP地址。若是沒有路由,能夠本身手動在系統分配,原則是和宿主機在同一網段並指向相同的網關便可通訊。
■ VMNet8 模式:NAT網絡模式web

      場景:在宿主機安裝多臺虛擬機,和宿主組成一個小局域網,宿主機,虛擬機之間均可以互相通訊,虛擬機也可訪問外網。例如 搭建 hadoop 集羣,分佈式服務。vim

1.hadoop集羣規劃

192.168.10.11  hadoop1  namenodewindows

192.168.10.12  hadoop2  datanodecentos

192.168.10.13  hadoop3  datanode緩存

2.安裝三臺CentOS虛擬機,配置網絡模式爲NAT

本人電腦HP筆記本8G內存,三臺虛擬機內存都設爲1G,啓動時若提示「此主機支持 Intel VT-x,但 Intel VT-x 處於禁用狀態」,進bios設置選項「處理器虛擬化技術」爲enabled。服務器

打開VMWare,文件->新建虛擬機,選擇CentOS7系統,依次點擊下一步完成添加虛擬機,三臺虛擬機名稱依次爲:centos6.5_1,centos6.5_2,centos6.5_3.

安裝完成後,打開VMWare,編輯->虛擬網絡編輯器,修改VMnet8的子網IP爲192.168.10.0

 點擊上圖中的「NAT設置」,確認網關爲192.168.10.2 

 

 回到windows,打開網絡和共享中心->更改適配器設置->右鍵VMnet8->屬性,確認IPv4爲:192.168.10.1

 

選中虛擬機 -> 右鍵設置 -> 網絡適配器 - 確認爲NAT模式->肯定    

測試虛擬機網絡,使用ifconfig命令查看ip地址,看到以下:

配置ip地址:vi  /etc/sysconfig/network-scripts/ifcfg-eth0

注:ONBOOT="yes",這樣在重啓的時候會自動啓動網卡;BOOTPROTO="dhcp"應改成none,不然設置的ip和看到的會不一樣;DNS1設置爲VMnet8的網關,才能夠經過主機訪問外網;

重啓網絡服務:service network restart
三臺虛擬機依次設置IP爲192.168.10.11,192.168.10.12,192.168.10.13
至此虛擬機已能夠訪問外網,windows主機與虛擬機能夠互相ping通,並均可以訪問外網。原來虛擬機裏的網絡這麼多設置的,學習了。雖然花了好長時間才整好網絡,但仍是頗有知足感的,「絕知此事要躬行」啊!

3.修改三臺節點主機名及與IP映射關係

修改主機名:
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop1

重啓網絡服務生效

修改主機名和IP的映射關係:
vi /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.11 hadoop1
192.168.10.12 hadoop2
192.168.10.13 hadoop3

注意:這裏須要將每臺機器的ip及主機名對應關係都寫進去.

4.關閉防火牆

#查看防火牆狀態
service iptables status
#關閉防火牆
service iptables stop
#查看防火牆開機啓動狀態
chkconfig iptables --list
#關閉防火牆開機啓動
chkconfig iptables off

5.重啓Linux

reboot

6.無祕鑰認證

(1) ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
(2) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
     把暴露出來的公共密鑰按順序導入authorized_keys中保存
(3) chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    注:ssh機制很嚴謹,對文件的權限要求很是嚴格,這裏須要把.ssh文件夾的權限設置爲700(只有全部者有讀和寫以及執行的權限),authorized_keys的權限設置爲600(只有全部者有讀和寫的權限)
(4) ssh hadoop2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    ssh hadoop3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    scp authorized_keys hadoop@HDS02:/home/hadoop/.ssh/
    scp authorized_keys hadoop@HDS03:/home/hadoop/.ssh/
最終authorized_keys文件要有各個集羣服務器的信息
注:前三步在三個節點都執行,第四步在主節點執行。公鑰分發完成以後,最後隨機選兩臺服務器,進行無密碼登陸驗證是否異常。各個節點之間的無祕鑰認證須要測試經過才能進行下一步

 

7.NTP時間同步

集羣中全部主機必須保持時間同步,若是時間相差較大會引發各類問題。具體思路以下:master節點做爲ntp服務器,對全部datanode節點提供時間同步服務。全部datanode節點以master節點爲基礎同步時間
全部節點安裝相關組件:yum install ntp。完成後,配置開機啓動:chkconfig ntpd on,檢查是否設置成功:chkconfig --list ntpd其中2-5爲on狀態就表明成功

7.1主節點配置

編輯NTP服務端配置文件ntp.conf,使用local時間做爲ntp服務提供給ntp客戶端:
# vi /etc/ntp.conf
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

配置文件完成,保存退出,啓動服務,執行以下命令:service ntpd start
檢查是否成功,用ntpstat命令查看同步狀態,出現如下狀態表明啓動成功:
synchronised to NTP server (xxx.xxx.xxx.xxx) at stratum 4
time correct to within 75 ms
polling server every 1024 s
若是出現異常請等待幾分鐘,通常等待5-10分鐘才能同步

7.2配置ntp客戶端

編輯全部datenode節點的NTP服務端配置文件ntp.conf,配置server爲主節點的主機名或IP:
# vi /etc/ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool .
# 這裏是主節點的主機名或IP
server xxx.xxx.xxx.xxx
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

ok保存退出,啓動datanode節點的ntp服務,先手動同步一下主節點,經過ntpstat查詢是否同步成功:
# service ntpd start
# ntpdate –u –hadoop1
# ntpstat

注:須要多等待一下子才能夠正常同步時間。

8.安裝JDK(三臺)

(1)卸載自帶openjdk
使用rpm -qa | grep java查詢java相關的包,使用rpm -e --nodeps包名卸載
(2)解壓jdk包
tar -zxf jdk-7u75-linux-x64.tar.gz –C /opt
(3)環境變量配置
vi/etc/profile
##jdk
export JAVA_HOME=/opt/jdk1.7.0_75
export JRE_HOME=/opt/jdk1.7.0_75/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

#刷新配置
source /etc/profile
(4)JDK版本驗證
java -version

#which java 檢查java安裝目錄
#env|grep JAVA_HOME 檢查是否配置JAVA_HOME
這裏遇到一個小問題,我是在window用SecureCRT執行的source,在虛擬機看java版本提示沒有,再次source能夠看到了:這個文件通常是linux系統中存在,是在開機加載系統時或登陸時執行的一個配置文件,其主要功能相似初始化一些環境變量。

9.安裝hadoop(三臺)

先上傳hadoop的安裝包到hadoop1上去/soft,使用 tar -zxf hadoop-2.6.0.tar.gz -C /opt解壓. 注意:hadoop2.x的配置文件$HADOOP_HOME/etc/hadoop,這裏即:/opt/hadoop-2.6.0/etc/hadoop
每臺機器服務器都要配置,且都是同樣的,配置完一臺其餘的只須要拷貝,每臺機器上的core-site.xml和mapred-site.xml都是配master服務器的hostname.

9.1配置hadoop

第一個:hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/jdk1.7.0_75

第二個:core-site.xml
<!-- 指定HADOOP所使用的文件系統schema(URI),HDFS的老大(NameNode)的地址 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop1:9000</value>
</property>

<property>
  <name>io.file.buffer.size</name>
  <value>131072</value>
  <description>Size of read/write buffer used inSequenceFiles.</description>
</property>

<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/hadoop-2.6.0/tmp</value>
</property>
注:hadoop訪問文件的IO操做都須要經過代碼庫。所以,在不少狀況下,io.file.buffer.size都被用來設置緩存的大小。不管是對硬盤或者是網絡操做來說,較大的緩存均可以提供更高的數據傳輸,但這也就意味着更大的內存消耗和延遲。這個參數要設置爲系統頁面大小的倍數,以byte爲單位,默認值是4KB,通常狀況下,能夠設置爲64KB(65536byte)。
注:hadoop.tmp.dir 是hadoop文件系統依賴的基礎配置,不少路徑都依賴它。若是hdfs-site.xml中不配置namenode和datanode的存放位置,默認就放在這個路徑中。

第三個:hdfs-site.xml
建立目錄:
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/name
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/data
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/namesecondary

修改配置文件
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop1:50090</value>
  <description>The secondary namenode http server address andport.</description>
</property>

<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/name</value>
  <description>Path on the local filesystem where the NameNodestores the namespace and transactions logs persistently.</description>
</property>

<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/data</value>
  <description>Comma separated list of paths on the local filesystemof a DataNode where it should store its blocks.</description>
</property>

<property>
  <name>dfs.namenode.checkpoint.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/namesecondary</value>
  <description>Determines where on the local filesystem the DFSsecondary name node should store the temporary images to merge. If this is acomma-delimited list of directories then the image is replicated in all of thedirectories for redundancy.</description>
</property>

<!-- 指定HDFS副本的數量 -->
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>

<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>

注: 屬性「dfs.namenode.name.dir」表示NameNode存儲命名空間和操做日誌相關的元數據信息的本地文件系統目錄,該項默認本地路徑爲」/tmp/hadoop-{username}/dfs/name」;
      屬性」dfs.datanode.data.dir「表示DataNode節點存儲HDFS文件的本地文件系統目錄,由」file://本地目錄」組成,該項默認本地路徑爲」/tmp/hadoop-{username}/dfs/data」。
      屬性「dfs.namenode.secondary.http-address」表示SecondNameNode主機及端口號(若是無需額外指定SecondNameNode角色,能夠不進行此項配置);

第四個:mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<!-- 指定mr運行在yarn上 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop1:10020</value>
  <description>MapReduce JobHistoryServer IPC host:port</description>
</property>

<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop1:19888</value>
  <description>MapReduce JobHistoryServer Web UI host:port</description>
</property>
注:屬性「mapreduce.framework.name」表示執行mapreduce任務所使用的運行框架,默認爲local,須要將其改成」yarn」
注:Hadoop自帶了一個歷史服務器,能夠查看已經運行完的Mapreduce做業記錄,好比用了多少個Map、用了多少個Reduce、做業提交時間、做業啓動時間、做業完成時間等信息。默認狀況下,Hadoop歷史服務器是沒有啓動的,能夠經過下面的命令來啓動Hadoop歷史服務器$ sbin/mr-jobhistory-daemon.sh start historyserver。這樣咱們就能夠在相應機器的19888端口上打開歷史服務器的WEB UI界面。能夠查看已經運行完的做業狀況。
注:Hadoop2.x中沒有jobtracker、tasktracker,改成如今的ResourceManager、NodeManger
第五個:yarn-site.xml
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop1</value>
</property>
<!-- reducer獲取數據的方式 中間數據調度使用的機制 -->
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
注:yarn.nodemanager.aux-services,NodeManager上運行的附屬服務。需配置成mapreduce_shuffle,纔可運行MapReduce程序。

[root@hadoop1 opt]# scp -r hadoop-2.6.0/ root@hadoop2:/opt/
[root@hadoop1 opt]# scp -r hadoop-2.6.0/ root@hadoop3:/opt/
注:這裏將配置完的hadoop整個文件複製到hadoop2和hadoop3的時候,用的是cp -r,複製完成後發現hadoop2和hadoop3的文件大小比hadoop大1M,應該同樣纔對啊,一級一級目錄找吧,確定有不同的。果真,native的大小不同,這裏有個軟連接:當用cp命令copy一個軟連接時,copy的是軟連接所對應的內容,而不是它自己。要直接cp軟連接就須要加-d參數。

9.2配置Slaves文件

只須要namenode節點機,這裏的HDM01既作namenode也兼datanode,通常狀況namenode要求獨立機器,namenode不兼datanode
vi /opt/etc/hadoop/slaves,配置以下內容:
hadoop2
hadoop3

9.3將hadoop添加到環境變量

vim /etc/proflie
export HADOOP_HOME=/opt/hadoop-2.6.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile

9.4格式化namenode

hdfs namenode -format
報警告:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
由於官方提供的lib目錄中.so文件是在32位系統下編譯的,若是是64位系統,須要本身下載源碼在64位上從新編譯。下載hadoop-native-64-2.6.0.tar解壓替換native文件夾內容。
[root@hadoop1 soft]# tar -xvf hadoop-native-64-2.6.0.tar -C /opt/hadoop-2.6.0/lib/native/

9.5啓動hadoop

sbin/start-all.sh

提示已過期,執行stop-all.sh中止。從新啓動:
先啓動HDFS:sbin/start-dfs.sh
再啓動YARN: sbin/start-yarn.sh

9.6驗證是否啓動成功 使用jps命令驗證


查看集羣狀態:
[root@hadoop1 bin]# hdfs dfsadmin -report

http://192.168.1.101:50070 (HDFS管理界面)

http://192.168.1.101:8088 (MR管理界面)

相關文章
相關標籤/搜索