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

相关文章
相关标签/搜索