Hadoop集羣安裝
1.配置服務器
配置hosts
打開主節點的hosts文件,要將文件的前兩行註釋掉 (註釋當前主機的信息)並在文件中添加所有hadoop集羣的主機信息
在你選擇的主節點上執行:
[root@localhost ~]# vi /etc/hosts
前兩行註釋掉:
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.18.110 master
192.168.18.111 slaver1
192.168.18.112 slaver2
保存之後,將主節點的hosts分別拷貝到其他兩個子節點,在主節點上執行
[root@localhost ~]# scp /etc/hosts [email protected]:/etc/
[root@localhost ~]# scp /etc/hosts [email protected]:/etc/
2. 安裝jdk
卸載默認jdk(三臺機器上都要卸載)
查看系統已經裝的jdk:
[root@localhost ~]# rpm -qa|grep jdk
java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
卸載jdk:
[root@localhost ~]# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
[root@localhost ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
其他兩個節點操作上邊相同動作
安裝JDK(三臺機器都要安裝)
安裝在同一位置/opt/java/jdk1.7.0_76
下載JDK
解壓JDK :
[root@localhost ~]# mkdir -p /opt/java/ 創建好目錄後將jdk包傳到這個目錄下
[root@localhost ~]# tar -zxvf /opt/java/jdk-7u76-linux-x64.tar.gz -C /opt/java/
其他兩個節點操作上邊相同動作
配置環境變量, 編輯profile文件:
[root@localhost ~]# vi /etc/profile
在profile文件末尾添加以下代碼:
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
拷貝profile到子節點
在你選擇的主節點上執行:(192.168.18.111和192.168.18.112 IP是你選擇的另外兩個從節點機器)
[root@localhost ~]# scp /etc/profile [email protected]:/etc/
[root@localhost ~]# scp /etc/profile [email protected]:/etc/
三臺都重啓:
[root@localhost ~]# reboot
3. 配置ssh無密碼訪問
生成公鑰私鑰對
在每個節點上分別執行:
[root@master ~]# ssh-keygen -t rsa
[root@slaver1 ~]# ssh-keygen -t rsa
[root@slaver2 ~]# ssh-keygen -t rsa
一直按回車直到生成結束
執行結束之後每個節點上的/root/.ssh/目錄下生成了兩個文件 id_rsa 和 id_rsa.pub
其中前者爲私鑰,後者爲公鑰
在主節點上執行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cp id_rsa.pub authorized_keys
將子節點的公鑰拷貝到主節點並添加進authorized_keys
將兩個子節點的公鑰拷貝到主節點上,分別在兩個子節點上執行:
[root@slaver1 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver1.pub
[root@slaver2 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver2.pub
然後在主節點上,將拷貝過來的兩個公鑰合併到authorized_keys文件中去
主節點上執行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cat id_rsa_slaver1.pub>>authorized_keys
[root@master .ssh]# cat id_rsa_slaver2.pub>>authorized_keys
最後測試是否配置成功
在主節點上分別執行
[root@master ~]# ssh slaver1
[root@master ~]# ssh slaver2
能正確跳轉到兩臺子節點的操作界面即可,同樣在每個子節點通過相同的方式登錄主節點和其他子節點也能無密碼正常登錄就表示配置成功。
這裏的配置方式可以有多種操作步驟,最終目的是每個節點上的/root/.ssh/authorized_keys文件中都包含所有的節點生成的公鑰內容。
將主節點的authorized_keys文件分別替換子節點的authorized_keys文件
主節點上執行用scp命令將authorized_keys文件拷貝到子節點的相應位置
[root@master ~]# cd /root/.ssh
[root@master .ssh]# scp authorized_keys root@slaver1:/root/.ssh/
[root@master .ssh]# scp authorized_keys root@slaver2:/root/.ssh/
上面配置SSH切換服務器較繁瑣,稍不小心就會出錯,可以用下面的
安裝ssh 證書
[root@master~]$ ssh-keygen -t rsa
[root@slaver1~]$ ssh-keygen -t rsa
[root@slaver2~]$ ssh-keygen -t rsa
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
以下只在你選擇主節點上操作
4.安裝hadoop
首先將hadoop-2.6.4.tar.gz放到三臺機器的/usr目錄下
在master主機上安裝hadoop
安裝位置自定,例如安裝在/usr目錄下面
下載hadoop包,放在/usr目錄下,解壓hadoop
[root@master ~]# tar -zxvf /usr/hadoop-2.6.4.tar.gz -C /usr/
在usr下面生成hadoop-2.6.4目錄
配置環境變量:
[root@master ~]# vi .bash_profile
PATH=$PATH:$HOME/bin:/usr/hadoop-2.6.4/sbin
export PATH
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
HADOOP_HOME=/usr/hadoop-2.6.4
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_HOME HADOOP_CONF_DIR PATH
[root@master ~]# source .bash_profile
5.配置hadoop
配置hadoop配置文件
需要配置的文件的位置爲/hadoop-2.6.4/etc/hadoop,需要修改的有以下幾個
hadoop-env.sh
yarn-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
其中
hadoop-env.sh和yarn-env.sh裏面都要添加jdk的環境變量:
hadoop-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hadoop-env.sh
# The java implementation to use.
# The jsvc implementation to use. Jsvc isrequired to run secure datanodes
# that bind to privileged ports to provideauthentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol usingnon-privileged ports.
#export JSVC_HOME=${JSVC_HOME}
exportJAVA_HOME=/opt/java/jdk1.7.0_76
#(紅色爲新添加的內容,其他的代碼是文件中原有的)
yarn-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-env.sh
# User for YARN daemons
exportHADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
# resolve links - $0 may be a softlink
exportYARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
# some Java parameters
exportJAVA_HOME=/opt/java/jdk1.7.0_76
#(紅色爲新添加的內容,其他的代碼是文件中原有的)
[root@master ~]# mkdir -p /usr/temp
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/data
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/namesecondary
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/name
注:下邊配置參數時藍色漢字爲註釋,不能拷貝進配置文件中
core-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<description>NameNode URI.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>Size ofread/write buffer used inSequenceFiles.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:///usr/temp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
<description>The secondary namenode http server addressandport.</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/name</value>
<description>Path on the local filesystem where the NameNodestoresthe namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/data</value>
<description>Comma separated list of paths on the local filesystemofa DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/namesecondary</value>
<description>Determines where on the local filesystem theDFSsecondary name node should store the temporary images to merge. If this isacomma-delimited list of directories then the image is replicated in all ofthedirectories for redundancy.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>supergroup</value>
</property>
</configuration>
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
mapred-site.xml中
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>Theruntime framework for executing MapReduce jobs.Can be one of local, classic oryarn.</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>MapReduce JobHistoryServer IPChost:port</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
<description>MapReduceJobHistoryServer Web UI host:port</description>
</property>
<property>
<name>mapred.remote.os</name>
<value>Linux</value>
</property>
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
yarn-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<description>The hostnameof theRM.</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>Shuffle service that needs to be set for MapReduceapplications.</description>
</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>
<property>
<name>yarn.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
slaves中
[root@master hadoop]# vi slaves
slaver1
slaver2
拷貝hadoop安裝文件到子節點
主節點上執行:
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver1:/usr/
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver2:/usr/
格式化主節點的namenode
主節點上進入hadoop目錄
然後執行:
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]# ./bin/hadoop namenode -format
新版本用下面的語句不用hadoop命令了
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]# ./bin/hdfs namenode -format
啓動hadoop
主節點上在hadoop-2.6.4目錄下執行:
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]#./sbin/start-all.sh
主節點上jps進程有:
[root@master hadoop-2.6.4]# jps
NameNode
SecondaryNameNode
ResourceManager
Jps
在兩個子節點上執行:
每個子節點上的jps進程有:
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
Jps
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
jps
如果這樣表示hadoop集羣配置成功
查找指定文件的塊位置:
[root@master ~]# hadoop fsck /user/root/aa.txt -files -blocks -racks -locations
DEPRECATED: Use of this script to executehdfs command is deprecated.
Instead use the hdfs command for it.
16/12/14 21:05:12 WARNutil.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable
Connecting to namenode viahttp://master:50070
FSCK started by root (auth:SIMPLE) from/192.168.18.110 for path /user/root/aa.txt at Wed Dec 14 21:05:15 CST 2016
/user/root/aa.txt 248305251 bytes, 2block(s): OK
0.BP-1810680398-192.168.18.110-1481303633970:blk_1073742062_1238len=134217728 repl=2 [/default-rack/192.168.18.111:50010, /default-rack/192.168.18.112:50010]
1.BP-1810680398-192.168.18.110-1481303633970:blk_1073742063_1239len=114087523 repl=2 [/default-rack/192.168.18.111:50010,/default-rack/192.168.18.112:50010]
Status: HEALTHY
Total size: 248305251 B
Total dirs: 0
Totalfiles: 1
Total symlinks: 0
Total blocks (validated): 2 (avg. block size 124152625 B)
Minimally replicated blocks: 2 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 2.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 2
Number of racks: 1
FSCK ended at Wed Dec 14 21:05:15 CST 2016in 14 milliseconds
The filesystem under path'/user/root/aa.txt' is HEALTHY
[root@slaver1 ~]# find /usr/hadoop-2.6.4/dfs/data -name blk_1073742062_1238.meta
/usr/hadoop-2.6.4/dfs/data/current/BP-1810680398-192.168.18.110-1481303633970/current/finalized/subdir0/subdir0/blk_1073742062_1238.meta
關於檢查點的一些問題:
1、問題的描述
需要在原來已經部署了集羣上重新部署,之後,啓動集羣,由於Cloudera Manager 會默認設置dfs.namenode.checkpoint.period和dfs.namenode.checkpoint.txns分別是1個小時和1000000。只要達到這兩個條件之一,secondarynamenode會執行checkpoint操作,此時會出現如下的問題:
ERROR:The health testresult for NAME_NODE_HA_CHECKPOINT_AGE has become bad: The filesystem checkpoint is 4 hour(s) old. This is401.25% of the configured checkpoint period of 1 hour(s). Critical threshold:400.00%. 2,793 transactions have occurred since the last filesystem checkpoint.This is 0.28% of the configured checkpoint transaction target of 1,000,000.
經過初步分析,是由於secondarynamenode沒有執行checkpoint的原因所導致,於是就查看了一下secondarynamenode的日誌,發現真正的錯誤是:
ERROR: Exception in doCheckpointjava.io.IOException: Inconsistent checkpoint field
此時,說明查看個角色運行的日誌很重要的,能夠很精確的定位錯誤所在。
這兩個問題的聯繫主要是secondarynamenode沒有執行檢查點的操作,導致會產生上面的錯誤,說明你一直沒有執行檢查點的操作,下面的錯誤說明的是執行檢查點操作失敗,不執行。
2、問題的解決前的知識儲備
在解決問題之前首先需要介紹一下檢查點的作用及重要性。
(1)檢查點
何爲檢查點:檢查點是給secondarynamenode設置的,通過設置hdfs-site.xml中參數dfs.namenode.checkpoint.period和dfs.namenode.checkpoint.txns來觸發,只要達到這兩個條件之一就可以出發secondarynamenode執行檢查點的操作。
(2)檢查點的的內容:
secondarynamenode執行檢查點的內容是首先從namenode中讀取Fsimage,並執行namenode中editslog文件中的操作,並最終生成一個新的FSimage文件,並將這個文件上傳給Namenode。注意:在這個過程中,如果editlog沒有任何的記錄的話,達到了檢查點的條件後,也由於沒有發生任何改變,因此不執行檢查點操作。
(3)檢查點的作用:
secondarynamenode執行這個檢查點的操作,可以減少namenode的啓動時間。
3、問題的解決方法
通過真正的錯誤的描述,發現主要是版本不匹配,說明在重新安裝的時候,保留了以前版本的的數據,導致不一致的版本問題,所以導致secondarynamenode不執行檢查點的操作。那麼解決辦法就是刪除之前的數據,所以通過刪除secondarynamenode執行檢查點是的目錄,即hdfs-site.xml中參數fs.checkpoint.dir,dfs.namenode.checkpoint.dir的值的路徑
刪除之後,重新啓動集羣即可。
配置參數網址:
http://cloudtech.iteye.com/blog/1620089
任務在mapreduce.Job: Running job
卡住不動
可能是因爲調度執行了很多次在web
頁面 All Applications
上看到很多進程都是UNASSIGNED
在機器上面執行
[root@master ~]# yarn application -list
顯示有很多任務在,雖然添加任務的腳本已經kill掉了但是任務隊列還是在yarn上
在hadoop下執行
[root@master ~]# yarn application -list| awk '{print " yarn application-kill " $1}'| sh
歷史服務器:
Hadoop自帶一個歷史服務器,可以通過歷史服務器查看已經運行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啓動時間、作業完成時間等信息
默認情況下,Hadoop歷史服務器是沒有啓動的,我們可以通過下面的命令來啓動Hadoop歷史服務器
$ sbin/mr-jobhistory-daemon.sh
starthistoryserver
這樣我們就可以在相應機器的19888端口上打開歷史服務器的WEB UI界面,可以查看已經運行完的作業情況,歷史服務器可以單獨在一臺機器上啓動,主要是通過以下的參數配置:
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
上面的參數是在mapred-site.xml文件中進行配置,mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address默認的值分別是master:10020和master:19888,根據自己的情況進行相應的配置,參數的格式是host:port,配置完上述的參數之後,重新啓動Hadoop
jobhistory,這樣我們就可以在mapreduce.jobhistory.webapp.address參數配置的主機上對Hadoop歷史作業情況經行查看。
這些歷史數據是存放在HDFS中,我們可以通過下面的配置來設置在HDFS的什麼目錄下存放歷史作業記錄:
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}
/history/done_intermediate</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
</property>
上面的配置都默認的值,我們可以在mapred-site.xml文件中進行修改,其中,mapreduce.jobhistory.done-dir參數的意思是在什麼目錄下存放已經運行完的Hadoop作業記錄;mapreduce.jobhistory.intermediate-done-dir的意思是正在運行的Hadoop作業記錄。
我們可以到mapreduce.jobhistory.done-dir參數配置的目錄下看看裏面存放的是什麼東西:
[wyp@master /home/wyp/hadoop]# bin/hadoop fs -ls /jobs/done/