Hadoop2.2.0安裝過程記錄

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上文件被分割在了多個扇區一個道理。

相關文章
相關標籤/搜索