HADOOP(3.0.0)在CENTOS7(RED HAT 7)下徹底分佈式環境搭建

1、環境簡介

本教程服務器主機都是CentOS 7(Red Hat 7 亦可),集羣結點分佈狀況以下表:html

+---------------+-----------+----------------------------------
|IP             |HOSTNAME   |備註
+---------------+-----------+----------------------------------
|192.168.6.171  |hdpmmaster |ResourceManager 進程所在機器
+---------------+-----------+----------------------------------
|192.168.6.172  |hdpsmaster |SecondaryNameNode 主機的備機
+---------------+-----------+----------------------------------
|198.168.6.67   |hdpslave67 |datanode
+---------------+-----------+----------------------------------
|198.168.6.68   |hdpslave68 |datanode
+---------------+-----------+----------------------------------
|198.168.6.69   |hdpslave68 |datanode
+---------------+-----------+----------------------------------


2、Linux 環境準備

01. 建立hadoop用戶

01) 新建用戶: adduser hadoop(注: 在建立hadoop用戶的同時也建立了hadoop用戶組)
02) 給hadoop用戶添加登陸密碼: passwd hadoop
03) 把hadoop用戶加入到hadoop用戶組: usermod -a -G hadoop hadoop
03) 賦予用戶root權限, 向/etc/sudoers中添加"hadoop ALL=(ALL) ALL",若是沒有寫的權限須要先執行 chmod +w /etc/sudoers
注:以上全部操做都是在root用戶下完成,非root用戶能夠在全部命令前加sudo

02. HOSTNAME 處理

01) 修改服務器的 hostname,使用命令 hostnamectl set-hostname <new_host_name>java

192.168.6.171 中: hostnamectl set-hostname hdpmmaster
192.168.6.172 中: hostnamectl set-hostname hdpsmaster
192.168.6.67  中: hostnamectl set-hostname hdpslave67
192.168.6.68  中: hostnamectl set-hostname hdpslave68
192.168.6.69  中: hostnamectl set-hostname hdpslave69

02) 向/etc/hosts文件中添加域名和IP的映射,內容以下node

192.168.6.171           hdpmmaster
192.168.6.172           hdpsmaster
192.168.6.67            hdpslave67
192.168.6.68            hdpslave68
192.168.6.69            hdpslave69

注:以上全部操做都是在root用戶下完成,非root用戶能夠在全部命令前加sudolinux

03. ssh免密碼登陸

01) ssh安裝,使用命令 sudo yum isntall -y openssdweb

02) ssh dsa算法密鑰對生成,分別在5臺機器執行如下3條命令算法

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

03) 複製公鑰到集羣服務器,使用命令 ssh-copy-id <user>@<host>apache

示例:複製 hdpslave67(192.168.6.67) 的公鑰到 hdpslave68(192.168.6.68) bash

注:能夠執行 ssh hadoop@hdpslave68 命令看是否須要輸入登陸密碼來確認是否陳功,同時避免之後檢查出什麼問題最好保證集羣中的服務器可以兩兩無密碼登陸。服務器

04. JDK 安裝

01) 下載並安裝JDKapp

01) 下載 jdk 的 rpm 安裝文件
02) 使用命令 sudo rpm -ivh jdk-8u144-linux-x64.rpm 安裝

02) JDK 環境變量配置:sudo vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$CLASSPATH:.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH

注:jdk的環境變量配置也可寫入 hadoop 用戶目錄下的 .bashrc 文件,或者 .bash_profile 文件

05. 關閉全部服務器的防火牆

sudo systemctl stop firewalld    #中止防火牆服務
sudo systemctl disable firewalld #禁用防火牆服務開機啓動

 

3、HAOOP 安裝以及配置

01) 下載並安裝 hadoop (版本:3.0.0)

wget http://mirrors.shuosc.org/apache/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz
tar -xzf hadoop-3.0.0.tar.gz -C /usr/local/
cd /usr/local/
ln -s hadoop-3.0.0/ hadoop #創建軟連接, 也可直接使用 mv hadoop-3.0.0 hadoop 命令更名

02) 配置 hadoop 環境變量,向 /home/hadoop/.bashrc 文件添加如下內容

# HADOOP
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

03) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hdpmmaster:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:///usr/local/hadoop/hdptmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
</configuration>

04) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/datanode</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hdpsmaster:9868</value>
    </property>
</configuration>

05) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hdpmmaster:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hdpmmaster:19888</value>
    </property>
</configuration>

06) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/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.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>

    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>2</value>
    </property>

<!--
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>3072</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb></name>
        <value>3052</value>
    </property>
-->

    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hdpmmaster:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hdpmmaster:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hdpmmaster:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hdpmmaster:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hdpmmaster:8088</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>

07) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/workers

hdpsmaster
hdpslave67
hdpslave68
hdpslave69

注:該 workers 文件也能夠配置爲ip,以下

192.168.6.171
192.168.6.67
192.168.6.68
192.168.6.69

08) 配置 hadoop 安裝目錄(/usr/local/hadoop)下的 etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/java/latest  #去掉前面的'#', 且寫入jdk的安裝路徑, 這裏的寫法用latest是爲了之後jdk升級不用修改該配置, 固然也能夠寫jdk安裝的絕對路徑, 即"/usr/java1.8.0_144"

09) 格式化namenode

hdfs namenode -format

注:格式化以前須要將剩餘的主機都如此配置hadoop,最簡單的作法就是配置好一臺,而後直接複製到剩餘的主機服務器上。同時後續可能須要修改配置文件每次都須要同步配置文件,能夠寫個簡單的同步腳本,內容以下。

# 名稱: scphdp.sh
# 路徑: /usr/local/hadoop
# 備註: 01. 須要添加執行權限, chmod +x /usr/local/hadoop/scphdp.sh
#       02. 注意修改集羣的ip
echo "==========6.67 begin=========="
scp -r etc/hadoop hadoop@192.168.6.67:/usr/local/hadoop/etc
echo "===========6.67 end==========="

echo "==========6.68 begin=========="
scp -r etc/hadoop hadoop@192.168.6.68:/usr/local/hadoop/etc
echo "===========6.68 end==========="

echo "==========6.69 begin=========="
scp -r etc/hadoop hadoop@192.168.6.69:/usr/local/hadoop/etc
echo "===========6.69 end==========="


#echo "==========6.172 begin=========="
#scp -r etc/hadoop hadoop@192.168.6.172:/usr/local/hadoop/etc
#echo "===========6.172 end==========="

10) 啓動集羣

start-all.sh

注:啓動以後經過 jps 命令查看java後臺進程,各個結點的java進程信息以下

+---------------+-----------+--------------------------------------------------
|IP             |HOSTNAME   |java進程
+---------------+-----------+--------------------------------------------------
|192.168.6.171  |hdpmmaster |ResourceManager, NameNode, Jps
+---------------+-----------+--------------------------------------------------
|192.168.6.172  |hdpsmaster |Jps, SecondaryNameNode, NodeManager, DataNode
+---------------+-----------+--------------------------------------------------
|198.168.6.67   |hdpslave67 |NodeManager, Jps, DataNode
+---------------+-----------+--------------------------------------------------
|198.168.6.68   |hdpslave68 |NodeManager, Jps, DataNode
+---------------+-----------+--------------------------------------------------
|198.168.6.69   |hdpslave68 |NodeManager, Jps, DataNode
+---------------+-----------+--------------------------------------------------

11) 在有圖形界面的pc上訪問下面兩個地址連接,查看相關信息

http://hdpmmaster:8088/ #NameNode圖形界面, 任務分配和任務進度信息的查詢
http://hdpmmaster:9870/ #集羣結點(Node Of Cluster)圖形界面

注:以域名訪問須要向該pc的hosts文件中加入 "192.168.6.171 hdpmmaster",Windows 操做系統的hosts文件路徑在 "C:\Windows\System32\drivers\etc\hosts",CentOS操做系統的hosts文件路徑在"/etc/hosts"。

12) 單詞統計示例運行

hadoop fs -mkdir /input
hadoop fs -chmod -R 775 /input
hadoop fs -put /usr/local/hadoop/LICENSE.txt /input 
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar wordcount /input /output

注:01.  每次執行上面的 hadoop jar 命令,須要確認集羣結點上的 /output 目錄是否存在,存在則使用命令 "hadoop fs -rmr -f  /output"刪除該目錄

       02.  執行成功以後能夠在 http://hdpmmaster:9870/explorer.html 中的"/output"文件夾中找到輸出結果,容許下載和預覽該結果文件

13) 中止集羣

stop-all.sh

14) 任務歷史服務啓動與關閉,web訪問地址是 http://hdpmmaster:19888/jobhistory/ 端口是在mapred-site.xml中配置的

mapred --daemon start historyserver #啓動
mapred --daemon stop historyserver #關閉

 

4、FAQ

01. 物理內存或虛擬內存監測溢出

問題描述: 執行任務的時虛擬內存溢出
報錯信息: Container [pid=5623,containerID=container_1514514155753_0001_01_000002] is running beyond virtual memory limits. Current usage: 155.1 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.
解決方案:
    方案一: 關閉虛擬內存監測, 在yarn-site.xml文件中添加"yarn.nodemanager.vmem-check-enabled"配置, 值爲"false"(該方案不建議在正式環境中使用)
    方案二: 提升內存配置, 參考 http://blog.chinaunix.net/uid-25691489-id-5587957.html

02. datanode和namenode都啓動成功,但datanode沒有與namenode關聯成功

問題描述: 集羣啓動正常, 使用jps查看各個結點的java進程也是對的, 可是沒法打開http://hdpmmaster:8088, 雖然http://hdpmmaster:9870能訪問, 可是查看 DataNode 頁面沒有看到任何一個結點。
報錯信息: 查看任何一個 DataNode 結點的日誌文件(HADOOP_HOME/logs/hadoop-hadoop-datanode-hdpsmaster.log)發現如下信息
          Retrying connect to server: hdpmmaster/192.168.6.171:9000. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
解決方案: 查看 hdpmmaster/192.168.6.171 主機的hosts文件中是否有"127.0.0.1 hdpmmaster", 刪除該行, 從新格式化集羣(hdfs namenode -format).
問題緣由: 由於將hdpmmaster映射在了localhost, 因此DataNode結點沒法訪問到該NameNode, 同時也沒法打開http://hdpmmaster:8088. 能夠經過查看格式化集羣結點時最後的提示信息來斷定是否有出現該問題. 若是是"SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1", 表示映射錯誤; 若是是"SHUTDOWN_MSG: Shutting down NameNode at hdpmmaster/192.168.6.171", 表示映射是正確的. 固然這一切都要在全部集羣主機可以互相ping通的前提下, 即須要的全部端口都開放, 或者直接關閉防火牆, 該教程爲簡潔就是直接關閉集羣全部主機的防火牆.

03. unhealthy狀態的datanode處理(下面只是該現象其中一種緣由)

問題描述: 在http://hdpmmaster:8088/cluster/nodes的界面出現unhealthy結點
報錯信息: yarn.server.nodemanager.DirectoryCollection: Directory /var/lib/hadoop-yarn/cache/yarn/nm-local-dir error, used space above threshold of 90.0%, removing from list of valid directories
解決方案: 加大磁盤容量, 或者清理磁盤空間, 固然也能夠提升yarn的監測數值, 即在yarn-site.xml中添加"yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage"配置, 值是一個百分比數值, 例如"95.0"
問題緣由: 該結點主機的磁盤使用超過90%,
相關文章
相關標籤/搜索