1. 程式人生 > >Hadoop偽分散式、完全分散式搭建和測試(詳細版)

Hadoop偽分散式、完全分散式搭建和測試(詳細版)

安裝

Hadoop 入門學習,快速搭建偽分散式環境。

注:需要下載的安裝包在文章底部,請自行獲取。

1. 修改主機名

vim /etc/hostname
vim /etc/hosts
reboot

reboot 重啟主機使修改配置檔案生效,這裡我設定的主機名是 : cx。

注意:出於安全考慮,如果只想區域網訪問 127.0.0.1 cx 就可以 如果不在遠端伺服器,不在一個區域網,可以配置成 0.0.0.0 cx 執行所以IP都可以訪問 【hadoop安裝完成並正確啟動會,後檢視監聽埠 netstat -tpnl |grep 8020,就會看到你配置的IP及監聽的8020埠】

[root@cx hadoop]# cat /etc/hosts
0.0.0.0 cx 127.0.0.1 localhost 127.0.1.1 localhost ::1 localhos [root@cx hadoop]# netstat -tpnl |grep 8020 tcp 0 0 0.0.0.0:8020 0.0.0.0:* LISTEN 10046/java
[root@cx ~]# hostname
cx

2. 免密登陸

刪除已有的 ssh 配置,使用命令 rm -r ~/.ssh 進行刪除 ;
生成新的 ssh-key ,使用命令 ssh-keygen -t rsa ;
-為本機進行公鑰的註冊:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh-keygen  -t rsa
clear
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

或者 ssh-copy-id slave2形式 這個也可以自己給自己copy
ssh-copy-id cx
3. 安裝JDK
下載JDK包,開始安裝,預設安裝的位置是在/usr/java/ 目錄下

rpm -ivh jdk-8u91-linux-x64.rpm 

設定java環境變數 vim /etc/profile

JAVA_HOME=JAVA_HOME=/usr/java/jdk1.8.0
_91 PATH=$PATH:$JAVA_HOME/bin: export PATH JAVA_HOME

source /etc/profile 是環境變數生效

[root@cx local]# vim /etc/profile
[root@cx local]# source /etc/profile
[root@cx local]# 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)

java -version 驗證是否安裝成功
4. 安裝Hadoop
將下載好的hadoop包解壓移動到 /user/local/ 目錄下

mv hadoop-2.7.3.tar.gz /usr/local/

解壓檔案

cd /usr/local/hadoop
tar -xvf hadoop-2.7.3.tar.gz

重新命名解壓出來的檔案,並進去改名後的資料夾,分別建立 hdfs/tmp、hdfs/name、hdfs/data目錄

mv hadoop-2.7.3.tar.gz hadoop
cd ./hadoop
mkdir -p hdfs/{data,name,tmp}

5. Hadoop配置
在 /usr/local/hadoop/etc/hadoop 下配置各個檔案
進入目錄 cd /usr/local/hadoop/etc/hadoop
- 配置hadoop-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_91
export HADOOP_PID_DIR=/usr/local/hadoop/hdfs/tmp
  • 配置mapred-env.sh 【計算引擎】
export HADOOP_MAPRED_PID_DIR=/usr/local/hadoop/hdfs/tmp
  • 配置yarn-env.sh
export YARN_PID_DIR=/usr/local/hadoop/hdfs/tmp
  • 配置core-site.xml檔案
    hdfs系統會把用到的資料儲存在core-site.xml中由hadoop.tmp.dir指定,而這個值預設位於/tmp/hadoop-${user.name}下面, 由於/tmp目錄在系統重啟時候會被刪除,所以應該修改目錄位置。
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://cx:9000</value>
</property>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/hdfs/tmp</value>
</property>
  • 配置hdfs-site.xml檔案
    可以關閉許可權檢查 在namenode的hdfs-site.xml上
 <property>
     <name>dfs.replication</name>
     <value>1</value>
 </property>
 #這個是設定block大小為3M,預設為124M
 <property>
         <name>dfs.block.size</name>
         <value>3145728</value>
 </property>
 <property>
     <name>dfs.namenode.name.dir</name>
     <value>/usr/local/hadoop/hdfs/name</value>
 </property>
 <property>
     <name>dfs.datanode.data.dir</name>
     <value>/usr/local/hadoop/hdfs/data</value>
 </property>
 <property>
     <name>dfs.permissions.enabled</name>
     <value>false</value>
 </property>
  • 建立配置mapred-site.xml檔案,直接執行命令cp mapred-site.xml.templete mapred-site.xml
cp mapred-site.xml.templete mapred-site.xml
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>
  • 配置yarn-site.xml檔案
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
 </property>
  • 配置slaves指定datanode節點
vim slaves 將localhost改成主機名/新增主機名
  • 修改環境變數檔案”/etc/profile”,並使其生效
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

Hadoop啟動

第一次啟動hadoop之前需要格式化namenode節點,命令為hadoop namenode -format。
兩種方式啟動方式,可按需選擇,全部啟動還是,只啟動相應功能
1、全部啟動 :start-all.sh
2、分開啟動:單獨啟動hdfs start-hdfs.sh;單獨啟動yarn start-yarn.sh
jps 檢視是否啟動成功。

start-hdfs.sh 會啟動檔案系統的 namenode datanode
start-yarn.sh 會啟動資源排程 ResourceManager NodeManager

停止也有2種方式:
1、停止全部 stop-all.sh
2、分開停止:1、停止hdfs stop-hdfs.sh;2、停止yarn stop-yarn.sh
輸入 jps 檢視

[root@cx hadoop]# jps
23104 DataNode
23265 SecondaryNameNode
23810 Jps
1971 Application
10951 ResourceManager
22972 NameNode
7406 Bootstrap
12302 NodeManager

瀏覽器輸入你搭建的伺服器地址加埠 50070 檢視網頁版hadoop叢集資訊
例項:http://127.0.0.1:50070
hadoop

測試

  • HDFS測試

建立一個hello.txt 檔案,輸入命令上傳到hadopp並檢視

hadoop fs -ls / 檢視上傳的檔案

[root@cx ~]# hadoop fs -put ./hello.txt  /
[root@cx ~]# hadoop fs -ls /
Found 1 items
-rw-r--r--   1 root supergroup         44 2017-10-25 09:30 /hello.txt

瀏覽器上檢視
hadoop

  • YARN、Map/Reduce測試
    建立一個文字輸入以下內容放入到hdfs檔案系統裡去
hello java
hello java
hello c
hello c++
hello python
hello java

這裡我建立了一個input.txt放入到 hdfs /input/目錄下,使用hadoop提供的demo做詞頻統計

hadoop fs -mkdir /input
hadoop fs -put /input/input.txt
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input/input.txt /output

完畢後,在http://127.0.0.1:50070 裡檢視檔案,在/output目錄下會有一個_SUCCESS 檔案 和 part-r-00000檔案

輸入命令 hadoop fs -text /input/input.txt 檢視輸出結果

[root@cx hadoop]# hadoop fs -text /input/input.txt
hello java
hello java
hello c
hello c++
hello python
hello java

**

完全分散式搭建

單臺hadoop佈置完畢後

先給叢集機器配置 IP和主機名(有多少加多少)
改主機名參閱 偽分散式第一步
vim /etc/hostname
vim /etc/hosts
reboot

[root@master ~]# cat /etc/hosts
192.168.56.100 master
192.168.56.101 slave1
192.168.56.102 slave2
192.168.56.103 slave3
192.168.56.105 master1

ssh-keygen -t -rsa 在master上生產私鑰公鑰
然後把公鑰copy到叢集主機上,master也需要一份,因為即使是本次操作,對於hadoop而言也是遠端登陸操作

[root@master ~]# ssh-copy-id slave1
[root@master ~]# ssh-copy-id slave2
[root@master ~]# ssh-copy-id slave3
[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id master1

單獨配置HDFS

core-site.xml

<property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
</property>
<property>
      <name>hadoop.tmp.dir</name>
      <value>/usr/local/hadoop/hdfs/tmp</value>
      <description>Abase for other temporary directories.</description>
 <property>
    <!-- 設定secondary namenode地址及埠 預設是在本機這裡 改成master1 -->
        <name>dfs.namenode.secondary.http-address</name>
        <value>master1:50090</value>
  </property>

</property>

hdfs-site.xml

<property>
        <name>dfs.replication</name>
        <value>3</value>
</property>
<property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///usr/local/hadoop/hdfs/name</value>
</property>
<property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///usr/local/hadoop/hdfs/data</value>
</property>
<property>
         <name>dfs.block.size</name>
         <value>3145728</value>
</property>
<property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
</property>

slaves

[root@master hadoop]# cat slaves 
slave1
slave2
slave3

masters 這個要新建

[root@master hadoop]# cat masters 
master1

配置完畢複製配置到每個datanode上
scp -r /usr/local/hadoop/etc/hadoop slave1:/usr/local/hadoop/etc/hadoop

然後 start-dfs.sh啟動叢集,hdfs檔案系統啟動

192.168.56.100:50070 檢視hdfs叢集資訊

單獨配置啟動yarn

yarn的ResourceManager NodeManager配置

<configuration>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
</property>
<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>
</configuration>

集中管理這個不需要所有節點都配置,只需要namenode上配置

[[email protected] hadoop]# start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-master.out
slave3: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-slave3.out
slave1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-slave1.out
slave2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-slave2.out
[[email protected] hadoop]# jps
2132 ResourceManager
2206 Jps

192.168.56.100:8088(預設埠) 檢視yarn叢集資訊

單獨配置啟動Map/Reduce

配置 mapred-site.xml
沒有的話這個配置檔案的話,先從模板複製一份
cp mapred-site.xml.template mapred-site.xml

<property>    
        <name>mapreduce.framework.name</name>    
        <value>yarn</value>
</property>

mapreduce預設在本地執行,這裡寫死在yarn框架上執行。

測試方式和偽分散式執行一樣。

瀏覽器檢視Hadoop叢集資訊:

  • HDFS檢視
  • YARN檢視

需要下載的安裝包:

如有疑問,請及時聯絡作者。

安裝可能存在問題:

  1. datanode無法啟動
    多次格式化導致版本不一致,解決辦法,刪除hdfs/{data,name,tmp} 資料夾,並重新建立

  2. HDFS啟動不了時,先互相ping,看是否測試成功,若不成功,注意防火牆的影響。關閉windows或虛擬機器的防火牆。
    systemctl stop firewalld
    systemctl disable firewalld

    未完,待續……