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存储信息
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的虚拟化支持。不同的主板其位置不同,如:
其原因是,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可以打开多个远程桌面终端。
客户端访问:
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使之立即生效(这是一个很有用的命令)。
如图:
理论上,不配置JAVA_HOME也可以,在Hadoop的配置文件再具体指定也可以保证Hadoop启动,但设置好一些常用的环境变量要方便很多。
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 ~]#
出现上面的版本信息表示安装成功。如图:
[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、Slave1、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 配置过程
1、各个机器都进入到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机器上:
这里容易出现两种问题:
1、是namenode进程没有启动,此时关闭dfs集群,重新执行./hdfs namenode –format一般可以解决。
2、是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具有如下的内容:
1、fsimage_0 空的image文件
2、edits_inprogress_1 正在写入的Editlog文件
当Editlog文件进行回滚roll的时之后, edits_inprogress将会被重命名为edits_N-M。所以如果在一个写入了10个edits的NameNode中进行roll的话,将会看到:
1、fsiamge_0 同上
2、edits_1-10 所有在roll之前的Transactions
3、edits_inprogress_11 正在写入的edit文件
当进行CheckPoint的时候一个image被save或者upload时,将会进行以下验证:任何fsiamge_N必须包含所有小于N的logs。所以如果在上一个例子中,如果调用了saveNamespace,将会看到:
1、fsimage_0 同上
2、edits_1-10 roll之前的Transactions
3、edits_11-12 包含有特殊的 BEGIN _LOG_SEGMENT以及END_LOG_SEGMENT但是并没有进行namespace更改
4、fsimage_12 所有的edits都会写入到namespace
5、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上文件被分割在了多个扇区一个道理。