1. 程式人生 > >在Linux的Centos6.5搭建hadoop叢集環境

在Linux的Centos6.5搭建hadoop叢集環境

Centos6.5搭建hadoop叢集環境

先概括一下整體思路

  1. 安裝centos6.5主機
  2. 關閉防火牆和selinux
  3. 配置網路
  4. 時間同步
  5. ssh無密碼登入設定
  6. 安裝jdk
  7. 安裝hadoop
  8. 啟動
  9. wordcount測試
  • 安裝centos6.5主機
  1. 使用vmware建立三臺centos作業系統

本人的三臺主機名與IP如下:

master              192.168.9.128

slave1               192.168.9.129

slave2               192.168.9.130

  1. 新增使用者

三臺主機都新增相同名稱與密碼的普通使用者,如 michael

useradd   michael

passwd    michael      --------設定密碼

  1. 修改hosts檔案

修改三臺虛擬主機的hosts檔案,保持一樣

vi   /etc/hosts,  

追加:

192.168.9.128    master

192.168.9.129         slave1

192.168.9.130         slave2

  • 關閉防火牆與SELINUX

1、防火牆

#service iptables stop

#service ip6tables stop

這個命令可以臨時關閉防火牆

 

#chkconfig iptables off

#chkconfig ip6tables off

這個命令可以永久關閉防火牆

 

#chkconfig iptables --list

#chkconfig ip6tables --list

這個命令可以檢視防火牆的狀態

2、SELINUX服務

# vi /etc/selinux/config

 

將檔案裡標紅的部分改為disabled

 

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

 

重啟後永久關閉selinux

 

#sestatus -v

這個命令可以檢視selinux的狀態

 

#setenforce 0

這個命令可以臨時關閉selinux

 

 

 

三、配置網路

配置IP有兩種方式:自動獲取ip和設定靜態IP

A、自動獲取ip

# vi  /etc/sysconfig/network-scripts/ifcfg-eth0

ONBOOT=yes---------設定開機自動啟用網絡卡

1、橋接模式:

相當於連線到物理機所在的網路中,與物理機的ip處在同一ip段位上,物理機網路的DHCP會自動分配ip給虛擬主機

2、Nat模式:

相當於連線到物理機的VMnet8網路中,與VMnet8處在同一ip段位上,同樣,VMnet8會自動分配ip給虛擬主機

修改設定後,重置網路服務

#  service  network   restart

B、設定靜態ip

只需要檢視我註釋的幾項即可,沒有就新增

1、橋接模式:

DEVICE=eth0

TYPE=Ethernet

UUID=edece2c6-947e-4e8b-ab2e-43ed59c6a614

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=static  ----------修改成staticnone都行

HWADDR=00:0C:29:5e:1f:c3

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

IPADDR=192.168.1.200   ----------設定成你想要的IP(與物理機在同一段位)

NETMASK=255.255.255.0   --------子網掩碼

GATEWAY=192.168.1.1    ----------閘道器(與物理機一致)

 

 

2、Nat模式

DEVICE=eth0

TYPE=Ethernet

UUID=edece2c6-947e-4e8b-ab2e-43ed59c6a614

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=static     -----------修改成static

HWADDR=00:0C:29:5e:1f:c3

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

IPADDR=192.168.9.200    -----------設定成你想要的(VMnet8在同一段位即可)

NETMASK=255.255.255.0   --------子網掩碼

GATEWAY=192.168.9.2   ----------閘道器(需設定成VMnet8提供的閘道器,一般結尾都是2)

DNS1=192.168.9.2     --------------DNS設定成與閘道器一致即可

 

PS:不管什麼模式,去修改/etc/resolv.conf  新增

nameserver  閘道器ip

3、總結:

我們的目的是,三臺主機能互相ping通,並能ping通物理機或者外網,以及物理機能ping通虛擬主機

四、時間同步

在Linux中有硬體時鐘與系統時鐘等兩種時鐘。硬體時鐘是指主機板上的時鐘裝置,也就是通常可在BIOS畫面設定的時鐘。系統時鐘則是指kernel中的時鐘。所有Linux相關指令與函式都是讀取系統時鐘的設定。因為存在兩種不同的時鐘,那麼它們之間就會存在差異。當Linux啟動時,系統時鐘會去讀取硬體時鐘的設定,之後系統時鐘即獨立運作。

因此我們需要通過hwclock命令將系統時鐘同步到硬體時鐘。

 

1、檢視系統當前時間

例子1

[[email protected] michael]# date

2018年 05月 10日 星期四 15:19:12 CST

 

例子2

[[email protected] michael]# date '+%y-%m-%d %H:%M:%S'

18-05-10 15:23:14

 

2、設定系統時間

#只有root許可權才能設定,其他只能檢視。

 

例子1:

[[email protected] michael]# date -s 20180510

2018年 05月 10日 星期四 00:00:00 CST

 

例子2:

[[email protected] michael]# date -s "20180510 15:18:00"

2018年 05月 10日 星期四 15:18:00 CST

3、Linux系統時間同步

一臺機器時間好設定,如果是一個叢集呢,很麻煩。這個時候,我們可以使用時間同步命令(此時,可以忽略第二步)

 

格式如下:

#  ntpdate      -u   時間伺服器IP

 

例子1:

[[email protected] michael]# ntpdate -u time.windows.com

10 May 15:26:28 ntpdate[6453]: adjust time server 52.168.138.145 offset -0.010554 sec

 

若不加上-u引數, 會出現以下提示:no server suitable for synchronization found;連不上時間伺服器IP也會出現此提示,這個時候可以換一個時間伺服器。

 

-u:此引數可以越過防火牆與主機同步

最後,我們將系統時間同步到硬體時鐘上,輸入命令:

hwclock  -w

 

備註:    ntp常用伺服器:

 

中國國家授時中心:210.72.145.44

NTP伺服器(上海) ntp.api.bz

美國: time.nist.gov

復旦: ntp.fudan.edu.cn

微軟公司授時主機(美國) time.windows.com

北京郵電大學 : s1a.time.edu.cn

清華大學 : s1b.time.edu.cn

北京大學 : s1c.time.edu.cn

臺警大授時中心(臺灣)asia.pool.ntp.org

五、ssh無密碼登入

Hadoop執行過程中需要管理遠端Hadoop守護程序,在Hadoop啟動以後,NameNode是通過SSH(Secure Shell)來啟動和停止各個DataNode上的各種守護程序的。這就必須在節點之間執行指令的時候是不需要輸入密碼的形式,故我們需要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登入並啟動DataName程序,同樣原理,DataNode上也能使用SSH無密碼登入到NameNode。

  1. SSH無密碼原理

Master(NameNode)作為客戶端,要實現無密碼連線到伺服器Slave(DataNode)上時,需要在Master上生成一個金鑰對,即一個公鑰和一個私鑰,然後將公鑰複製到所有的Slave上。當Master通過SSH連線Slave時,Slave就會生成一個隨機數並用Master的公鑰對隨機數進行加密,併發送給Master。Master收到加密數之後再用私鑰解密,並將解密數回傳給Slave,Slave確認解密數無誤之後就允許Master進行連線了。這就是一個公鑰認證過程,其間不需要使用者手工輸入密碼

我們所需要做的就是將客戶端Maste的公鑰複製到Slave上。

  1. Master無密碼登入slave1

     使用普通使用者進行設定,儘可能的不要使用root使用者

  1. 生成金鑰

輸入命令:ssh-keygen –t     rsa 

一路回車下去,就會在相應的使用者的主目錄下生成隱藏目錄.ssh。裡面有一個私鑰檔案id_rsa和一個公鑰檔案id_rsa.pub

  1. 無密碼登入自己

進入.ssh目錄,將公鑰檔案更名為authorized_keys檔案,即可實現ssh連線自己不再需要密碼。確保authorized_keys的許可權為600

$  mv    id_rsa.pub    authorized_keys

結果驗證

ssh            localhost

成功後,最好刪除id_rsa.pub檔案

  1. 拷貝authorized_keys到虛擬主機slave1

首先要確保slave1的使用者的主目錄下有隱藏目錄.ssh

沒有的話,創建出來

$ mkdir  ~/.ssh

修改許可權為700

$ chmod 700 ~/.ssh

然後拷貝

scp  ~/.ssh/authorized_keys  [email protected]:~/.ssh/authorized_keys

輸入yes,回車輸入密碼

  1. 結果驗證

複製成功後,開始連線進行驗證

ssh   [email protected]

此時,發現連線slave1時,無需在輸入密碼了 ^_^

PS: master無密碼登入slave2,就重複第三步和第四步

  1. slave1無密碼登入master

依然使用普通使用者michael進行設定

  1. 生成金鑰

 通過輸入命令:ssh-keygen  -t   rsa  ,一路回車,生成slave1的私鑰和公鑰檔案

  1. 無密碼登入自己

進入隱藏目錄~/.ssh

將公鑰檔案內容追加到authorized_keys檔案中。(注意,此時authorized_keys裡已經存在master主機的公鑰)

$  cat  id_rsa.pub  >>  authorized_keys

進行驗證:ssh  localhost

  1. 拷貝公鑰檔案到master

我們需要將slave1的公鑰備份到master主機上

scp   ~/.ssh/id_rsa.pub  [email protected]:~/.ssh/id_rsa.pub_slave1

yes

輸入密碼,回車

  1. 追加slave1公鑰檔案到authorized_keys中

然後連線master,  將slave1的公鑰追加到master的authorized_keys檔案中

ssh   [email protected] 輸入密碼登入

cat  ~/.ssh/id_rsa.pub_slave1 >>  ~/.ssh/authorized_keys

  1. 進行驗證

退回到slave1中,

$  exit

進行驗證,輸入

$  ssh [email protected],  看看是否需要密碼,應該成功。

 

如果想slave2無密碼登入master,只需要重複slave1登入master的步驟即可

六、安裝jdk

很多新手在安裝軟體時,安裝路徑都是模稜兩可的,對於安裝後產生的軟體檔案,儲存位置更是亂七八糟,甚至一個目錄中有好幾個軟體的相關檔案。這是一個非常不好的習慣。所以,我們最好養成一個良好習慣,所有的軟體都安裝到某一個父目錄中,比如:/home/michael/soft。然後我們在此目錄下再建立相應軟體名的子目錄管理安裝時產生的軟體檔案~~~如下:
/home/michael/soft/jdk

/home/michael/soft/hadoop

/home/michael/soft/eclipse

 

在這裡,我只講.tar.gz格式的jdk安裝   (點這裡進入jdk各個歷史版本下載頁面)

準備工作:使用普通使用者michael 上傳jdk-8u162-linux-x64.tar.gz安裝包到master主機的目錄soft下

第一步: 檢視

檢視是否安裝過其他的jdk軟體包:# rpm -qa | grep  java

第二步: 解除安裝

如果第一步中有查出安裝過,此時需要切換到root使用者下進行解除安裝。

 命令格式: # rpm -e --nodeps  軟體包名

第三步:解壓

注意:一定要切換回普通使用者

將壓縮包解壓到當前目錄下

$  tar   -zvxf   jdk-8u162-linux-x64.tar.gz

檢視一下:ls

第四步: 建軟連結檔案

最好建立軟連線,方便以後更換jdk版本時,不用更改環境變數配置

命令格式:

$ ln  -s  jdk1.8.0_162   jdk

第五步: 配置環境變數

配置環境變數有三種檔案可修改(/etc/profile   ~/.bash_profile   ~/.bashrc),在這裡,我選擇了/etc/profile,這個檔案需要切換成root使用者

 

# vi  /etc/profile    --追加如下資訊:

JAVA_HOME=/home/michael/soft/jdk

JRE_HOME=$JAVA_HOME/jre

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export  JAVA_HOME   JRE_HOME   CLASSPATH   PATH

第六步: 生效配置檔案

重啟機器

# reboot

或者也可以使用命令

# source /etc/profile

第七步:  測試

使用命令

$  java -version   回車

$  javac        回車

 出現資訊翻滾,即配置成功

第八步:其他機器安裝JDK

  • 其他兩臺虛擬主機slave1,slave2也可以安裝上述步驟去安裝。
  • 也可以使用scp命令將解壓好的軟體包和配置檔案拷貝過去。拷貝時一定要思考,應該使用什麼使用者去做。否則出現許可權問題。

我選擇拷貝。

 

使用普通使用者michael,拷貝安裝包

$  scp  ~/soft/ jdk1.8.0_162  [email protected]:~/soft/ jdk1.8.0_162

(ps:如果@slave1不好使的話,寫slave1的IP地址)

使用root使用者拷貝配置檔案

#  scp  /etc/profile  [email protected]:/etc/profile

PS:如果slave1中沒有soft目錄,在拷貝時可能會出現錯誤,建議先創建出來

 

然後ssh連線slave1建立軟連結。

$  ln  -s  jdk1.8.0_162   jdk

slave2亦是如此

 

PS:詳情可見http://blog.sina.com.cn/s/blog_182e362f60102x0uh.html

 

七、安裝hadoop

準備工作,使用普通使用者將安裝包hadoop2.7.3.tar.gz上傳到master主機中的soft目錄下

 

1、解壓

$  tar  -zvxf    hadoop2.7.3.tar.gz

檢視 $  ls

2、建立軟連線

$  ln   -s   hadoop-2.7.3   hadoop

4、配置環境變數

此時,要切換到root使用者下,進行修改檔案/etc/profile,追加內容

HADOOP_HOME=/home/michael/soft/hadoop

PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_HOME PATH

 

儲存退出,重置檔案生效。hdfs  -version查一下

5、建立目錄

我們需要在hadoop的根目錄~/soft/hadoop下建立四個目錄,用於進行存放以後產生的資料。 命令:mkdir     dfs   dfs/name   dfs/data   tmp

 

dfs是name和data的父目錄

name:--------------------namenode例項的儲存目錄

data:---------------------datanode例項的儲存目錄

tmp:---------------------臨時檔案的儲存目錄

6、修改hadoop的配置檔案

   我們需要修改hadoop中etc/hadoop下的六個檔案:core-site.xml、hdfs-site.xml、

mapred-site.xml、yarn-site.xml、以及hadoop-env.sh、slaves

1)、修改core-site.xml

<configuration>

  <property>

        <name>fs.defaultFS</name>    #預設檔案系統名稱,用於指定host,post

        <value>hdfs://master:9000</value>

  </property>

  <property>

       <name>hadoop.tmp.dir</name>  #指定臨時檔案的儲存路徑

       <value>file:/home/michael/soft/hadoop/tmp</value>

  </property>

  <property>

       <name>io.file.buffer.size</name>  #用於指定序列檔案的緩衝區大小

       <value>131702</value>

  </property>

</configuration>

2)、修改hdfs-site.xml

<configuration>

             <property>

                 <name>dfs.namenode.name.dir</name>      #用於指定namenode儲存路徑

            <value>file:/home/michael/soft/hadoop/dfs/name</value>

        </property>

        <property>

                <name>dfs.datanode.data.dir</name >  #用於指定datenode儲存路徑

                <value>file:/home/michael/soft/hadoop/dfs/data</value>

        </property>

        <property>

                <name>dfs.replication</name>  #用於指定副本個數

                <value>3</value>

        </property>

        <property>

                <name>dfs.namenode.secondary.http-address</name>  #二主節點的埠

                <value>master:9001</value>

        </property>

        <property>

                <name>dfs.webhdfs.enabled</name> 

                <value>true</value>        #啟用webHDFS檢測namenode和datanode

        </property>

</configuration>

3)、修改mapred-site.xml

此目錄下沒有該檔案,我們需要將mapred-site.xml.template 複製一份,改成此名。

然後再修改:

<configuration>

         <property>

                 <name>mapreduce.framework.name</name>

                <value>yarn</value>

        </property>

        <property>

                <name>mapreduce.jobhistory.address</name>  # Server IPC host:port

                <value>master:10020</value>

        </property>

        <property>

                <name>mapreduce.jobhistory.webapp.address</name>

                <value>master:19888</value>      # Server Web UI host:port

        </property>

</configuration>

4)、修改yarn-site.xml

<configuration>

 

<!-- Site specific YARN configuration properties -->

         <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> 

       <property> 

                <name>yarn.resourcemanager.address</name> 

                <value>master:8032</value> 

       </property> 

       <property> 

                <name>yarn.resourcemanager.scheduler.address</name> 

                <value>master:8030</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.resource-tracker.address</name> 

                <value>master:8031</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.admin.address</name> 

                <value>master:8033</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.webapp.address</name> 

                <value>master:8088</value> 

        </property> 

</configuration>

5)、修改hadoop-env.sh

開啟此檔案,重新設定JAVA_HOME的值。否則不能啟動  

# The java implementation to use.

#export JAVA_HOME=${JAVA_HOME}

export JAVA_HOME=/home/michael/soft/jdk

6)、修改slaves檔案

    開啟此檔案,刪除預設的localhost,增加兩個從節點

     slave1

slave2

7)、修改yarn-env.sh

我們最好也重新設定一下此檔案的java_home

# export JAVA_HOME=/home/y/libexec/jdk1.6.0/

export JAVA_HOME=/home/michael/soft/jdk---------------------增加內容

if [ "$JAVA_HOME" != "" ]; then

 

7、拷貝檔案

為了節省時間,不再重新配置hadoop的配置檔案和profile,我們將hadoop整個安裝包和profile通過scp命令 複製到另外兩臺slave1和slave2上的相應位置,不需要修改任何東西。

$  scp  -r  ~/soft/hadoop   [email protected]:~/soft/ hadoop-2.7.3

$  scp  -r  ~/soft/hadoop   [email protected]:~/soft/ hadoop-2.7.3

 

切換root使用者

#  scp   /etc/profile  [email protected]:/etc/profile

#  scp   /etc/profile  [email protected]:/etc/profile

別忘記建立軟連結檔案

$  ln   -s   hadoop-2.7.3   hadoop

8、重啟

此時,我們叢集搭建成功了,為了確保配置檔案生效,我們最好reboot所有的機器

八、啟動叢集

格式化

$  hdfs   namenode  -format           ------開始格式化分散式檔案系統

格式化過程中:檢視是否有什麼warn:有的話,請百度,修正後再進行後續操作

 

ps:格式化檔案系統就相當於格式化磁碟。頻繁的格式化會出現master不能啟動slave上的服務。

啟動

$  start-all.sh  -----------啟動叢集

檢視相關日誌資訊,有錯排錯

檢視程序

Jps 

 

檢視三臺虛擬主機的hadoop相關程序

[[email protected] hadoop]$  jps           --------------------master四個程序

10210 Jps

9698 SecondaryNameNode

9864 ResourceManager

9497 NameNode

 

[[email protected] hadoop]$  jps                    --------------------slave1三個程序

8071 NodeManager

8279 Jps

7961 DataNode

 

[[email protected] hadoop]$  jps                    --------------------slave2三個程序

 

5266 NodeManager

5155 DataNode

5444 Jps

 

Web訪問網頁

192.168.9.128:50070

192.168.9.128:8088

都出現兩個活躍節點,就完全配置成功

 

如果想使用master:50070 ,即用主機名代替ip,請修改window系統:

C:\Windows\System32\drivers\etc下的hosts檔案,新增ip-hostname鍵值對

如:

192.168.9.128   master

關閉叢集

stop-all.sh    關閉所有主機

總結

 如果格式化期間沒有錯誤、警告等,以後調錯,就不要再格式化,只需要進行 啟動,關閉,啟動等操作即可。

九、案例測試

     我們可以使用自帶的一個單詞統計程式wordcount 來統計某個檔案內的資訊。

     詳情請訪問:

http://blog.sina.com.cn/s/blog_182e362f60102x0mq.html