1. 程式人生 > >CentOS7安裝Hadoop2.7.3完整流程及總結

CentOS7安裝Hadoop2.7.3完整流程及總結

一、前言

  1. 配置一臺master伺服器,兩臺(或多臺)slave伺服器;

  2. master可以無密碼SSH登入到slave;

  3. 解除安裝centos7自帶的openjdk,通過SecureCRT的rz命令上傳jdk-7u79-linux-x64.tar.gz檔案到伺服器,解壓安裝JDK;

  4. 解壓安裝Hadoop,配置hadoop的core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml檔案,配置好之後啟動hadoope服務,用jps命令檢視狀態;

  5. 執行hadoop自帶的wordcount程式做一個Hello World例項。

二、準備工作

我的系統:
windows 10 家庭普通中文版
cpu:intel i5 2.2GHz
記憶體:8G
64位作業系統
需要準備的軟體和檔案(全部是64位安裝包)

三、安裝過程

提示:先建立一臺虛擬機器,安裝好centos7系統,使用VMware 的克隆功能,克隆另外兩臺虛擬機器。這樣可以節省時間。

3.1 虛擬機器設定

虛擬機器設定
當三臺虛擬機器安裝好之後,獲得它們的IP地址,並設定主機名,(根據實際IP地址和主機名)修改/etc/hosts檔案內容為:
192.168.186.128 master.hadoop
192.168.186.129 slave1.hadoop
192.168.186.130 slave2.hadoop

  1. vi /etc/hosts命令修改,然後儲存(vi的相關命令見引用來源16)
    這裡寫圖片描述
  2. more /etc/hosts檢視
    這裡寫圖片描述
  3. 重啟後,hosts生效。命令: reboot now

3.2 SSH免密碼登入

提示:我全程用的都是root使用者,沒有另外建立使用者。每臺伺服器都生成公鑰,再合併到authorized_keys。
1) CentOS預設沒有啟動ssh無密登入,去掉/etc/ssh/sshd_config其中2行的註釋,每臺伺服器都要設定,
查詢

#RSAAuthentication yes
#PubkeyAuthentication yes

修改成

RSAAuthentication yes
PubkeyAuthentication yes

2) 輸入命令,ssh-keygen -t rsa,生成key,都不輸入密碼,一直回車,/root就會生成.ssh資料夾,每臺伺服器都要設定,
3) 合併公鑰到authorized_keys檔案,在master伺服器,進入/root/.ssh目錄,通過SSH命令合併,(~/.ssh/id_rsa.pub 是省略的寫法,要根據實際路徑來確定)

cat id_rsa.pub>> authorized_keys
ssh root@192.168.186.129 cat ~/.ssh/id_rsa.pub >> authorized_keys
ssh root@192.168.186.130 cat ~/.ssh/id_rsa.pub >> authorized_keys

4) 把master伺服器的authorized_keys、known_hosts複製到slave伺服器的/root/.ssh目錄

scp -r /root/.ssh/authorized_keys root@192.168.186.129:/root/.ssh/  
scp -r /root/.ssh/known_hosts   root@192.168.186.129:/root/.ssh/

scp -r /root/.ssh/authorized_keys root@192.168.186.130:/root/.ssh/
scp -r /root/.ssh/known_hosts  root@192.168.186.130:/root/.ssh/

5) 完成後,ssh [email protected]、ssh [email protected]或者(ssh [email protected]、ssh [email protected] ) 就不需要輸入密碼直接登入到其他節點上。
這裡寫圖片描述

3.3 Secure CRT連線虛擬機器

  1. 在VMware中把三臺虛擬機器啟動,如下圖所示:
    這裡寫圖片描述
  2. 開啟SecureCRT,在一個session裡連線三臺虛擬機器,就可以登入實現操作。
    Fiel->Quick Connection
    Protocol:ssh2 前提條件是在3.2中實現了ssh免密碼登入
    Hostname:192.168.186.128 連線的主機名
    Username: root 連線主機的使用者名稱
    Connect
    依次連線好三臺虛擬機器
    這裡寫圖片描述
  3. 結果如下:
    這裡寫圖片描述
  4. 上傳windows系統中的檔案到虛擬機器中
    定位到要上傳檔案的目錄下,輸入命令:rz,回車後,彈出檔案選擇視窗,選擇檔案,點選add,再OK。檔案就上傳到當前伺服器的當前目錄下。
    rz命令如果沒有安裝,使用這個命令安裝:yum install lrzsz
    這裡寫圖片描述

3.4 安裝JDK

Hadoop2.7需要JDK7,由於我的CentOS自帶了OpenJDK,所以要先解除安裝,然後解壓下載的JDK並配置變數即可。
1) 在/home目錄下建立java目錄,然後使用rz命令,上傳“jdk-7u79-linux-x64.gz”到/home/java目錄下,
2) 解壓,輸入命令,tar -zxvf jdk-7u79-linux-x64.gz
3) 編輯 /etc/profile,在其末尾新增以下內容:

export JAVA_HOME=/home/java/jdk1.7.0_79
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

4) 使配置生效,輸入命令,source /etc/profile
5) 輸入命令,java -version,完成
這裡寫圖片描述

3.5 安裝Hadoop2.7.3

3.5.1 提要

1) secureCRT 上傳“hadoop-2.7.3.tar.gz”,放到/home/hadoop目錄下
2) 只在master伺服器解壓,再複製到slave伺服器(scp命令傳輸)
3) 解壓,輸入命令,tar -xzvf hadoop-2.7.3.tar.gz
4) 在/home/hadoop目錄下建立資料存放的資料夾,tmp、dfs、dfs/data、dfs/name(hdfs-site.xml檔案中會用到)

3.5.2 配置檔案

1./home/hadoop/hadoop-2.7.3/etc/hadoop目錄下的core-site.xml

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master.hadoop:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
    </property>
</configuration>

2.配置/home/hadoop/hadoop-2.7.3/etc/hadoop目錄下的hdfs-site.xml

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master.hadoop:50090</value>
    </property>
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
</configuration>

3.配置/home/hadoop/hadoop-2.7.3/etc/hadoop目錄下的mapred-site.xml

<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
          <final>true</final>
    </property>
  <property>
     <name>mapreduce.jobtracker.http.address</name>
     <value>master.hadoop:50030</value>
  </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master.hadoop:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master.hadoop:19888</value>
    </property>
    <property>
        <name>mapred.job.tracker</name>
        <value>http://master.hadoop:9001</value>
    </property>
</configuration>

4.配置/home/hadoop/hadoop-2.7.0/etc/hadoop目錄下的yarn-site.xml

<configuration>
 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>      <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master.hadoop:8032</value>
    </property>
    <property>
       <name>yarn.resourcemanager.scheduler.address</name>
        <value>master.hadoop:8030</value>
    </property>
    <property>
       <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master.hadoop:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master.hadoop:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master.hadoop:8088</value>
    </property>
     <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>master.hadoop</value>
</property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
    </property>
</configuration>

提示:yarn.nodemanager.resource.memory-mbr的值一定要注意,在最後的hello world程式執行時,會提示記憶體太小,(hadoop執行到mapreduce.job: Running job後停止執行 )我把它從1024改成了2048

5.配置/home/hadoop/hadoop-2.7.3/etc/hadoop目錄下hadoop-env.sh、yarn-env.sh的JAVA_HOME
取消註釋,設定為export JAVA_HOME=/home/java/jdk1.7.0_79

6.配置/home/hadoop/hadoop-2.7.3/etc/hadoop目錄下的slaves,刪除預設的localhost,增加2個slave節點:

slave1.hadoop
slave2.hadoop

7.將master伺服器上配置好的Hadoop複製到各個節點對應位置上,通過scp傳送

scp -r /home/hadoop  192.168.186.129:/home/
scp -r /home/hadoop  192.168.186.130:/home/
3.5.3 啟動hadoop

提示:在master伺服器啟動hadoop,各從節點會自動啟動,進入/home/hadoop/hadoop-2.7.0目錄,hadoop的啟動和停止都在master伺服器上執行。
1) 初始化,在hadoop-2.7.3目錄下輸入命令,bin/hdfs namenode –format
2) 啟動命令

sbin/start-dfs.sh
sbin/start-yarn.sh

這裡寫圖片描述
3) 輸入命令,jps,可以看到相關資訊
master上看到
這裡寫圖片描述
slave上
這裡寫圖片描述
4) 停止命令,依次執行:sbin/stop-dfs.sh、sbin/stop-yarn.sh
這裡寫圖片描述
至此,hadoop配置完成了。

四、Hadoop入門之HelloWorld程式

摘要:初步接觸Hadoop,必不可少的就是執行屬於Hadoop的Helloworld程式——wordcount,統計檔案中各單詞的數目。安裝好的Hadoop叢集上已有相應的程式。我們來驗證一下。

4.1 準備資料

在/home/hadoop下建立file資料夾,裡面生成file1.txt,file2.txt,file3.txt,file4.txt四個檔案
這裡寫圖片描述

4.2 然後把資料put到HDFS裡

這裡寫圖片描述

4.3 進入hadoop-mapreduce-examples-2.7.3.jar所在資料夾,使用pwd輸出當前目錄的路徑

這裡寫圖片描述

4.4 在/home/hadoop/hadoop-2.7.3目錄下執行命令

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input /output2

這裡寫圖片描述

INFO mapreduce.Job: Job job_1480100450381_0001 completed successfully
意味著執行成功,否則就要根據出錯資訊或者日誌排錯。其中,/output2是執行結果輸出目錄(因為之前已經存在了output檔案夾了),到此,HelloWorld就順利執行了,你可以用hadoop fs -cat /output2/part-r-* 命令來檢視結果.

4.5 結果如下

這裡寫圖片描述
檢視之前的檔案內容,對比上圖的結果。
這裡寫圖片描述

五、引用來源

六.總結

完成這次實驗花費了很長時間,從網上查詢大量的資訊,一步一步的實現,中途出現很多bug,大部分是配置檔案出錯。還有就是對Linux基本命令不熟悉,每遇到一個命令都要到網上去檢視它的用法。到最後配置hadoop的時候,一直不能發現數據節點,雖然程序啟動了。最後發現是hosts檔案的問題,解決方案見引用來源的第10條。最後執行wordcount遇到記憶體不足的問題,解決方案就是把yarn-site.xml檔案中的yarn.nodemanager.resource.memory-mb的值改成2048,大於程式執行所需要記憶體就行。這次實驗能夠成功,很開心自己能堅持完成。中途有幾次找不到原因,差點不想做了。在這裡感謝幫助我的關同學、章同學,鄭學長,以及感謝網路上的分享精神,向他們致敬!
回顧整個過程,我有幾點小體會:
1、網上的文章有很多,需要仔細甄別,不能直接拿來就用,出現問題的時候,要到網上去查詢原因。
2、出現錯誤時,從出錯資訊,日誌裡面找原因。
3、先思考再動手實踐,再思考,再實踐。知其然知其所以然。
4、不輕言放棄
5、遇到不能解決的問題,不要怕麻煩周圍的同學,多一個人能多一點思路。避免進入死衚衕,浪費時間。
6、做完實驗要做總結,做筆記。