基于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编译
说明:标准的
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
$yum
install
gcc
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个依赖包
Cmake
ncurses-devel
openssl-devel
执行以下步骤:
suroot$yum installncurses-devel$yum installopenssl-devel$yum installcmake89
以上安装完成后,切回用户grid:
$
su
grid
$
cd
~
/hadoop-2
.2.0-src
1.9 所有依赖已安装完毕,开始编译
$mvn package-Pdist,native -DskipTests -Dtar
漫长的等待后,编译成功,查看结果:
一切正常。至此,hadoop2.2.0编译完成。
1.10 验证
下面验证编译结果是否符合预期, 注意我们当前是在目录~/hadoop-2.2.0-src下,
$
cd
hadoop-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:
$
cd
hadoop-2.2.023
$
ls
bin etc include lib libexec sbin share
这才是和官方release2.2.0版本(官方只有32bit版本)的相同的目录结构。
1.10.1 下面主要验证两项:
a.验证版本号
$bin
/hadoop
version
Hadoop 2.2.0
Subversion Unknown -r Unknown
Compiled by grid on 2013-11-06T13:51Z
Compiled with protoc 2.5.0
From
source
with checksum 79e53ce7994d1628b240f09af91e1af4
This
command
was 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.
我们看下该启动脚本的说明:
$sbin
/hadoop-daemons
.sh
Usage:hadoop-daemons.sh [--config confdir] [--hosts hostlistfile] [start|stop]
command
args...
可以看到--hosts可以指定需要启动的存放节点名的文件名:
但这是无效的,此脚本调用的$YARN_HOME/libexec/hadoop-config.sh脚本有bug.
先建一个文件datanodefile 添加datanode节点,放入conf/文件夹下,然后执行一下启动脚本:
$sbin
/hadoop-daemons
.sh --hosts datanodefile start datanode
at:
/home/grid/yarn/hadoop-2
.2.0
/etc/hadoop//126571
:No such
file
or directory
分析脚本,定位到嵌套脚本$YARN_HOME/libexec/hadoop-config.sh第96行:
96
export
HADOOP_SLAVES=
"${HADOOP_CONF_DIR}/$$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
$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.address
和yarn.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):
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
网关
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, 然后再安装.
(完)
- 基于Hadoop 2.2.0的高可用性集群搭建步骤(64位)
- 高可用性hadoop集群的搭建
- 高可用性hadoop集群的搭建
- 搭建hadoop的高可用性(HA)集群
- 高可用性hadoop集群问题
- 基于LINUX的高可用性集群技术分析
- 基于LINUX的高可用性集群技术分析
- Hadoop集群搭建步骤
- Hadoop集群搭建详细步骤(2.6.0)
- Hadoop高可用集群搭建(HA)
- 基于Hadoop HA的Hbase集群搭建(权威)
- 基于树莓派的Hadoop集群搭建
- 基于docker的hadoop HA 集群搭建
- 基于HA机制的Hadoop集群搭建
- 基于Docker的Hadoop集群快速搭建
- 搭建基于heartbeat的高可用集群
- 基于Linux的高可用性、高性能集群系统 ★完全攻略★
- 如何实现Linux服务集群的高可用性(heartbeat)
- NSTimer
- android UI设计的一些心得与问题解决
- SQL Server 将表中数据,转化成SQL Insert语句
- [Android源码分析]蓝牙打开分析--苦尽甘来之再次回到jni之上
- The coproc keyword
- 基于Hadoop 2.2.0的高可用性集群搭建步骤(64位)
- 使用paint画图应加上super.paint(g)
- 让SQL server中有两个相同的数据库,这里只是内容是一样的,但文件名不一样
- XIP
- LINUX中断机制与信号(http://linux.chinaitlab.com/soft/878170.html)
- 大数据时代下的我们
- [龟秀]WC CB CH爬宠个体 名字解释
- freemarker教程
- php和c++socket通讯(基于字节流,二进制)