• ## Hadoop叢集搭建

一、軟體及環境準備

安裝JDK
  • 查詢是否安裝jdk:
rpm -qa |grep java
  • 如果安裝版本小於1.7,解除安裝該版本
rpm -e 軟體包
  • 將上傳好的jdk解壓並配置環境變數
tar -zxf jdk-8u131-linux-x64.tar.gz -C /opt/module
vim /etc/profile    #新增環境變數
##JAVA_HOME##
export JAVA_HOME=/opt/module/jdk1.8.0
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile         ###重新整理環境變數
java -version               #檢視java版本
安裝Hadoop
  • 解壓hadoop軟體
tar -zxf hadoop-2.9.0.tar.gz -C /opt/module
  • 新增環境變數
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.9.0
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin       
source /etc/profile         ###重新整理環境變數

二、執行Hadoop

偽分散式
  • 配置:core-site.xml (配置檔案位置在/opt/module/hadoop-2.9.0/etc/hadoop裡面)
<!-- 指定HDFS中NameNode的地址 -->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop101:9000</value>
</property>

<!-- 指定hadoop執行時產生檔案的儲存目錄 -->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-2.9.0/data/tmp</value>
</property>
  • 配置:hdfs-site.xml
    <!-- 指定HDFS副本的數量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
  • 配置:yarn-site.xml
<!-- reducer獲取資料的方式 -->
<property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
  • 配置:mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0  ###修改jdk位置
  • 配置: (對mapred-site.xml.template重新命名為) mapred-site.xml
<!-- 指定mr執行在yarn上 -->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
啟動

格式化namenode(HDFS)(第一次格式化,在/opt/module/hadoop-2.9.0/下操作)

bin/hdfs namenode -format

啟動namenode(HDFS)

sbin/hadoop-daemon.sh start namenode    #啟動
sbin/hadoop-daemon.sh stop namenode     #停止

叢集操作(HDFS)

bin/hdfs dfs -mkdir -p /user/mapreduce/wordcount/input    ##建立資料夾
bin/hdfs dfs -put wcinput/wc.input  /user/mapreduce/wordcount/input/  ##上傳檔案
bin/hdfs dfs -ls  /user/mapreduce/wordcount/input/   ##檢視檔案 
bin/hdfs dfs -rm -R /user/atguigu/mapreduce/wordcount/output  ##刪除資料夾
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/mapreduce/wordcount/input  /user/mapreduce/wordcount/output   ##執行jar檔案程式

檢視資訊

[root@hadoop101 ~]# jps
13586 NameNode
13668 DataNode
13786 Jps

啟動resourcemanager(YARN)

sbin/yarn-daemon.sh start resourcemanager

啟動nodemanager(YARN)

sbin/yarn-daemon.sh start nodemanager

叢集操作(YARN)

http://192.168.1.101:8088/cluster
其他檔案配置

配置mapred-site.xml 歷史服務配置啟動檢視

<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop101:19888</value>
</property>
 ls sbin/ |grep mr      #檢視歷史伺服器目錄,此處為mr-jobhistory-daemon.sh
 sbin/mr-jobhistory-daemon.sh start historyserver   #啟動後 http://local:19888/jobhistory 檢視

配置yarn-site.xml 開啟日誌聚集功能

<!-- 日誌聚集功能使能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 日誌保留時間設定7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>
完全分散式

這裡寫圖片描述

設定ssh無密碼登入
ssh 192.168.1.103       #基本語法

生成公鑰、私鑰

cd ~/.ssh
ssh-keygen -t rsa

將生成的公鑰拷貝到要免密登入的主機上(自己也要)

ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104

.ssh資料夾下的檔案功能解釋

(1)~/.ssh/known_hosts  :記錄ssh訪問過計算機的公鑰(public key)
(2)id_rsa   :生成的私鑰
(3)id_rsa.pub   :生成的公鑰
(4)authorized_keys  :存放授權過得無祕登入伺服器公鑰
安裝遠端同步工具
1)檢視rsync使用說明
man rsync | more
(2)基本語法
rsync -rvl     $pdir/$fname         $user@hadoop$host:$pdir
命令 命令引數 要拷貝的檔案路徑/名稱   目的使用者@主機:目的路徑
選項
-r 遞迴
-v 顯示覆制過程
-l 拷貝符號連線
(3)案例實操
把本機/opt/tmp目錄同步到hadoop103伺服器的root使用者下的/opt/tmp目錄
rsync -rvl /opt/tmp/*  root@hadoop103:/opt/tmp

編寫叢集分發指令碼xsync (/usr/local/bin)

#!/bin/bash
#1 獲取輸入引數個數,如果沒有引數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 獲取檔名稱
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 獲取當前使用者名稱稱
user=`whoami`

#5 迴圈
for((host=103; host<105; host++)); do
        #echo $pdir/$fname [email protected]$host:$pdir
        echo --------------- hadoop$host ----------------
        rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
修改配置檔案

core-site.xml

<!-- 指定HDFS中NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:9000</value>
    </property>

    <!-- 指定hadoop執行時產生檔案的儲存目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.9.0/data/tmp</value>
    </property>

hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0

hdfs-site.xml

<configuration> 
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:50090</value>
    </property>
</configuration>

slaves

hadoop102
hadoop103
hadoop104

yarn-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0

yarn-site.xml

<configuration>

    <!-- reducer獲取資料的方式 -->
    <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
</configuration>

mapred-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0

mapred-site.xml

<configuration>
    <!-- 指定mr執行在yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

配置檔案分發,分發上面的配置檔案

cd /opt/module/hadoop-2.7.2/etc/hadoop
xsync /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
xsync /opt/module/hadoop-2.7.2/etc/hadoop/slaves
叢集啟動測試

hadoop102

bin/hdfs namenode -format       #格式化節點
sbin/start-dfs.sh               #啟動

hadoop103

sbin/start-yarn.sh              #啟動
配置時間同步伺服器
檢查ntp是否安裝
 rpm -qa|grep ntp
修改配置檔案
  • 修改ntp配置檔案
vi /etc/ntp.conf
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap     #修改內容
#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
fudge 127.127.1.0 stratum 10        #新增內容
  • 修改/etc/sysconfig/ntpd 檔案
vim /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes    #新增內容

重啟ntpd並設定開機自啟動和同步任務

service ntpd start
chkconfig ntpd on   #設定開機自啟動
 crontab -e         #設定同步任務
*/10 * * * * /usr/sbin/ntpdate hadoop102        #設定每10分鐘同步一次 hadoop102為時間伺服器

配置叢集常見問題

1)防火牆沒關閉、或者沒有啟動yarn
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主機名稱配置錯誤
3)ip地址配置錯誤
4)ssh沒有配置好
5)root使用者和atguigu兩個使用者啟動叢集不統一
6)配置檔案修改不細心
7)未編譯原始碼
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
8)datanode不被namenode識別問題
Namenode在format初始化的時候會形成兩個標識,blockPoolId和clusterId。新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識。
一旦namenode重新format後,namenode的身份標識已變,而datanode如果依然持有原來的id,就不會被namenode識別。
解決辦法,刪除datanode節點中的資料後,再次重新格式化namenode。
9)不識別主機名稱
java.net.UnknownHostException: hadoop102: hadoop102
        at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
解決辦法:
(1)在/etc/hosts檔案中新增192.168.1.102 hadoop102
    (2)主機名稱不要起hadoop  hadoop000等特殊名稱
10)datanode和namenode程序同時只能工作一個。
11)執行命令 不生效,貼上word中命令時,遇到-和長–沒區分開。導致命令失效
解決辦法:儘量不要貼上word中程式碼。
12)jps發現程序已經沒有,但是重新啟動叢集,提示程序已經開啟。原因是在linux的根目錄下/tmp目錄中存在啟動的程序臨時檔案,將叢集相關程序刪除掉,再重新啟動叢集。
13)jps不生效。
原因:全域性變數hadoop   java沒有生效,需要source /etc/profile檔案。
14)8088埠連線不上
[[email protected] 桌面]$ cat /etc/hosts
註釋掉如下程式碼
#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         hadoop102
.