基于Hadoop 2.2.0的高可用性集群搭建步骤(64位)

来源:互联网 发布:matlab数据相关性分析 编辑:程序博客网 时间:2024/04/30 12:45

内容概要: CentSO_64bit集群搭建, hadoop2.2(64位)编译,安装,配置以及测试步骤

到2013年为止: 基于yarn计算框架和高可用性DFS的第一个稳定版本

注1:官网只提供32位release版本, 若机器为64位,需要手动编译。 

0. 编译前的准备

虚拟机vmware准备,64bit CentOS准备,jdk7_64bit准备,maven准备,protobuf-2.5.0准备,hadoop-2.2s源码包准备
CentSO_64bit官网下载地址:http://mirrors.skyshe.cn/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.isovmware个人网盘下载地址http://pan.baidu.com/s/1i39QcBjjdk7_64bit官网下载地址http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz?AuthParam=1399264951_dffaab7076f5609189e1cd907ff66124maven官网下载地址http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gzhadoop-2.2源码包官网下载地址http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.2.0/hadoop-2.2.0-src.tar.gz

节点ip

cluster1   172.16.102. 201cluster2   172.16.102. 202cluster3   172.16.102. 203cluster4   172.16.102. 204


各节点职能划分     

cluster1         resourcemanager, nodemanager,proxyserver,historyserver, datanode, namenode,cluster2         datanode, nodemanagercluster3   datanode, nodemanagercluster4   datanode, nodemanager


说明

以下关于修改hostname, 设置静态ip, ssh免登陆,关闭防火墙等步骤,放在文章末尾,这些内容并不是本文讨论的重点。

1. hadoop2.2编译

1
说明:标准的bash提示符,root用户为'#',普通用户为'%',由于博客编辑器的缘故,'#'提示符会被默认为comment, 因此在这篇博文中不再区分root和普通user的提示符, 默认全部为'$'

  因为我们安装的CentOS是64bit的,而官方release的hadoop2.2.0版本没有对应的64bit安装包,故需要自行编译。

  首先安装已经下载64位jdk:

 
$suroot$wget http://download.oracle.com/otn-pub/java/jdk/7u45-b18/jdk-7u45-linux-x64.tar.gz

  注: prompt(提示符)为%默认为当前用户, #则为root,注意以下各步骤中的prompt类型。

  下面为hadoop编译步骤(注:中间部分的文本框里内容提要只是一些补充说明,不要执行框里的命令)

  1.1 BOTPROTO改为”dhcp”

 
$suroot$sed–i  s/static/dhcp/g/etc/sysconfig/network-scripts/ifcfg-eth0#servicenetwork restart

1.2 下载hadoop2.2.0 源码

 
$sugrid$cd~wget  http://apache.dataguru.cn/hadoop/common/stable/hadoop-2.2.0-src.tar.gz


  1.3 安装maven

 
$suroot$cd/optwget http://apache.fayea.com/apache-mirror/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz$tarzxvf apache-maven-3.1.1-bin.tar.gz$cdapache-maven-3.1.1


  修改系统环境变量有两种方式,修改/etc/profile, 或者在/etc/profile.d/下添加定制的shell文件,

         鉴于profile文件的重要性,尽量不要在profile文件里添加内容,官方建议采用第二种,以保证profile文件的绝对安全。

  下面采用第二种方式:

  首先,创建一个简单shell脚脚本并添加相关内容进去:

 
$cd/etc/profile.d/$touchmaven.sh


其次,maven.sh里添加内容如下:
 
#environmentvariable settings for mavn2export MAVEN_HOME='/opt/apache-maven-3.1.1'3export PATH=$MAVEN_HOME/bin:$PATH


最后,source一下


<code class="bash plain">$</code><code class="bash functions">source</code><code class="bash plain">/etc/profile</code>$mvn -version Apache Maven 3.1.1


1.4 安装protobuf

注意apache官方网站上的提示“NOTE: You will need protoc 2.5.0 installed.”

$suroot$cd/optwget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2$tarxvf protobuf-2.5.0.tar.bz2 (注意压缩文件后缀, maven安装包是—gzip文件,解压时需加–z)$cdprotobuf-2.5.0./configure



 安装protobuf时提示报错”configure: error: C++ preprocessor "/lib/cpp" failssanity check”

安装gcc

1
$yum installgcc

1.5 编译hadoop

首先从官网下载hadoop2.2.0source code:

$sugrid;$cd~grid/wget http://apache.dataguru.cn/hadoop/common/stable/hadoop-2.2.0-src.tar.gz


好了,痛苦的编译过程来了。

解压之:

$tar zxvf hadoop-2.2.0-src.tar.gz$cdhadoop-2.2.0-src


1.6 给maven指定国内镜像源

1.6.1. 切换root权限, 修改/opt/apache-maven-3.1.1/conf/settings.xml

$suroot$vim /opt/apache-maven-3.1.1/conf/settings.xml


修改1. 在<mirrors>…</mirrors>里添加国内源(注意,保留原本就有的<mirrors>...</mirrors>):

1  <mirrors> 2     <mirror>3         <id>nexus-osc</id>4         <mirrorOf>*</mirrorOf>5     <name>Nexusosc</name>6     <url>http://maven.oschina.net/content/groups/public/</url>7     </mirror>8 </mirrors>

 

修改2. 在<profiles>标签中增加以下内容(保留原来的<profiles>…</profiles>, jdk版本根据用户的情况填写)



   <profile>       <id>jdk-1.4</id>       <activation>          <jdk>1.4</jdk>        </activation>      <repositories>          <repository>           <id>nexus</id>            <name>local private nexus</name>           <url>http://maven.oschina.net/content/groups/public/</url>           <releases>             <enabled>true</enabled>           </releases>          <snapshots>            <enabled>false</enabled>          </snapshots>        </repository>      </repositories>     <pluginRepositories>        <pluginRepository>           <id>nexus</id>           <name>local private nexus</name>           <url>http://maven.oschina.net/content/groups/public/</url>           <releases>             <enabled>true</enabled>           </releases>           <snapshots>             <enabled>false</enabled>           </snapshots>         </pluginRepository>       </pluginRepositories>     </profile> </profiles>



   1.6.2 将刚才修改的配置文件拷到当前用户home目录下


$ su grid$ sudo cp /opt/apache-maven-3.1.1/conf/settings.xml ~/.m2/#若提示该用户不在sudoers里,执行以下步骤:$ su root #在sudoers里第99行添加当前用户(下面行号不要加):$ cat /etc/sudoers  root     ALL=(ALL)       ALL  grid     ALL=(ALL)       ALL

1.7 现在执行官方的clean步骤:
 $mvn clean install –DskipTests

 漫长的等待后发现安装一切正常。

1.8 安装3个依赖包

1
2
3
Cmake
ncurses-devel
openssl-devel

执行以下步骤:

suroot$yum installncurses-devel$yum installopenssl-devel$yum installcmake89


以上安装完成后,切回用户grid:

1
2
$sugrid
$cd~/hadoop-2.2.0-src

1.9 所有依赖已安装完毕,开始编译

1
$mvn package-Pdist,native -DskipTests -Dtar

漫长的等待后,编译成功,查看结果:

一切正常。至此,hadoop2.2.0编译完成。

1.10 验证

下面验证编译结果是否符合预期, 注意我们当前是在目录~/hadoop-2.2.0-src下,

1
2
3
$cdhadoop-dist/
$ls
pom.xml  target

 以上为maven编译的配置文件

$cdtarget$ls-sFtotal 276M4.0K antrun/                    92M hadoop-2.2.0.tar.gz            4.0K maven-archiver/4.0K dist-layout-stitching.sh  4.0K hadoop-dist-2.2.0.jar          4.0Ktest-dir/4.0K dist-tar-stitching.sh     184M hadoop-dist-2.2.0-javadoc.jar4.0K hadoop-2.2.0/             4.0K javadoc-bundle-options/


以上为maven编译后自动生成的目录文件,进入hadoop-2.2.0:

1
2
3
$cdhadoop-2.2.023
$ls
bin  etc  include  lib libexec  sbin  share

这才是和官方release2.2.0版本(官方只有32bit版本)的相同的目录结构。

1.10.1 下面主要验证两项:

a.验证版本号

1
2
3
4
5
6
7
$bin/hadoopversion
Hadoop 2.2.0
Subversion Unknown -r Unknown
Compiled by grid on 2013-11-06T13:51Z
Compiled with protoc 2.5.0
From sourcewith checksum 79e53ce7994d1628b240f09af91e1af4
This commandwas run using/home/grid/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar

 可以看到hadoop版本号,编译工具(protoc2.5.0版本号与官方要求一致)以及编译日期.

b.验证hadoop lib的位数

$file lib//native/*lib//native/libhadoop.a:        current ar archivelib//native/libhadooppipes.a:   current ar archivelib//native/libhadoop.so:       symbolic link to `libhadoop.so.1.0.0'lib//native/libhadoop.so.1.0.0:<strong>ELF 64-bitLSB</strong> shared object, x86-64, version 1 (SYSV), dynamically linked, notstripped1011 lib//native/libhadooputils.a:   current ar archive1213 lib//native/libhdfs.a:          current ar archive1415 lib//native/libhdfs.so:         symbolic link to `libhdfs.so.0.0.0'lib//native/libhdfs.so.0.0.0:   <strong>ELF 64-bit LSB shared object</strong>, x86-64,version 1 (SYSV), dynamically linked, not stripped


看到黑色的“ELF-64bit LSB”证明64bit hadoop2.2.0初步编译成功,查看我们之前的hadoop0.20.3版本,会发现lib//native/libhadoop.so.1.0.0是32bit,这是不正确的!。^_^

2. hadoop2.2配置

2.1 home设置

为了和MRv1区别, 2.2版本的home目录直接命名为yarn:

$suhadoop$cd~$mkdir–p yarn/yarn_data67$cp–a ~hadoop/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0  ~hadoop/yarn


2.2 环境变量设置

~/.bashrc里添加新环境变量:


# javaenvexport JAVA_HOME="/usr/java/jdk1.7.0_45" exportPATH="$JAVA_HOME/bin:$PATH"# hadoopvariable settingsexport HADOOP_HOME="$HOME/yarn/hadoop-2.2.0"export HADOOP_PREFIX="$HADOOP_HOME/"export YARN_HOME=$HADOOP_HOMEexport HADOOP_MAPRED_HOME="$HADOOP_HOME"export HADOOP_COMMON_HOME="$HADOOP_HOME"export HADOOP_HDFS_HOME="$HADOOP_HOME"exportHADOOP_CONF_DIR="$HADOOP_HOME/etc/hadoop/"exportYARN_CONF_DIR=$HADOOP_CONF_DIRexportPATH="$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH"


以上操作注意2点:

  1. jdk一定要保证是64bit的

  2.HADOOP_PREFIX极其重要,主要是为了兼容MRv1,优先级最高(比如寻找conf目录,即使我们配置了HADOOP_CONF_DIR,启动脚本依然会优先从$HADOOP_PREFIX/conf/里查找),一定要保证此变量正确配置(也可不设置,则默认使用HADOOP_HOME/etc/hadoop/下的配置文件)

2.3 改官方启动脚本的bug

说明:此版本虽然是release稳定版,但是依然有非常弱智的bug存在。

正常情况下,启动守护进程$YARN_HOME/sbin/hadoop-daemons.sh中可以指定node.

我们看下该启动脚本的说明:

1
2
$sbin/hadoop-daemons.sh
Usage:hadoop-daemons.sh [--config confdir] [--hosts hostlistfile] [start|stop]commandargs...

可以看到--hosts可以指定需要启动的存放节点名的文件名:

但这是无效的,此脚本调用的$YARN_HOME/libexec/hadoop-config.sh脚本有bug.

先建一个文件datanodefile 添加datanode节点,放入conf/文件夹下,然后执行一下启动脚本:

1
2
$sbin/hadoop-daemons.sh --hosts datanodefile start datanode
at: /home/grid/yarn/hadoop-2.2.0/etc/hadoop//126571:No suchfileor directory

分析脚本,定位到嵌套脚本$YARN_HOME/libexec/hadoop-config.sh第96行:

1
96         export HADOOP_SLAVES="${HADOOP_CONF_DIR}/$$1"

看到红色部分是不对的,应该修改为:

1
96         export HADOOP_SLAVES="${HADOOP_CONF_DIR}/$1"

备注1:此版本11月初发布至今,网上教程不论中文还是英文,均未提及此错误。

备注2:$YARN_HOME/libexec/hadoop-config.sh中分析hostfile的逻辑非常脑残:

if["--hosts"="$1"]    then         shift        export HADOOP_SLAVES="${HADOOP_CONF_DIR}/%$1"         shift


因此,用户只能将自己的hostfile放在${HADOOP_CONF_DIR}/ 下面,放在其它地方是无效的。

备注3:按照$YARN_HOME/libexec/hadoop-config.sh脚本的逻辑,还有一种方式指定host

1
$hadoop-daemons.sh –hostnames cluster1 start datanode

注意,因为bash脚本区分输入参数的分割符为\t或\s,所以限制了此种方式只能指定一个单独的节点

总结以上分析和修改步骤:

$cd$YARN_HOME/libexec/$vim hadoop-config.sh#修改第96行代码为:export HADOOP_SLAVES="${HADOOP_CONF_DIR}/$1"#保存退出vim


 2.4 配置文件设置


  <!--$YARN_HOME/etc/hadoop/core-site.xml-->                                                                                                                                                                                                                                   <?xml version="1.0"?>  <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>                                                                                                                                                                                                                                    <configuration> <property>  <name>fs.defaultFS</name>   <value>hdfs://cluster1:9000</value> </property>                                                                                                                                                                                                                                 <property> <name>hadoop.tmp.dir</name>  <value>/home/grid/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0//yarn_data/tmp/hadoop-grid</value> </property> </configuration>   备注1:注意fs.defaultFS为新的变量,代替旧的:fs.default.name   备注2:tmp文件夹放在我们刚才新建的$HOME/yarn/yarn_data/下面。    <!--$YARN_HOME/etc/hadoop/hdfs-site.xml--> <configuration>    <property>     <name>dfs.replication</name>     <value>3</value> </property> </configuration>



 

  备注1. 新:dfs.namenode.name.dir,旧:dfs.name.dir,新:dfs.datanode.name.dir,旧:dfs.data.dir

  备注2. dfs.replication确定 data block的副本数目,hadoop基于rackawareness(机架感知)默认复制3份分block,(同一个rack下两个,另一个rack下一 份,按照最短距离确定具体所需block, 一般很少采用跨机架数据块,除非某个机架down了)



     <!--$YARN_HOME/etc/hadoop/yarn-site.xml-->                                                                                                                                                                                                                               <configuration>     <property>       <name>yarn.nodemanager.aux-services</name>       <value>mapreduce_shuffle</value>    </property>                                                                                                                                                                                                                                 <property>      <name>yarn.resourcemanager.address</name>      <value>cluster1:8032</value>   </property>                                                                                                                                                                                                                               <property>       <name>yarn.resourcemanager.resource-tracker.address</name>       <value>cluster1:8031</value>   </property>                                                                                                                                                                                                                               <property>       <name>yarn.resourcemanager.admin.address</name>       <value>cluster1:8033</value>   </property>                                                                                                                                                                                                                               <property>       <name>yarn.resourcemanager.scheduler.address</name>       <value>cluster1:8030</value>   </property>                                                                                                                                                                                                                               <property>       <name>yarn.nodemanager.loacl-dirs</name>       <value>/home/grid/hadoop-2.2.0-src/hadoop-dist/target//hadoop-2.2.0/yarn_data/mapred/nodemanager</value>       <final>true</final>   </property>                                                                                                                                                                                                                               <property>       <name>yarn.web-proxy.address</name>       <value>cluster1:8888</value>   </property>                                                                                                                                                                                                                               <property>      <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>      <value>org.apache.hadoop.mapred.ShuffleHandler</value>   </property> </configuration>



 

在此特意提醒:

  (1) 目前网上盛传的各种hadoop2.2的基于分布式集群的安装教程大部分都是错的,hadoop2.2配置里最重要的也莫过于yarn-site.xml里的变量了吧?

(2)不同于单机安装,基于集群的搭建必须设置yarn-site.xml可选变量yarn.web-proxy.addressyarn.nodemanager.loacl-dirs外的其它所有变量!后续会专门讨论yarn-site.xml里各个端口配置的含义。


 <!--$YARN_HOME/etc/hadoop/mapred-site.xml-->                                                                                                                                                                                                            <configuration>     <property>        <name>mapreduce.framework.name</name>         <value>yarn</value>     </property> </configuration>



 

 备注1:新的计算框架取消了实体上的jobtracker, 故不需要再指定mapreduce.jobtracker.addres,而是要指定一种框架,这里选择yarn. 备注2:hadoop2.2.还支持第三方的计算框架,但没怎么关注过。
配置好以后将$HADOOP_HOME下的所有文件,包括hadoop目录分别copy到其它3个节点上。

2.5 各节点功能规划

确保在每主机的/etc/hosts里添加了所有node的域名解析表(i.e.cluster1 198.0.0.1);iptables已关闭;/etc/sysconfig/network-script/ifcfg-eth0里 BOTPROTO=static;/etc/sysconfig/network文件里已设置了各台主机的hostname, 静态ip地址,且已经重启过每台机器;jdk和hadoop都为64bit;ssh免登陆已配置;完成以上几项后,就可以启动hadoop2.2.0了。

注意到从头到尾都没有提到Master, Slave,也没有提到namenode,datanode,是因为,新的计算框架,新的hdfs中不存在物理上的Master节点,所有的节点都是等价的。

各节点职能划分在篇首已有说明, 在此重提一下:

cluster1    resourcemanager, nodemanager, proxyserver,historyserver, datanode, namenode,cluster2    datanode, nodemanagercluster3    datanode, nodemanagercluster4    datanode, nodemanager


  2.6 hdfs 格式化

$bin/hdfsnamenode –format


(注意:hadoop 2.2.0的格式化步骤和旧版本不一样,旧的为 $YARN_HOME/bin/hadoop namenode –format)

  2.7 hadoop整体启动

  启动方式(1)分别登录各自主机开启

  在cluster1节点上,分别启动resourcemanager,nodemanager, proxyserver, historyserver, datanode, namenode,

  在cluster2, cluster3, cluster4 节点主机上,分别启动datanode,nodemanager

  备注:如果resourcemanager是 独立的,则除了resourcemanager,其余每一个节点都需要一个nodemanager,我们可以在$YARN_HOME/etc /hadoop/下新建一个nodehosts, 在里面添加所有的除了resourcemanager外的所有node,因为此处我们配置的resourcemanager和namenode是同一台主 机,所以此处也需要添加nodemanager

  执行步骤如下:

$hostname  #查看host名字cluster1$sbin/hadoop-daemon.sh  --script hdfs start namenode  # 启动namenode$sbin/hadoop-daemon.sh --script hdfs start datanode  # 启动datanode$sbin/yarndaemon.shstart nodemanager  #启动nodemanager$sbin/yarn-daemon.sh   start resourcemanager # 启动resourcemanager$sbin/yarn-daemon.shstart proxyserver  #启动web App proxy, 作用类似jobtracker,若yarn-site.xml里没有设置yarn.web-proxy.address的host和端口,或者设置了和resourcemanager相同的host和端口,则hadoop默认proxyserver和resourcemanager共享host:port$sbin/mr-jobhistory-daemon.sh   start historyserver  #你懂得$sshcluster2 #登录cluster2$hostname  #查看host名字cluster2$sbin/yarndaemon.shstart nodemanager  # 启动nodemanager$sbin/hadoop-daemon.sh  --script hdfs start datanode  # 启动datanode$sshcluster3 #登录cluster3...# cluster2, cluster3, cluster4启动方式和cluster2一样。


启动方式(2)使用hadoop自带的批处理脚本开启

 Step1.确认已登录cluster1:

$hostnamecluster1


 在$YARN_HOME/etc/hadoop/下新建namenodehosts,添加所有namenode节点

$cat$YARN_HOME/etc/hadoop/namenodehostscluster1


在$YARN_HOME/etc/hadoop/下新建datanodehosts,添加所有datanode节点

$cat$YARN_HOME/etc/hadoop/datanodehostscluster2cluster3cluster4


在$YARN_HOME/etc/hadoop/下新建nodehosts,添加所有datanode和namenode节点

$cat$YARN_HOME/etc/hadoop/datanodehostscluster1cluster2cluster3cluster4


备注:以上的hostfile名字是随便起的,可以是任意的file1,file2,file3, 但是必须放在$YARN_HOME/etc/hadoop/下面!

Step2.执行脚本

$sbin/hadoop-daemons.sh--hosts namenodehosts --script  hdfsstart  namenode$sbin/hadoop-daemons.sh--hosts datanodehosts --script  hdfsstart  datanode$sbin/yarn-daemons.sh--hostnames cluster1 start resourcemanager$sbin/yarn-daemons.sh--hosts allnodehosts start nodemanager$sbin/yarn-daemons.sh--hostnames cluster1 start proxyserver$sbin/mr-jobhistory-daemon.sh   start  historyserver

 在这里不得不纠正一个其他教程上关于对hadoop2.2做相关配置和运行时的错误!

  我们在core-site.xml指定了default filesystem为cluster1, 并指定了其节点ip(或节点名)和端口号, 这意味着若启动hadoop时不额外添加配置(启动hadoop时命令行里加--conf指定用户配置文件的存放位置),则默认的namenode就一个,那就是cluster1, 如果随意指定namenode必然会出现错误!

  如果你要还要再启动一个新的namenode(以cluster3为例),则必须如下操作:

  a. 新建一个core-site.xml,添加fs.defaultFS的value为hdfs://cluster3:9000

  b. command:

$sbin/hadoop-daemon.sh --hostnames cluster3 --conf you_conf_dir --script hdfs --start namenode


我们之前启动的namenode为cluster1, 假如要查看放在此文件系统根目录下的文件input_file,则它的完整路径为 hdfs://cluster1:9000/input_file

Step3.查看启动情况

在cluster1上:

$jps22411 NodeManager23356 Jps22292 ResourceManager22189 DataNode22507 WebAppProxyServer


在cluster2上

$jps8147 DataNode8355 Jps8234 NodeManager


cluster3,cluster4上和cluster2一样。

Step4.查看各节点状态以及yarncluster运行状态

(1)查看各节点状态

FireFox进入: http://cluster1:50070(cluster1为namenode所在节点)

在主页面(第一张图)上点击Live Node,查看(第二张图)上各Live Node状态:


(2)查看resourcemanager上cluster运行状态

Firefox进入:http://cluster2:8088(node1为resourcemanager所在节点)


  Step5. Cluster上MapReduce测试

  现提供3个test cases

  Test Case 1  testimated_value_of_pi

command:

$sbin/yarnjar $YARN_HOME/share/hadoop//mapreduce/hadoop-mapreduce-examples-2.2.0.jar \pi 101000000

console输出:


Number of Maps  =10                       Samples per Map = 1000000                        Wrote input for Map #0                         Wrote input for Map #1                         Wrote input for Map #2                        Wrote input for Map #3                       Wrote input for Map #4                      Wrote input for Map #5                        Wrote input for Map #6                       Wrote input for Map #7                       Wrote input for Map #8                       Wrote input for Map #9                       Starting Job                       13/11/06 23:20:07 INFO Configuration.deprecation: mapred.map.tasksis deprecated. Instead, use mapreduce.job.maps                       13/11/06 23:20:07 INFO Configuration.deprecation:mapred.output.key.class is deprecated. Instead, usemapreduce.job.output.key.class                        13/11/06 23:20:07 INFO Configuration.deprecation:mapred.working.dir is deprecated. Instead, use mapreduce.job.working.dir                        13/11/06 23:20:11 INFO mapreduce.JobSubmitter: Submittingtokens for job: job_1383806445149_0001                        13/11/06 23:20:15 INFO impl.YarnClientImpl: Submittedapplication application_1383806445149_0001 to ResourceManager at /0.0.0.0:8032                      13/11/06 23:20:16 INFO mapreduce.Job: The url to trackthe job: http://Node1:8088/proxy/application_1383806445149_0001/                       13/11/06 23:20:16 INFO mapreduce.Job: Running job:job_1383806445149_0001                        13/11/06 23:21:09 INFO mapreduce.Job: Jobjob_1383806445149_0001 running in uber mode : false                       13/11/06 23:21:10 INFO mapreduce.Job:  map 0% reduce 0%                         13/11/06 23:24:28 INFO mapreduce.Job:  map 20% reduce 0%                        13/11/06 23:24:30 INFO mapreduce.Job:  map 30% reduce 0%                         13/11/06 23:26:56 INFO mapreduce.Job:  map 57% reduce 0%                         13/11/06 23:26:58 INFO mapreduce.Job:  map 60% reduce 0%                         13/11/06 23:28:33 INFO mapreduce.Job:  map 70% reduce 20%                        13/11/06 23:28:35 INFO mapreduce.Job:  map 80% reduce 20%                        13/11/06 23:28:39 INFO mapreduce.Job:  map 80% reduce 27%                        13/11/06 23:30:06 INFO mapreduce.Job:  map 90% reduce 27%                        13/11/06 23:30:09 INFO mapreduce.Job:  map 100% reduce 27%                        13/11/06 23:30:12 INFO mapreduce.Job:  map 100% reduce 33%                        13/11/06 23:30:25 INFO mapreduce.Job:  map 100% reduce 100%                         13/11/06 23:30:54 INFO mapreduce.Job: Jobjob_1383806445149_0001 completed successfully                         13/11/06 23:31:10 INFO mapreduce.Job: Counters: 43                                  File SystemCounters                                           FILE:Number of bytes read=226                                           FILE:Number of bytes written=879166                                            FILE:Number of read operations=0                                           FILE:Number of large read operations=0                                          FILE:Number of write operations=0                                           HDFS:Number of bytes read=2590                                             HDFS:Number of bytes written=215                                             HDFS:Number of read operations=43                                             HDFS:Number of large read operations=0                                               HDFS:Number of write operations=3                                  JobCounters                                            Launchedmap tasks=10                                              Launchedreduce tasks=1                                             Data-localmap tasks=10                                              Totaltime spent by all maps in occupied slots (ms)=1349359                                           Totaltime spent by all reduces in occupied slots (ms)=190811                                  Map-ReduceFramework                                           Mapinput records=10                                            Mapoutput records=20                                              Mapoutput bytes=180                                               Mapoutput materialized bytes=280                                              Inputsplit bytes=1410                                               Combineinput records=0                                              Combineoutput records=0                                                Reduceinput groups=2                                               Reduceshuffle bytes=280                                            Reduceinput records=20                                              Reduceoutput records=0                                               SpilledRecords=40                                               ShuffledMaps =10                                                FailedShuffles=0                                              MergedMap outputs=10                                               GCtime elapsed (ms)=45355                                               CPUtime spent (ms)=29860                                               Physicalmemory (bytes) snapshot=1481818112                                               Virtualmemory (bytes) snapshot=9214468096                                               Totalcommitted heap usage (bytes)=1223008256                                      ShuffleErrors                                            BAD_ID=0                                            CONNECTION=0                                           IO_ERROR=0                                            WRONG_LENGTH=0                                             WRONG_MAP=0                                          WRONG_REDUCE=0                                  File InputFormat Counters                                            BytesRead=1180                                  File OutputFormat Counters                                           BytesWritten=97                          13/11/06 23:31:15 INFO mapred.ClientServiceDelegate:Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirectingto job history server                         Job Finished in 719.041 seconds                         Estimated value of Pi is 3.14158440000000000000

 

说明:可以看到最后输出值为该job使用了 10个maps, job id为job_1383806445149_000, 最后计算得Pi的值为13.14158440000000000000, job Id分配原则为job_年月日时分_job序列号,序列号从0开始,上限值为1000, task id分配原则为job_年月日时分_job序列号_task序列号_m, job_年月日时分_job序列号_task序列号_r, m代表map taskslot , r代表reduce task slot, task 序列号从0开始,上限值为1000.

Test Case 2 random_writting

#command line$sbin/yarnjar $YARN_HOME/share/hadoop//mapreduce/hadoop-mapreduce-examples-2.2.0.jar \randomwriter/user/grid/test/test_randomwriter/out

#Console输出摘录:                                                                                                                                                  Running 10 maps.Job started: Wed Nov 0623:42:17 PST 201313/11/0623:42:17 INFO client.RMProxy: Connecting toResourceManager at /0.0.0.0:803213/11/0623:42:19 INFO mapreduce.JobSubmitter: number ofsplits:1013/11/0623:42:20 INFO mapreduce.JobSubmitter: Submittingtokens for job: job_1383806445149_000213/11/0623:42:21 INFO impl.YarnClientImpl: Submittedapplication application_1383806445149_0002 to ResourceManager at /0.0.0.0:803213/11/0623:42:21 INFO mapreduce.Job: The url to trackthe job: http://Master:8088/proxy/application_1383806445149_0002/13/11/0623:42:21 INFO mapreduce.Job: Running job:job_1383806445149_000213/11/0623:42:40 INFO mapreduce.Job: Jobjob_1383806445149_0002 running in uber mode : false13/11/0623:42:40 INFO mapreduce.Job:  map 0% reduce 0%                 13/11/0623:55:02 INFO mapreduce.Job:  map 10% reduce 0%                   13/11/0623:55:14 INFO mapreduce.Job:  map 20% reduce 0%                 13/11/0623:55:42 INFO mapreduce.Job:  map 30% reduce 0%                   13/11/0700:06:55 INFO mapreduce.Job:  map 40% reduce 0%                   13/11/0700:07:10 INFO mapreduce.Job:  map 50% reduce 0%                  13/11/0700:07:36 INFO mapreduce.Job:  map 60% reduce 0%                   13/11/0700:13:47 INFO mapreduce.Job:  map 70% reduce 0%                    13/11/0700:13:54 INFO mapreduce.Job:  map 80% reduce 0%                    13/11/0700:13:58 INFO mapreduce.Job:  map 90% reduce 0%                   13/11/0700:16:29 INFO mapreduce.Job:  map 100% reduce 0%                   13/11/0700:16:37 INFO mapreduce.Job: Jobjob_1383806445149_0002 completed successfully        File OutputFormat Counters                  BytesWritten=10772852496Job ended: Thu Nov 0700:16:40 PST 2013The job took 2062 seconds.


  说明:电脑存储空间足够的话,可以从hdfs里down下来看看。

  现只能看一看输出文件存放的具体形式:


./bin/hadoopfs -ls /user/grid/test/test_randomwriter/out/Found 11items-rw-r--r--   2 grid supergroup          02013-11-0700:16/user/grid/test/test_randomwriter/out/_SUCCESS-rw-r--r--   2 grid supergroup 10772782142013-11-0623:54 /user/grid/test/test_randomwriter/out/part-m-00000                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772827512013-11-0623:55 /user/grid/test/test_randomwriter/out/part-m-00001                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772802982013-11-0623:55 /user/grid/test/test_randomwriter/out/part-m-00002                                                                                                                                                  -rw-r--r--   2 grid supergroup 10773031522013-11-0700:07 /user/grid/test/test_randomwriter/out/part-m-00003                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772842402013-11-0700:06 /user/grid/test/test_randomwriter/out/part-m-00004                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772866042013-11-0700:07 /user/grid/test/test_randomwriter/out/part-m-00005                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772843362013-11-0700:13 /user/grid/test/test_randomwriter/out/part-m-00006                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772848292013-11-0700:13 /user/grid/test/test_randomwriter/out/part-m-00007                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772897062013-11-0700:13 /user/grid/test/test_randomwriter/out/part-m-00008                                                                                                                                                  -rw-r--r--   2 grid supergroup 10772783662013-11-0700:16 /user/grid/test/test_randomwriter/out/part-m-00009

 

  Test Case3 word_count

  (1)Locaol上创建文件:

$mkdirinput%echo ‘hello,world’ >> input/file1.in$echo ‘hello, ruby’ >> input/file2.in

 

  (2)上传到hdfs上:

./bin/hadoop fs -mkdir -p /user/grid/test/test_wordcount/./bin/hadoop fs –put input/user/grid/test/test_wordcount/in

 

(3)yarn新计算框架运行mapreduce


#command line$bin/yarn jar$YARN_HOME/share/hadoop//mapreduce/hadoop-mapreduce-examples-2.2.0.jarwordcount  /user/grid/test/test_wordcount/in/user/grid/test/test_wordcount/out                                                                                                                                             #ConSole输出摘录:3/11/0700:35:03 INFO client.RMProxy:Connecting to ResourceManager at /0.0.0.0:803213/11/0700:35:05 INFO input.FileInputFormat:Total input paths to process : 213/11/0700:35:05 INFO mapreduce.JobSubmitter:number of splits:213/11/0700:35:06 INFO mapreduce.JobSubmitter:Submitting tokens for job: job_1383806445149_000313/11/0700:35:08 INFO impl.YarnClientImpl:Submitted application application_1383806445149_0003 to ResourceManager at /0.0.0.0:803213/11/0700:35:08 INFO mapreduce.Job: The urlto track the job: http://Master:8088/proxy/application_1383806445149_0003/13/11/0700:35:08 INFO mapreduce.Job: Runningjob: job_1383806445149_000313/11/0700:35:25 INFO mapreduce.Job: Jobjob_1383806445149_0003 running in uber mode : false13/11/0700:35:25 INFO mapreduce.Job:  map 0% reduce 0%                                                                                                                                             13/11/0700:37:50 INFO mapreduce.Job:  map 33% reduce 0%                                                                                                                                             13/11/0700:37:54 INFO mapreduce.Job:  map 67% reduce 0%                                                                                                                                             13/11/0700:37:55 INFO mapreduce.Job:  map 83% reduce 0%                                                                                                                                             13/11/0700:37:58 INFO mapreduce.Job:  map 100% reduce 0%                                                                                                                                             13/11/0700:38:51 INFO mapreduce.Job:  map 100% reduce 100%                                                                                                                                             13/11/0700:38:54 INFO mapreduce.Job: Jobjob_1383806445149_0003 completed successfully13/11/0700:38:56 INFO mapreduce.Job:Counters: 43

 

说明:查看word count的计算结果:

$bin/hadoopfs -cat/user/grid/test//test_wordcount/out/*hadoop 1hello  1ruby


补充:因为新的YARN为了保持与MRv1框 架的旧版本兼容性,很多老的API还是可以用,但是会有INFO。此处通过修改$YARN_HOME/etc/hadoop /log4j.properties可以turn offconfiguration deprecation warnings.

建议去掉第138行的注释(可选),确保错误级别为WARN(默认为INFO级别,详见第20行:hadoop.root.logger=INFO,console):

1
138 log4j.logger.org.apache.hadoop.conf.Configuration.deprecation=WARN



附文:


集群搭建、配置步骤(基于CentOS_64bit)


0. 说明


大体规划如下:

虚拟机: VMware-workstation-full-8.0.3-703057(VMware10中文版不完整,此版本内含vmware tools,为设定共享文件夹所必须)

电脑1,VMWare,内装2个虚拟系统,(cluster1, cluster2)

电脑2,,VMware内装2个虚拟系统,(cluster3, cluster4)

虚拟主机: CentOS x86 64bit

局域网IP设置:   

cluster1    172.16.102. 201cluster2    172.16.102. 202cluster3    172.16.102. 203cluster4    172.16.102. 204


网关

1
172.16.102.254

1. Linux集群安装

(1) 准备

Vmware: VMware-workstation-full-8.0.3-703057(此安装包自带VMWare Tools)

Linux:CentOS.iso

(2) VMWare配置

VMWare以及所有安装的虚拟机均为桥接

Step1. 配置VMWare 联网方式: Editor->Virtual Network Editor->选择Bridged, 点击确定

Step2. 安装虚拟机

Step3.配置各虚拟机接网方式:右键已安装虚拟机->点击NetworkAdapter, 选择桥接,确定

Step4. 为所有安装好的虚拟系统设置一个共享目录(类似FTP,但是设置共享目录更方便) :右键已安装虚拟机->点击Virtual Machine Settings对话框上部Options, 选择Shared Folder, 在本地新建SharedFolder并添加进来,确定。

(3) linux下网卡以及IP配置

以下配置在三个虚拟系统里均相同, 以cluster1为例:

配置前需切换为root

Step1. 修改主机名, 设置为开启网络

配置/etc/sysconfig/network:

[root@localhost ~]# cat /etc/sysconfig/networkNETWORKING=yesHOSTNAME=cluster1


Step2.修改当前机器的IP, 默认网关, IP分配方式, 设置网络接口为系统启动时有效:

a.查看配置前的ip:

[root@localhost ~]# ifconfigeth0      Link encap:Ethernet  HWaddr 00:0C:29:E1:FB:95 inet addr:172.16.102.3  Bcast:172.16.102.255  Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fee1:fb95/64Scope:Lin


b.配置/etc/sysconfig/network-scripts/ifcfg-eth0

注意以下几项:

BOOTPROTO="static" (IP分配方式, 设为static则主机ip即为IPADDR里所设,若为”dhcp”, 此时只有局域网有效,则vmware会启动自带虚拟”dhcp”, 动态分配ip, 此时可以连接互联网 )

复制代码
IPV6INIT="no"  #你懂得IPADDR="172.16.102.201" #ip地址GETEWAY="172.16.102.254" #默认网关地址ONBOOT="yes" #系统启动时网络接口有效[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0"BOOTPROTO="static"HWADDR="00:0C:29:E1:FB:95"BOOTPROTO="dhcp"IPV6INIT="no"IPADDR="172.16.102.201"GETEWAY="172.16.102.254"ONBOOT="yes"NM_CONTROLLED="yes"TYPE="Ethernet"UUID="79612b26-326b-472c-94af-9ab151fc2831

 

c.使当前设置生效:

$service network restart$ifdown eth0 #关闭默认网卡$ifup eth#重新启用默认网卡$service network restart; ifdown eth0; ifup eth0

 

d.查看新设置的ip:

$ifconfigeth0      Link encap:Ethernet  HWaddr 00:0C:29:E1:FB:95  inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fee1:fb95/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 

Step3. 修改hosts文件,此文件会被DNS解析,类似linux里的alias, 设置后以后,hostname就是ip地址, 两者可以互换。

配置/etc/hosts, 添加三行如下, (注意,此3行在3个虚拟主机里都相同,切必须全部都要加上)


[root@localhost ~]# cat /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6cluster1    172.16.102. 201cluster2    172.16.102. 202cluster3    172.16.102. 203cluster4    172.16.102. 204

 

Step4. 按照以上3个步骤分别设置两外两个虚拟主机,

配置完以后必须按照之前的三个命令分别重启 network, ifeth0:

$service network restart$ifdown eth0$ifup eth0

 

重新初始化以后查看各自主机的ip配置是否正确。

在任意一台主机上执行: ping cluster1; ping cluster2; ping cluster3; ping cluster4

若配置正确,一定可以ping通,否则,请检查各个主机的/etc/hosts文件是否已经添加新的映射!至此,linux集群已成功配置。

2. 设置 ssh免登陆

a. 新建一个用户

在三台主机上分别以root权限新建一个用户,此处默认为grid:

cluster1,cluster2, cluster3, cluster4上:

$useradd –m grid$passwd grid 1qaz!QAZ

 

注意一定要保证4台主机上有相同的用户名, 以实现同一个用户在4台主机上登录。

b. 在cluster1上生成RSA密钥

切换回user: grid

$su grid$cd ~

生成密钥对:

$ssh-keygen –t rsa#一路回车到最后( 此处生成无需密码的秘钥-公钥对)。#上一个步骤 ssh-keygen –t rsa会在grid的home目录下生成一个.ssh文件夹


之后:

$cd ~/.ssh/$cp id_rsa.pub authorized_keys

 

c. 在另外3个主机上的grid用户home目录下也声称相应的密钥对, 并在.ssh目录下生成一个authorized_keys文件

d. 想办法将4台主机grid用户下刚生成的authorized_keys里的内容整合成一个完整的authorized_keys.

比如将4个authorized_keys里的内容全部复制到cluster1上的authorized_keys里, 然后:

$chmod 600 authorized_keys$scp .ssh/authorized_keys  cluster2:/home/grid/.ssh/$scp .ssh/authorized_keys  cluster3:/home/grid/.ssh/$scp .ssh/authorized_keys  cluster4:/home/grid/.ssh/

若要求输入密码,则输入之前新建用户grid时设置的密码, 一路回车到最后.

e. 下面尝试ssh无秘钥登录:

在cluster1主机上:ssh cluster2, 依次尝试登陆cluster2, cluster3, cluster4

若均可可以免密码登录,则直接跳到下一步骤,否则,请看下面的解决方案:

可能出现的问题有3,

第一种可能,.ssh文件夹非自动生成,而是你手动新建的,若如此,会出现.ssh的安全上下文问题, 解决方案, 在三个主机上以grid用户,删除刚才生成的.ssh文件夹,重新进入home目录,务必用 # ssh-keygen –t rsa 生成秘钥, 此过程ssh程序会自动在home目录下成成一个.ssh文件夹

第二种可能, authorized_keys权限不一致。 在各自.ssh目录下: $ ls –al authorized_keys, 查看此文件的权限,一定为600(-rw-------), 即只对当前用户grid开放可读可写权限, 若不是,则修改authorized_keys文件权限 $chmod 600 authorized_keys

若经过以上两步还不行,则执行以下命令,重新启动ssh-agent, 且加入当前用户秘钥id_rsa

$ssh-add ~grid/.ssh/id_rsa

 

经过以上三步,一定可以实现grid从cluster1到其它3个节点的免秘钥登录。

因为hadoop2.2新架构的缘故,我们还应该设置为每一个节点到其它任意节点免登陆。

具体步骤:

  1.在将cluster2, cluster3, cluster4上各自的.ssh/id_rsa.pub 分别复制到cluster1的.ssh/下: scp id_rsa.pub cluster1:/home/grid/.ssh/tmp2, scp id_rsa.pub cluster1:/home/grid/.ssh/tmp3 ...

  2.将cluster1节点/home/grid/.ssh/下的tmp2, tmp3, tmp4分别appand到authorized_keys里, 并请将各自节点上的id_rsa.pub也append到各自节点的authorized_keys里,以实现本地登陆(类似: ssh localhost)

至此,ssh免秘钥登陆设置完成。

3. 安装jdk

Step1. 记得之前在安装cluster1时在VMWare里设置的共享目录吗?

在Windows下将Hadoop安装包,jdk安装包Copy到共享目录下,然后在linux下从/mnt/hgfs/Data-shared/下cp到/home/grid/下,直接执行jdk安装包,不需要解压。

注意:若在安装过程中提示”Extracting… install.sfx 5414: /lib/ld-linux.50.2 No such file or directory, 则执行以下命令:

a.我们之前为了测试自定义的ip是否有效,已将各台主机的ip分配方式设为了BOOTPROTO=”static”, 这种方式是无法连入外部网络的,所以此时为了安装缺省的包,切换到root, 修改/etc/sysconfig/network-script/ifcfg-eth0,将BOOTPROTO=”static” 修改为BOOTPROTO=”dhcp”,

b.重启网络服务和网卡: 在root权限下:

$service network restart; ifdown eth0; ifup eth0$yum install glibc.i686

d.切换回grid,重新安装jdk

$cd /usr/java/  #注意必须进入java文件夹,因为java安装包默认安装在当前目录下$./jdk-6u25-linux-i586.bin #安装jdk

安装完以后,记得将eth0文件修改回来:

$sed -i s/dhcp/static/g /etc/sysconfig/network-scripts/ifcfg-eth0 #此处用sed直接替换,若不放心也可以用编辑器修改#service network restart; ifdown eth0;ifup eth0

至此,jdk已在linux下安装完毕。

最后,将java安装好的路径append到$PATH变量里(处于个人习惯,新环境变量一律添加到所需用户的.bashrc文件里, 即只对当前用户有效)

$su grid$vim ~/.bashrc (修改.bashrc文件,添加如下两行:)$tail -2 ~/.bashrcexport JAVA_HOME="/usr/java/jdk1.6.0_25/"export PATH="${PATH}:${JAVA_HOME}/bin"

测试一下java是否可以正常启动:

$source ~/.bashrc$which java$/usr/java/jdk1.6.0_25/bin/java

至此,jdk安装完毕。

用同样的方式在另外3台虚拟主机上安装jdk, 提示:先复制到home下

$scp -r /mnt/hgfs/Data-shared/Archive/jdk-6u25-linux-i586.bin  cluster2:/home/grid/$scp -r /mnt/hgfs/Data-shared/Archive/jdk-6u25-linux-i586.bin  cluster3:/home/grid/$scp -r /mnt/hgfs/Data-shared/Archive/jdk-6u25-linux-i586.bin  cluster4:/home/grid/

再切root, copy到/usr/java下, cd /usr/java, 然后再安装.

(完)