1 安裝環境
1.1 客戶端
1.2 服務端
1.3 安裝準備
2 操做系統安裝
2.1.1 BIOS打開虛擬化支持
2.1.2 關閉防火牆
2.1.3 安裝VNC
3 JAVA安裝
3.1 配置目的
3.2 配置過程
3.3 結果驗證
4 主機名配置
4.1 配置目的
4.2 配置過程
4.3 結果驗證
5 增長hadoop用戶
5.1 配置目的
5.2 配置過程
5.3 結果驗證
6 Hadoop用戶無密碼訪問配置
6.1 配置目的
6.2 配置過程
6.3 結果驗證
7 Hadoop文件安裝
7.1 配置目的
7.2 配置過程
7.3 結果驗證
8 Hadoop配置文件更改
8.1 hadoop-env.sh
8.2 yarn-env.sh
8.3 core-site.xml
8.3.1 配置結果
8.3.2 參數解釋
8.4 hdfs-site.xml
8.4.1 配置結果
8.4.2 參數解釋
8.5 mapred-site.xml
8.5.1 配置結果
8.5.2 參數解釋
8.6 yarn-site.xml
8.6.1 配置結果
8.6.2 參數解釋
8.7 capacity-scheduler.xml
8.7.1 配置結果
8.7.2 參數解釋
8.8 slaves
8.9 Hadoop文件從Master拷貝至全部Slave
8.10 命令行結果驗證
8.11 HTTP結果驗證
9 HDFS文件分佈式存儲位置查看
9.1 上傳文件
9.2 NameNode存儲信息
9.3 DataNode存儲信息
java
1 安裝環境
1.1 客戶端
一臺Windows XP做爲客戶端,IP地址爲192.168.1.100,因爲客戶端爲HTTP訪問,所以配置十分簡單,只須要在下面的文件中加入主機名配置便可:
C:\WINDOWS\system32\drivers\etc\Hosts:
192.168.1.254 Master
192.168.1.253 Slave1
192.168.1.252 Slave2
另外,最好有Secure CRT、VNC Viewer等做爲客戶端操做各臺服務器。
1.2 服務端
三臺Linux(虛擬機)做爲Hadoop服務器,操做系統均爲:
rhel-server-6.4-x86_64-dvd[ED2000.COM].iso
服務器IP地址分別爲:
192.168.1.254爲主控節點,運行NameNode、SecondaryNameNode、ResourceManager;
192.168.1.253運行DataNode、NodeManager
192.168.1.252運行DataNode、NodeManager
1.3 安裝準備
須要如下軟件:
VMware-workstation-full-9.0.2-1031769.exe;
rhel-server-6.4-x86_64-dvd[ED2000.COM].iso;
jdk-7-linux-x64.rpm.rpm:JDK 1.7.0_55版本;
hadoop-2.2.0.tar.gz:官網下載;
eclipse-standard-kepler-SR2-linux-gtk-x86_64.tar.gz:用於開發(開發須要下載Hadoop源代碼:hadoop-2.2.0-src.tar.gz);
Winscp:用於Windows和Linux之間互傳文件;
VNC服務端相關:遠程桌面
tigervnc-1.1.0-5.el6.x86_64.rpm
tigervnc-server-1.1.0-5.el6.x86_64.rpm
xorg-x11-fonts-misc-7.2-9.1.el6.noarch.rpm
VNC客戶端相關:vnc-E4_5_1-x86_x64_win32.exe,遠程桌面客戶端
SecureCRT :HAP_SecureCRT_5.1.3.exe,遠程登陸
2 操做系統安裝
2.1.1 BIOS打開虛擬化支持
利用虛擬機方式安裝,安裝時須要注意的問題是須要在BIOS中打開Intel CPU的虛擬化支持。不一樣的主板其位置不一樣,如:
node
其緣由是,Intel CPU 要求芯片和 BIOS 支持 EM64T 和 VT(Virtualization Technology,虛擬化技術),以運行 64 位虛擬機。
2.1.2 關閉防火牆
Redhat使用了SELinux來加強安全,關閉的辦法爲:
(1)永久有效:修改 /etc/selinux/config 文件中的 SELINUX="" 爲 disabled ,而後重啓。
(2)即時生效:setenforce 0
(3)永久性關閉:chkconfig iptables off
(4)即時生效,重啓後失效:service iptables stop
安裝好操做系統後,最好保證SSH存在、VNC存在、防火牆關閉。
2.1.3 安裝VNC
若是對VI操做不夠熟悉,也可使用界面形式,須要在Linux上啓動VNC服務器,在Windows上安裝VNC客戶端。
VNC服務器有的Linux存在,在RedHat若是不存在,須要在安裝光盤中找出三個rpm文件:
xorg-x11-fonts-misc-7.2-9.1.el6.noarch.rpm
tigervnc-1.1.0-5.el6.x86_64.rpm
tigervnc-server-1.1.0-5.el6.x86_64.rpm
因爲存在依賴特性,先安裝xorg-x11-fonts-misc-7.2-9.1.el6.noarch.rpm,再安裝剩下兩個。
啓動VNC的前提是防火牆關閉,命令爲vncserver便可,多敲幾個vncserver能夠打開多個遠程桌面終端。
客戶端訪問:
linux
1表示當前的遠程桌面終端號。
3 JAVA安裝
3.1 配置目的
Hadoop自己是JAVA開發的,所以須要安裝JAVA虛擬機以支持其運行。若是隻是線上部署,能夠安裝JRE,若是還須要開發,則安裝JDK,建議安裝JDK,由於其包含了JRE。而且建議安裝7.0以上版本。
3.2 配置過程
因爲操做系統自己爲64位,所以下載的JDK版本爲基於Linux的64位。三臺機器均安裝JDK,版本爲1.7.0_55,64位。
oracle網站下載:jdk-7-linux-x64.rpm.rpm
拷貝至各臺機器後,運行rpm –ivh jdk-7-linux-x64.rpm.rpm便可完成安裝。
安裝路徑默認爲:/usr/java/jdk1.7.0_55
在/etc/profile配置文件(也可在/etc/profile.d/java.sh中加入,本質是同樣的,只是profile.d是目錄)後面加入:
export JAVA_HOME=/usr/java/jdk1.7.0_55
export PATH=$PATH:$JAVA_HOME/jre/bin:$JAVA_HOME/bin
並使用source /etc/profile使之當即生效(這是一個頗有用的命令)。
如圖:
web
理論上,不配置JAVA_HOME也能夠,在Hadoop的配置文件再具體指定也能夠保證Hadoop啓動,但設置好一些經常使用的環境變量要方便不少。express
3.3 結果驗證
測試JAVA是否安裝成功:
[root@MasterHost ~]# java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
[root@MasterHost ~]#
出現上面的版本信息表示安裝成功。如圖:
apache
[root@MasterHost ~]# echo $JAVA_HOME
/usr/java/jdk1.7.0_55
出現上述信息表示環境變量設置成功。
如圖爲配置結果查看:
瀏覽器
4 主機名配置
4.1 配置目的
實際上就是相似於DNS的做用,使得各臺機器之間經過主機名訪問,而不是IP地址直接訪問。這主要是爲了在寫Hadoop配置文件時無需寫IP地址,直接寫主機名便可,防止IP地址變化出現問題。
4.2 配置過程
在三臺機器的/etc/hosts文件中都加入如下內容:
192.168.1.254 Master
192.168.1.253 Slave1
192.168.1.252 Slave2
如圖爲配置結果:
安全
同時,在各自的/etc/sysconfig/network文件中的HOSTNAME改成相應內容,如192.168.1.254中須要修改成:
[root@MasterHost CYX]# cat /etc/sysconfig/network
NETWORKING=yes
#HOSTNAME=localhost.localdomain
HOSTNAME=Master
重啓網絡服務後主機名更改生效:service network restart
如圖:
服務器
4.3 結果驗證
Master、Slave一、Slave2之間互相能ping通,如:
網絡
5 增長hadoop用戶
5.1 配置目的
不在root下進行安裝的目的是防止對操做系統進行的某些改動,可能影響了服務器上其它的服務,起到隔離做用。而且在刪除Hadoop服務時較爲方便。
5.2 配置過程
增長用戶組:groupadd hadoop
增長用戶(放置hadoop用戶組中):useradd -g hadoop hadoop
利用root 用戶修改hadoop用戶密碼:passwd hadoop
如圖:
5.3 結果驗證
能夠查看/home文件夾下面是否建立了hadoop用戶,默認狀況下,建立的用戶位於/home目錄下:
若是該用戶要操做其它目錄的文件,須要root用戶進行權限分配,後面能夠看出這一點。
6 Hadoop用戶無密碼訪問配置
6.1 配置目的
需求是每一個機器均可以無密碼SSH到其餘的機器(固然能夠是root,也能夠是其餘的用戶,此處用戶是hadoop)。所以,這一步的前提是全部機器的hadoop已經正確建立。
6.2 配置過程
一、各個機器都進入到hadoop用戶中,進入根目錄:
su hadoop(切換進hadoop用戶)
cd ~(進入用戶根目錄,即/home/hadoop)
2.全部機器各自生成私鑰、公鑰:
ssh-keygen -t rsa
直接打Enter就能夠,若是提示覆蓋就選擇Y
如圖所示:
進入.ssh目錄:
cd .ssh
在這個目錄下面就能夠看到如下兩個文件
id_dsa id_dsa.pub
如圖所示:
其中,id_rsa是本機的私鑰,id_rsa.pub是本機的公鑰(公鑰是給其它機器使用的,私鑰是本身保留的,二者匹配代表驗證經過,但理論上也能夠反過來?),須要將公鑰拷貝到其它要訪問本機的機器上。
爲了方便拷貝,這裏採用的策略是:先將全部公鑰拷貝至Master機器,以後再所有複製至其它機器。
三臺機器都生成了以上的公鑰後:
在Master的hadoop用戶下的.ssh目錄建立Slave1和Slave2文件夾:
到Slave1和Slave2機器上分別將各自的公鑰拷貝至Master的Slave1和Slave2文件夾:
Slave1機器的.ssh目錄中操做:
scp id_rsa.pub hadoop@192.168.1.254:/home/hadoop/.ssh/Slave1
Slave2機器的.ssh目錄中操做:
scp id_rsa.pub hadoop@192.168.1.254:/home/hadoop/.ssh/Slave2
如圖爲Slave1的拷貝:
如圖爲Slave2的拷貝:
到Master機器上查看結果:
scp是Linux機器之間拷貝文件的頗有用的一個命令。
du –a能夠查看全部文件夾及子文件夾下面的全部文件(這是另外一個頗有用的命令)。
還能夠查看確認是否拷貝正確:
下面就是將上面的三部份內容拷貝至文件authorized_keys:
[hadoop@master .ssh]$ touch authorized_keys (建立新文件)
[hadoop@master .ssh]$ cat id_rsa.pub >> authorized_keys (>>表示追加至文件尾部)
[hadoop@master .ssh]$ cat Slave1/id_rsa.pub >> authorized_keys
[hadoop@master .ssh]$ cat Slave2/id_rsa.pub >> authorized_keys
修改authorized_keys的權限:
chmod 600 authorized_keys
這句話的含義是要保證authorized_keys只有用戶本身有寫權限,不然驗證無效,防止出現系統漏洞。
注意:文件和目錄的權限別設置成chmod 777(全部用戶均可以任意訪問),這個權限太大了,不安全。
再將authorized_keys拷貝至Slave1和Slave2機器上:
[hadoop@master .ssh]$ scp authorized_keys hadoop@Slave1:/home/hadoop/.ssh
[hadoop@master .ssh]$ scp authorized_keys hadoop@Slave2:/home/hadoop/.ssh
一樣,都要改變訪問權限:chmod 600 authorized_keys
此時便可以實現無密碼訪問:
6.3 結果驗證
在hadoop用戶下,3臺機器上互相進行ssh可以無密碼直接登陸,如:
[hadoop@master .ssh]$ ssh Slave1
Last login: Sun Jul 6 16:03:37 2014 from slave2
[hadoop@slave1 ~]$ exit
logout
Connection to Slave1 closed.
[hadoop@master .ssh]$ ssh Slave2
Last login: Sun Jul 6 01:03:11 2014 from slave1
[hadoop@slave2 ~]$ exit
logout
Connection to Slave2 closed.
注意,測試時登陸後須要exit退出,不然就至關於進入了另外一臺機器了。
7 Hadoop文件安裝
7.1 配置目的
在三臺機器上安裝Hadoop。
7.2 配置過程
實質上只要將hadoop-2.2.0.tar.gz釋放至某個地方便可。但考慮到三臺機器都須要進行後續的配置文件更改,而且各個機器的配置文件幾乎同樣,所以這裏能夠先在Master機器上進行安裝和配置,以後只須要拷貝過去便可。
這裏計劃安裝於/usr目錄下,但由於/usr目錄下默認hadoop用戶沒法操做,所以先切換回root用戶:
su –
而後將hadoop-2.2.0.tar.gz拷貝至/usr目錄下:
cp hadoop-2.2.0.tar.gz /usr
釋放:
[root@master usr]# tar -xzvf hadoop-2.2.0.tar.gz
賦予hadoop用戶操做該文件夾的權利:
chown -R hadoop:hadoop /usr/hadoop-2.2.0/
7.3 結果驗證
切換回hadoop用戶,查看hadoop-2.2.0文件夾是否屬於hadoop用戶:
8 Hadoop配置文件更改
配置文件都在目錄/usr/hadoop-2.2.0/etc/hadoop/下。
改成下面內容:全部三臺服務器可使用下面相同的配置文件。先在Master機器上修改,再改過去。
若是安裝路徑不同,則JAVA_HOME 和HADOOP_PREFIX等會不一樣,須要修改。
8.1 hadoop-env.sh
# Copyright 2011 The Apache Software Foundation
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Set Hadoop-specific environment variables here.
# The only required environment variable is JAVA_HOME. All others are
# optional. When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.
# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.7.0_55
# The jsvc implementation to use. Jsvc is required to run secure datanodes.
#export JSVC_HOME=${JSVC_HOME}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
# Extra Java CLASSPATH elements. Automatically insert capacity-scheduler.
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=64
#export HADOOP_NAMENODE_INIT_HEAPSIZE=""
# Extra Java runtime options. Empty by default.
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
#HADOOP_JAVA_PLATFORM_OPTS="-XX:-UsePerfData $HADOOP_JAVA_PLATFORM_OPTS"
# On secure datanodes, user to run the datanode as after dropping privileges
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}
# Where log files are stored. $HADOOP_HOME/logs by default.
#export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}/$USER
# Where log files are stored in the secure data environment.
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}
# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
# the user that will run the hadoop daemons. Otherwise there is the
# potential for a symlink attack.
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
# A string representing this instance of hadoop. $USER by default.
export HADOOP_IDENT_STRING=$USER
#hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib"
export HADOOP_PREFIX="/usr/hadoop-2.2.0"
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin
export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}
export HADOOP_COMMON_HOME=${HADOOP_PREFIX}
export HADOOP_HDFS_HOME=${HADOOP_PREFIX}
export YARN_HOME=${HADOOP_PREFIX}
8.2 yarn-env.sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# User for YARN daemons
export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
# resolve links - $0 may be a softlink
export YARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
# some Java parameters
export JAVA_HOME=/usr/java/jdk1.7.0_55
if [ "$JAVA_HOME" != "" ]; then
#echo "run java in $JAVA_HOME"
JAVA_HOME=$JAVA_HOME
fi
if [ "$JAVA_HOME" = "" ]; then
echo "Error: JAVA_HOME is not set."
exit 1
fi
JAVA=$JAVA_HOME/bin/java
JAVA_HEAP_MAX=-Xmx1000m
# For setting YARN specific HEAP sizes please use this
# Parameter and set appropriately
# YARN_HEAPSIZE=1000
# check envvars which might override default args
if [ "$YARN_HEAPSIZE" != "" ]; then
JAVA_HEAP_MAX="-Xmx""$YARN_HEAPSIZE""m"
fi
# Resource Manager specific parameters
# Specify the max Heapsize for the ResourceManager using a numerical value
# in the scale of MB. For example, to specify an jvm option of -Xmx1000m, set
# the value to 1000.
# This value will be overridden by an Xmx setting specified in either YARN_OPTS
# and/or YARN_RESOURCEMANAGER_OPTS.
# If not specified, the default value will be picked from either YARN_HEAPMAX
# or JAVA_HEAP_MAX with YARN_HEAPMAX as the preferred option of the two.
#export YARN_RESOURCEMANAGER_HEAPSIZE=1000
# Specify the JVM options to be used when starting the ResourceManager.
# These options will be appended to the options specified as YARN_OPTS
# and therefore may override any similar flags set in YARN_OPTS
#export YARN_RESOURCEMANAGER_OPTS=
# Node Manager specific parameters
# Specify the max Heapsize for the NodeManager using a numerical value
# in the scale of MB. For example, to specify an jvm option of -Xmx1000m, set
# the value to 1000.
# This value will be overridden by an Xmx setting specified in either YARN_OPTS
# and/or YARN_NODEMANAGER_OPTS.
# If not specified, the default value will be picked from either YARN_HEAPMAX
# or JAVA_HEAP_MAX with YARN_HEAPMAX as the preferred option of the two.
#export YARN_NODEMANAGER_HEAPSIZE=1000
# Specify the JVM options to be used when starting the NodeManager.
# These options will be appended to the options specified as YARN_OPTS
# and therefore may override any similar flags set in YARN_OPTS
#export YARN_NODEMANAGER_OPTS=
# so that filenames w/ spaces are handled correctly in loops below
IFS=
# default log directory & file
if [ "$YARN_LOG_DIR" = "" ]; then
YARN_LOG_DIR="$HADOOP_YARN_HOME/logs"
fi
if [ "$YARN_LOGFILE" = "" ]; then
YARN_LOGFILE='yarn.log'
fi
# default policy file for service-level authorization
if [ "$YARN_POLICYFILE" = "" ]; then
YARN_POLICYFILE="hadoop-policy.xml"
fi
# restore ordinary behaviour
unset IFS
YARN_OPTS="$YARN_OPTS -Dhadoop.log.dir=$YARN_LOG_DIR"
YARN_OPTS="$YARN_OPTS -Dyarn.log.dir=$YARN_LOG_DIR"
YARN_OPTS="$YARN_OPTS -Dhadoop.log.file=$YARN_LOGFILE"
YARN_OPTS="$YARN_OPTS -Dyarn.log.file=$YARN_LOGFILE"
YARN_OPTS="$YARN_OPTS -Dyarn.home.dir=$YARN_COMMON_HOME"
YARN_OPTS="$YARN_OPTS -Dyarn.id.str=$YARN_IDENT_STRING"
YARN_OPTS="$YARN_OPTS -Dhadoop.root.logger=${YARN_ROOT_LOGGER:-INFO,console}"
YARN_OPTS="$YARN_OPTS -Dyarn.root.logger=${YARN_ROOT_LOGGER:-INFO,console}"
if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
YARN_OPTS="$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"
fi
YARN_OPTS="$YARN_OPTS -Dyarn.policy.file=$YARN_POLICYFILE"
# hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib"
尤爲注意最後兩行的內容(HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib")。
另外注意,YARN框架中因爲啓動 HDFS 分佈式文件系統和啓動 MapReduce 框架分離(這實際上就是YARN提出的目的),JAVA_HOME 須要在 hadoop-env.sh 和 Yarn-env.sh 中分別配置。
8.3 core-site.xml
8.3.1 配置結果
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/hadoop-2.2.0/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>
8.3.2 參數解釋
core-size.xml
fs.default.name: Hadoop的默認文件系統,默認值是「file:///」
hadoop.tmp.dir: 臨時目錄的路徑,默認值是「/tmp/hadoop-${user.name}」
io.file.buffer.size: IO操做的緩衝區大小
8.4 hdfs-site.xml
8.4.1 配置結果
<configuration>
<property>
<name>dfs.name.dir</name>
<value>file:/usr/hadoop-2.2.0/dfs/name</value>
<description> </description>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:9001</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:/usr/hadoop-2.2.0/dfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>Master:9002</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.datanode.du.reserved</name>
<value>1073741824</value>
</property>
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
8.4.2 參數解釋
hdfs-site.xml
dfs.block.size: 數據塊的大小,默認值是64MB
dfs.replication: 數據塊副本的數量,默認值是3
dfs.name.dir: namenode存儲目錄的路徑,默認值是「${hadoop.tmp.dir}/dfs/name」
dfs.data.dir: datanode存儲目錄的路徑,默認值是「${hadoop.tmp.dir}/dfs/data」
dfs.checkpoint.dir: secondary namenode存儲目錄的路徑,默認值是「${hadoop.tmp.dir}/dfs/namesecondary」
dfs.datanode.ipc.address: datanode的RPC服務器地址和端口,默認值是0.0.0.0:50020
dfs.http.address: namenode的HTTP服務器地址和端口,默認值是0.0.0.0:50070
dfs.datanode.http.address: datanode的HTTP服務器地址和端口,默認值是0.0.0.0:50075
dfs.secondary.http.address: secondary namenode的HTTP服務器地址和端口,默認值是0.0.0.0:50090
8.5 mapred-site.xml
8.5.1 配置結果
注意下載的某些包可能沒有mapred-site.xml這個文件,將mapred-site.xml.template改成mapred-site.xml。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
注意,新框架支持第三方 MapReduce 開發框架以支持如 SmartTalk/DGSG 等非 Yarn 架構,注意一般狀況下這個配置的值都設置爲 Yarn,若是沒有配置這項,那麼提交的 Yarn job 只會運行在 locale 模式,而不是分佈式模式。
8.5.2 參數解釋
mapreduce.framework.name local 取值local、classic或yarn其中之一,若是不是yarn,則不會使用YARN集羣來實現資源的分配
mapreduce.map.memory.mb 1024 每一個MapReduce做業的map任務能夠申請的內存資源數量
mapreduce.map.cpu.vcores 1 每一個MapReduce做業的map任務能夠申請的虛擬CPU資源的數量
mapreduce.reduce.memory.mb 1024 每一個MapReduce做業的reduce任務能夠申請的內存資源數量
yarn.nodemanager.resource.cpu-vcores 8 每一個MapReduce做業的reduce任務能夠申請的虛擬CPU資源的數量
8.6 yarn-site.xml
8.6.1 配置結果
<configuration>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8990</value>
<description>host is the hostname of the resource manager and
port is the port on which the NodeManagers contact the Resource Manager.
</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8991</value>
<description>host is the hostname of the resourcemanager and port is the port
on which the Applications in the cluster talk to the Resource Manager.
</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
<description>In case you do not want to use the default scheduler</description>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8993</value>
<description>the host is the hostname of the ResourceManager and the port is the port on
which the clients can talk to the Resource Manager. </description>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/usr/hadoop-2.2.0/tmp/node</value>
<description>the local directories used by the nodemanager</description>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:8994</value>
<description>the nodemanagers bind to this port</description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
<description>the amount of memory on the NodeManager in GB</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/usr/hadoop-2.2.0/tmp/app-logs</value>
<description>directory on hdfs where the application logs are moved to </description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/usr/hadoop-2.2.0/tmp/app-logs</value>
<description>the directories used by Nodemanagers as log directories</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>shuffle service that needs to be set for Map Reduce to run </description>
</property>
</configuration>
尤爲要注意yarn.nodemanager.address的配置,由於不一樣的服務器上該地址不一樣,因此設置爲0.0.0.0。若是都設置爲MasterHost:8994,則會致使Slave節點上的NodeManager進程沒法啓動。
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:8994</value>
8.6.2 參數解釋
注意,配置這些參數前,應充分理解這幾個參數的含義,以防止誤配給集羣帶來的隱患。這些參數均須要在yarn-site.xml中配置。
1.ResourceManager相關配置參數
(1) yarn.resourcemanager.address
參數解釋:ResourceManager 對客戶端暴露的地址。客戶端經過該地址向RM提交應用程序,殺死應用程序等。
默認值:${yarn.resourcemanager.hostname}:8032
(2) yarn.resourcemanager.scheduler.address
參數解釋:ResourceManager 對ApplicationMaster暴露的訪問地址。ApplicationMaster經過該地址向RM申請資源、釋放資源等。
默認值:${yarn.resourcemanager.hostname}:8030
(3) yarn.resourcemanager.resource-tracker.address
參數解釋:ResourceManager 對NodeManager暴露的地址.。NodeManager經過該地址向RM彙報心跳,領取任務等。
默認值:${yarn.resourcemanager.hostname}:8031
(4) yarn.resourcemanager.admin.address
參數解釋:ResourceManager 對管理員暴露的訪問地址。管理員經過該地址向RM發送管理命令等。
默認值:${yarn.resourcemanager.hostname}:8033
(5) yarn.resourcemanager.webapp.address
參數解釋:ResourceManager對外web ui地址。用戶可經過該地址在瀏覽器中查看集羣各種信息。
默認值:${yarn.resourcemanager.hostname}:8088
(6) yarn.resourcemanager.scheduler.class
參數解釋:啓用的資源調度器主類。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。
默認值:
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
(7) yarn.resourcemanager.resource-tracker.client.thread-count
參數解釋:處理來自NodeManager的RPC請求的Handler數目。
默認值:50
(8) yarn.resourcemanager.scheduler.client.thread-count
參數解釋:處理來自ApplicationMaster的RPC請求的Handler數目。
默認值:50
(9) yarn.scheduler.minimum-allocation-mb/ yarn.scheduler.maximum-allocation-mb
參數解釋:單個可申請的最小/最大內存資源量。好比設置爲1024和3072,則運行MapReduce做業時,每一個Task最少可申請1024MB內存,最多可申請3072MB內存。
默認值:1024/8192
(10) yarn.scheduler.minimum-allocation-vcores / yarn.scheduler.maximum-allocation-vcores
參數解釋:單個可申請的最小/最大虛擬CPU個數。好比設置爲1和4,則運行MapRedce做業時,每一個Task最少可申請1個虛擬CPU,最多可申請4個虛擬CPU。
默認值:1/32
(11) yarn.resourcemanager.nodes.include-path /yarn.resourcemanager.nodes.exclude-path
參數解釋:NodeManager黑白名單。若是發現若干個NodeManager存在問題,好比故障率很高,任務運行失敗率高,則能夠將之加入黑名單中。注意,這兩個配置參數能夠動態生效。(調用一個refresh命令便可)
默認值:「」
(12) yarn.resourcemanager.nodemanagers.heartbeat-interval-ms
參數解釋:NodeManager心跳間隔
默認值:1000(毫秒)
2. NodeManager相關配置參數
(1) yarn.nodemanager.resource.memory-mb
參數解釋:NodeManager總的可用物理內存。注意,該參數是不可修改的,一旦設置,整個運行過程當中不可動態修改。另外,該參數的默認值是8192MB,即便你的機器內存不夠8192MB,YARN也會按照這些內存來使用(傻不傻?),所以,這個值必定要配置。不過,Apache已經正在嘗試將該參數作成可動態修改的。
默認值:8192
(2) yarn.nodemanager.vmem-pmem-ratio
參數解釋:每使用1MB物理內存,最多可用的虛擬內存數。
默認值:2.1
(3) yarn.nodemanager.resource.cpu-vcores
參數解釋:NodeManager總的可用虛擬CPU個數。
默認值:8
(4) yarn.nodemanager.local-dirs
參數解釋:中間結果存放位置,相似於1.0中的mapred.local.dir。注意,這個參數一般會配置多個目錄,已分攤磁盤IO負載。
默認值:${hadoop.tmp.dir}/nm-local-dir
(5) yarn.nodemanager.log-dirs
參數解釋:日誌存放地址(可配置多個目錄)。
默認值:${yarn.log.dir}/userlogs
(6) yarn.nodemanager.log.retain-seconds
參數解釋:NodeManager上日誌最多存放時間(不啓用日誌彙集功能時有效)。
默認值:10800(3小時)
(7) yarn.nodemanager.aux-services
參數解釋:NodeManager上運行的附屬服務。需配置成mapreduce_shuffle,纔可運行MapReduce程序
默認值:
8.7 capacity-scheduler.xml
8.7.1 配置結果
<configuration>
<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>10000</value>
<description>
Maximum number of applications that can be pending and running.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.1</value>
<description>
Maximum percent of resources in the cluster which can be used to run
application masters i.e. controls number of concurrent running
applications.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>
<description>
The ResourceCalculator implementation to be used to compare
Resources in the scheduler.
The default i.e. DefaultResourceCalculator only uses Memory while
DominantResourceCalculator uses dominant-resource to compare
multi-dimensional resources such as Memory, CPU etc.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>unfunded,default</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.unfunded.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
<value>1</value>
<description>
Default queue user limit a percentage from 0.0 to 1.0.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>100</value>
<description>
The maximum capacity of the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.state</name>
<value>RUNNING</value>
<description>
The state of the default queue. State can be one of RUNNING or STOPPED.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
<value>*</value>
<description>
The ACL of who can submit jobs to the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
<value>*</value>
<description>
The ACL of who can administer jobs on the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>-1</value>
<description>
Number of missed scheduling opportunities after which the CapacityScheduler
attempts to schedule rack-local containers.
Typically this should be set to number of racks in the cluster, this
feature is disabled by default, set to -1.
</description>
</property>
</configuration>
8.7.2 參數解釋
略。
8.8 slaves
該文件裏記錄了集羣中的全部slave節點的主機名,內容爲(不包括Master):
Slave1
Slave2
8.9 Hadoop文件從Master拷貝至全部Slave
由於Hadoop安裝實際上就是釋放,因此將配置好的Master機器上的相關文件拷貝至其它機器(徹底不用修改)。
考慮到權限問題,切換至root用戶拷貝至相同路徑後,再改變文件夾的屬性。
在Master機器上:
[root@master usr]# scp -r hadoop-2.2.0 root@Slave1:/usr
[root@master usr]# scp -r hadoop-2.2.0 root@Slave2:/usr
在Slave1機器上:
[root@slave1 usr]# chown -R hadoop:hadoop /usr/hadoop-2.2.0/
Slave2機器上:
8.10 命令行結果驗證
Hadoop集羣的啓動、關閉等操做都只須要在Master機器上進行便可(除非出現異常須要手動操做其它機器)。
進入bin目錄,HDFS格式化:
./hdfs namenode -format
結尾處:
只有INFO日誌信息,沒有ERROR等,則表示格式化完畢。
進入sbin目錄,啓動DFS:
./start-dfs.sh
利用jps命令查看進程:
Master機器上:
Slave1機器上:
這裏容易出現兩種問題:
一、是namenode進程沒有啓動,此時關閉dfs集羣,從新執行./hdfs namenode –format通常能夠解決。
二、是datanode進程沒有啓動,此時關閉dfs集羣,刪除tmp目錄下的文件,從新執行./hdfs namenode –format,通常能夠解決。
rm -rf /usr/hadoop-2.2.0/tmp/*
總之,若是有一些沒有啓動,一個是在/tmp目錄下有之前使用留下的文件沒有刪除,二個是由於端口被佔用了
若是是端口被佔用,可使用命令lsof –i:xxx查看是哪一個進程佔用,如圖所示:
而後啓動YARN:
./start-yarn.sh
在Slave1機器上新增長了一個進程:
上述命令中可能會出現警告(但實際上不影響正確運行):
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
緣由是RedHat是64位,hadoop安裝包是32位的,裏面包含的本地連接庫是32位的沒法使用,其連接庫有:
若是要使用這些庫須要從新編譯,不然就使用JAVA自己實現的class(效率低點?)
從上面能夠看出,file查看一下libhadoop.so的信息,爲32位:
不過這不影響Hadoop進程的啓動。
8.11 HTTP結果驗證
使用HTTP在客戶端訪問HDFS:
http://Master:9002/dfshealth.jsp(須要客戶端設置主機名)
或
http://192.168.1.254:9002/dfshealth.jsp
應該有兩個Slave節點:
點擊進去後,爲:
使用HTTP在客戶端訪問YARN:
http://Master:8088/cluster/
或
http://192.168.1.254:8088/cluster/
點擊Nodes,應該進入看到集羣的兩個節點Slave1和Slave2:
9 HDFS文件分佈式存儲位置查看
可使用調用hadoop fs來使用文件系統,大多數命令與Unix命令類似,主要的命令以下所示:
命令 說明
-help 獲取全部命令的詳細幫助文件
-ls 列舉文件
-df 顯示文件系統的容量、已用和可用空間
-du 顯示文件的空間使用狀況
-cp 複製文件或目錄
-mv 移動文件或目錄
-mkdir 建立目錄
-rm 刪除文件
-rmr 刪除目錄
-put 將本地文件複製到HDFS
-get 將HDFS上的文件複製到本地
-cat 取出文件內容並顯示到標準輸出
HDFS命令示例:
hadoop fs -mkdir /user/trunk
hadoop fs -ls /user
hadoop fs -lsr /user (遞歸的)
hadoop fs -put test.txt /user/trunk
hadoop fs -put test.txt . (複製到hdfs當前目錄下,首先要建立當前目錄)
hadoop fs -get /user/trunk/test.txt . (複製到本地當前目錄下)
hadoop fs -cat /user/trunk/test.txt
hadoop fs -tail /user/trunk/test.txt (查看最後1000字節)
hadoop fs -rm /user/trunk/test.txt
hadoop fs -help ls (查看ls命令的幫助文檔)
9.1 上傳文件
先建立一個Test目錄,從本地上傳一個log.txt(155MB左右)文件:
[hadoop@master bin]$ ./hadoop fs -mkdir /Test
[hadoop@master bin]$ ./hadoop fs -ls /Test
14/07/06 02:54:07 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@master bin]$
[hadoop@master bin]$ ./hadoop fs -put /home/hadoop/log.txt /Test
[hadoop@master bin]$ ./hadoop fs -ls /Test
14/07/06 02:55:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 2 hadoop supergroup 162163360 2014-07-06 02:54 /Test/log.txt
[hadoop@master bin]$
上傳完畢。
查看文件到底在NameNode和DataNode的什麼地方。
前面在配置文件hdfs-site.xml中指明瞭:
dfs.name.dir爲file:/usr/hadoop-2.2.0/dfs/name</value>
dfs.data.dir爲file:/usr/hadoop-2.2.0/dfs/data</value>
所以,NameNode上的文件元數據信息存放於目錄/usr/hadoop-2.2.0/dfs/name中;各個DataNode上的文件數據存放於各自機器的/usr/hadoop-2.2.0/dfs/data中。
9.2 NameNode存儲信息
進入目錄/usr/hadoop-2.2.0/dfs/name查看:
能夠看出,上面的各種文件就是NameNode存儲的信息
fsimage_N:這是一個CheckPoint(檢查點),而且全部小於等於N的Transaction都已經包含在內
edits inprogress N:這是一個Editlog文件,它的第一個Transaction的id是N,最後一個Transaction的id未知。這個文件要麼是ActiveNN正在寫入,要麼是前一個NN沒有正確的shutdown
edits N-M:這是一個Editlog文件,它包含了從N到M的全部的Transactions
例如,一個剛剛格式化的NameNode具備以下的內容:
一、fsimage_0 空的image文件
二、edits_inprogress_1 正在寫入的Editlog文件
當Editlog文件進行回滾roll的時以後, edits_inprogress將會被重命名爲edits_N-M。因此若是在一個寫入了10個edits的NameNode中進行roll的話,將會看到:
一、fsiamge_0 同上
二、edits_1-10 全部在roll以前的Transactions
三、edits_inprogress_11 正在寫入的edit文件
當進行CheckPoint的時候一個image被save或者upload時,將會進行如下驗證:任何fsiamge_N必須包含全部小於N的logs。因此若是在上一個例子中,若是調用了saveNamespace,將會看到:
一、fsimage_0 同上
二、edits_1-10 roll以前的Transactions
三、edits_11-12 包含有特殊的 BEGIN _LOG_SEGMENT以及END_LOG_SEGMENT可是並無進行namespace更改
四、fsimage_12 全部的edits都會寫入到namespace
五、edits_inprogress_13 被寫入的editlog文件
9.3 DataNode存儲信息
進入Slave1機器目錄/usr/hadoop-2.2.0/dfs/data查看:
DataNode的目錄結構以下:
${dfs.data.dir}/current/VERSION
/blk_<id_1>
/blk_<id_1>.meta
/blk_<id_1>
/blk_<id_1>.meta
/...
/blk_<id_64>
/blk_<id_64>.meta
/subdir0/
/subdir1/
/...
/subdir63/
/previous/
/detach/
/tmp/
/in_use.lock
/storage
其含義分別爲:
in_use.lock是一個鎖文件,誰得到了鎖,誰就能夠往其餘地方寫信息了,好比能夠cat下看看:
[hadoop@slave2 dfs]$ cat data/in_use.lock
22245@slave2[hadoop@slave2 dfs]$ cat data/in_use.lock
其裏面的內容是22245@slave2[hadoop@slave2 dfs]$ cat data/in_use.lock
表名目前22245這個進程的什麼在操做這個文件,得到了該文件鎖。
另外,好比查看VERSION:
[hadoop@slave2 dfs]$ cat data/current/BP-860734396-192.168.1.254-1404637733243/current/VERSION
#Sun Jul 06 02:09:19 PDT 2014
namespaceID=989242776
cTime=0
blockpoolID=BP-860734396-192.168.1.254-1404637733243
layoutVersion=-47
[hadoop@slave2 dfs]$
log.txt(155MB)文件的實際數據存儲於下面四個文件:
Slave1機器上:
131072 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741825
27292 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741826
Slave2機器上:
131072 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741825
27292 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741826
兩臺機器上的文件內容徹底相同,131072即128MB,因爲log.txt文件大小大於128MB的Block,因而被切分爲兩個文件,這種切分是徹底嚴格按照128MB大小切分的(不考慮文件的任何含義)。
另外,兩臺機器上都各自有兩個meta文件:
1028 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741825_1001.meta
216 ./data/current/BP-860734396-192.168.1.254-1404637733243/current/finalized/blk_1073741826_1002.meta
這兩個文件分別是上面兩個文件的元數據,實際上就是CRC校驗。
HDFS中,每512字節就作一個32位的CRC校驗,好比上面的128MB數據一共134217728字節,分爲262144個512大小的塊,每一個塊使用4字節CRC校驗,一共有1048576字節,即恰好1MB。
不過從文件大小來看,其實是1028KB,應該是附加了一些其餘的信息。
查看blk_1073741826_1002.meta的前幾行內容:
能夠看出,文件的起始內容是「ache.hadoop….」,代表log.txt文件被嚴格分割,在HDFS這一層面,其分割是不考慮文件含義的。但在MapReduce對log.txt進行計算(好比統計單詞的個數)的時候,則須要考慮log.txt自己的格式。這些HDFS能夠進行統一處理,使得MapReduce不知道文件的某一行其實是存儲於哪一臺機器上,若是某一行被分割在了兩臺機器,那麼HDFS負責獲取,跟Linux上文件被分割在了多個扇區一個道理。