VMware中使⽤CentOS安装并测试Hadoop
预备软件:
使⽤的是CentOS 6.0、hadoop-1.0.4
Jdk使⽤的是jdk-6u29-linux-i586-rpm.bin
⽂档帮助:
Hadoop-1.0.4 ⽂档
单机安装指南
集安装指南
摘要
本⽂将介绍在CentOS中如何安装Hadoop,安装之前需要哪些预备环境。安装过程中需要配置哪些⽂件。Hadoop⽀持三种模式,分别为
Local (Standalone) Mode
Pseudo-Distributed Mode
Fully-Distributed Mode
⽂中将使⽤hadoop⾃带的wordcount⽰例在Local (Standalone)模式和Pseudo-Distributed模式下进⾏测试。
安装及测试过程
1、安装jdk
[root@localhost ~]# cd /usr
[root@localhost usr]# mkdir java
[root@localhost usr]# cd java
[root@localhost java]# pwd
/usr/java
[root@localhost java]# /mnt/hgfs/share/jdk-6u29-linux-i586-rpm.bin
2、解压Hadoop
[root@localhost java]# tar -zxvf hadoop-1.0.
3、设置hadoop的JAVA_HOME环境变量
在usr/java/hadoop-xxx/conf/⽬录下到hadoop-env.sh⽂件,打开后,编辑
[root@localhost java]# cd /usr/java/hadoop-1.0.4/conf/
如果该⽂件属于只读性质,那么需要更改⽂件的读写权限:
[root@localhost ~]# ll /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
-rw-r--r--. 1 1002 1002 2430 Dec  3  2011 /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
[root@localhost ~]# chmod 777 /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
[root@localhost ~]# ll /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
-rwxrwxrwx. 1 1002 1002 2430 Dec  3  2011 /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
更改好权限以后将⽂件打开,并添加JAVA_HOME路径为/usr/java/jdk-xxx
[root@localhost ~]# gedit /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
在⽂件中添加如下环境变量
export JAVA_HOME="/usr/java/jdk1.6.0_29"
保存,退出gedit。
现在改好hadoop-env.sh配置⽂件后,需要把它之前的权限给恢复。
  可以看到⽂件权限有10位,第⼀位指得是⽂件的类型,“-”标⽰的是普通⽂件,“d”指的是⽬录⽂件。剩下的9位分别代表三种⾓⾊,即“⽂件主组⽤户其他⽤户”对此⽂件的权限,r指读,w指写,x指执⾏。
  原始的⽂件权限为“-rw-r--r--”,即它只对⽂件主才开放读写功能,对其他⽤户均是只读。⽽改变后的⽂件权限为“-rwxrwxrwx”,即它对所有⽤户⾓⾊都开放了读写及执⾏功能。
  为了安全,在设置完JAVA_HOME环境变量后,应该恢复⽂件的权限。
  可以使⽤chmod指令(change mode的缩写)+数字的⽅式来改变⽂件的权限。各个数字代表的含义是:
0表⽰没有权限,1表⽰可执⾏权限,2表⽰可写权限,4表⽰可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的⼋进制数,其顺序是(u)(g)(o)。u、g、o分别代表⽂件主组⽤户其他⽤户。所以,我们⽤指令644就可以将⽂件恢复到之前的权限了。
命令为:
[root@localhost ~]# chmod 644 /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
使⽤ll指令查看⽂件当前的权限:
[root@localhost ~]# ll /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
-rw-r--r--. 1 1002 1002 2470 Jan  4 18:33 /usr/java/hadoop-1.0.4/conf/hadoop-env.sh
可以看到⽂件的访问权限已经恢复到之前的状态了。
4、Hadoop单机模式(Local (Standalone) Mode)
在hadoop解压⽂件下,有⼀个“hadoop-mapred-examples-0.22.0.jar”包,使⽤以下指令可以查看该jar的内容。
[root@localhost hadoop-1.0.4]# jar tf hadoop-examples-1.0.4.jar
执⾏结果截取⼀部分显⽰:
可以看到⾥⾯有⼀个
org/apache/hadoop/examples/WordCount.class
  这与刘鹏在《云计算》⼀书中⽤的例⼦相同,我们就⽤这个做实验好了。借⽤刘鹏在书中的例⼦,输⼊以下指令,新建⼀个input⽂件夹,在⽂件夹中新建两个⽂件,分别输⼊“hello word”和“hello hadoop”,然后使⽤⽰例的wordcount程序统计各个单词出现的概率。指令如下:
[root@localhost hadoop-1.0.4]# mkdir input
[root@localhost hadoop-1.0.4]# cd input
[root@localhost input]# echo "hello world"&
[root@localhost input]# echo "hello hadoop"&
[root@localhost input]# cd ..
[root@localhost hadoop-1.0.4]# bin/hadoop jar hadoop-examples-1.0.4.jar wordcount input output
运⾏结束后,可以看到hadoop⽂件夹下多了⼀个output⽂件夹,打开⽂件夹可见两个⽂件
打开其中的part-r-00000⽂件,可见单词的统计结果
或者使⽤cat指令直接查看output⽂件夹下的输出也可以:
[root@localhost hadoop-1.0.4]# cat output/*
hadoop   1
hello    2
world   1
关于workcount这个⽰例的更详细介绍可以查看这篇⽂章 -》地址
5、Hadoop的配置⽂件
打开hadoop⽬录下的conf⽬录可以看到有16个⽂件:
hadoop-env.sh
  右上⾓的hadoop-env.sh之前我们已经⽤到过了,在⾥⾯配置了JAVA_HOME环境变量。并且由env这个缩写也可以⼤概猜到是environment,所以这个⽂件主要是做环境变
量的配置的。
  hadoop core的配置项,该⽂件主要⽤来配置全局性的参数具体的配置模版可参考【】。hadoop core提供了⼀套分布式⽂件系统以及⽀持Map-Reduce的计算框
架。HBase、Pig等都是在hadoop core之上搭建的。
  hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等。⾥⾯设置了诸如namenode的地址、datanode的地址等参数。配置模版可参考【】
  mapreduce守护进程的配置项,包括jobtracker和tasktracker。具体参数及释义可参看【】。
log4j.properties
  ⽤来记录系统⽇志。log4j是apache旗下的⼀个⽇志记录项⽬。【】
  右上⾓第⼆个⽂件l,⽤⽕狐打开来看看,如下图所⽰:
  进⼊【】可以看到对这⼀配置⽂件的介绍。由Introduction中
的“Fair scheduling is a method of assigning resources to jobs such that all jobs get, on average, an equal share of resources over time.Fair scheduling is a method of assigning resources to jobs such tha 知该⽂件⽤来实现⼀种资源配置,以保证所有的jobs都可以公平的获得资源。
  在这些配置⽂件中,最基本的就是hadoop-env.sh、l、l和  l。其中,第⼀个是⽤来设定hadoop运⾏所需的环境变量。
  众所周知,hadoop由最基本的HDFS+MapReduce构成。HDFS由NameNode和DataNode组成。MapReduce计算模型⼜由job和track来完成。l、hdfs-
  其他配置⽂件的⼤致功能可以参见ggjucheng的⽇志【】。
6、Hadoop伪分布模式(Pseudo-Distributed Mode)
  伪分布模式在官⽹中的描述是“Hadoop can also be run on a single-node in a pseudo-distributed mode where each Hadoop daemon runs in a separate Java process.”⼤意
为使⽤java进程来模拟Hadoop的各个守护进程。
6.1设置参数
  进⾏伪分布模式的测试前,要对刚才提到的l、l和l三个⽂件进⾏配置(建议在vi中进⾏),分别为:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
<configuration>
<property>
<name&plication</name>
<value>1</value>
</property>
</configuration>
hadoop分布式集搭建
<configuration>
<property>
<name>acker</name>
<value>localhost:9001</value>
</property>
</configuration>
6.2 设置⽆密码登录SSH
  Hadoop的分布式计算需要各个计算节点(server)的协作,⼈⼯输⼊密码这⼀⽅式显然是⾏不通的,因此节点与节点间进⾏通信时,需要⽤到SSH⾃动登录机制。那么,先
尝试使⽤指令ssh localhost, 看能否进⾏⽆密码的SSH连接。
[root@localhost ~]# ssh localhost
root@localhost's password:
提⽰输⼊密码,失败。转⼊以下步骤,输⼊指令来产⽣⼀对密钥:
[root@localhost ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
提⽰:
  这个操作主要就是产⽣⼀对密钥,相当于client和server之间产⽣某种暗号,只要暗号对上了就当做它有权限接⼊,⽽不⽤再⼿⼯输⼊密码了。ssh-keygen的⽤法可以参考⽯
头⼉转载的这篇⽇志【】
  现在/root/.ssh/⽬录下有⼀个私钥id_dsa和⼀个公钥id_dsa.pub⽂件。将公钥导⼊到本机的授权密钥⽂件中authorized_keys 。
作者注:如果是真正的分布式集,还需要将该公钥传送到其他服务器节点,并导⼊到它们的authorized_keys⽂件中,因为现在是伪分布式,也就是只有⼀个节点,因此只要导
⼊到本机即可。真正的分布式SSH的⽆密码登录可以参见-free_coder-的⽇志【】
进⼊.ssh⽬录
[root@localhost ~]# cd /root/.ssh
导⼊公钥
[root@localhost .ssh]# cat id_dsa.pub >> authorized_keys
6.3 运⾏Hadoop
  在正式运⾏之前,要先对NameNode节点进⾏格式化,为什么要进⾏格式化参见—读程序的⼿艺⼈—的⽇志【】。
  具体的指令是:
[root@localhost hadoop-1.0.4]# bin/hadoop namenode -format
NameNode格式化完成后,就可以运⾏hadoop了。指令为:
[root@localhost hadoop-1.0.4]# bin/start-all.sh
输出如下:
starting namenode, logging to /usr/hadoop-1.0.4/libexec/../logs/hadoop-root-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /usr/hadoop-1.0.4/libexec/../logs/hadoop-root-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /usr/hadoop-1.0.4/libexec/../logs/hadoop-root-secondarynamenode-localhost.localdomain.out
starting jobtracker, logging to /usr/hadoop-1.0.4/libexec/../logs/hadoop-root-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /usr/hadoop-1.0.4/libexec/../logs/hadoop-root-tasktracker-localhost.localdomain.out
在浏览器中输⼊地址localhost:50030/可观察jobtracker的情况。如下图:
在浏览器中输⼊地址localhost:50070可以查看当前hadoop的⽂件系统的的状态
还可以使⽤web接⼝查看file system
或者查看⽂件系统⽇志
地址可以查看task的运⾏情况。
6.4 实例测试
6.4.1 数据准备
 之前我们在单机模式中使⽤过workcount这个功能,现在在伪分布情况下再进⾏测试。
 先将之前input⽂件夹拷贝到HDFS⽬录中做准备,重命名为inputTest。
[root@localhost hadoop-1.0.4]# bin/hadoop dfs -copyFromLocal input inputTest
 我们再到刚才的localhost:50070地址中查看是否出现了⼀个新的⽬录。
果然,在user/root⽬录下多了⼀个inputTest⽬录。点击去可以看到之前我们测试时新建的两个⽂件:和。
回忆⼀下,中的字符串是"hello world";中的字符串是"hello hadoop"。所以,每个⽂件本⾝的⼤⼩是很⼩的。
但是,看看它们的block size,都是64MB。将block定义得很⼤的原因Tom White在《Hadoop: The Definitive Guide》page 43中有阐述:
“HDFS blocks are large compared to disk blocks, and the reason is to minimize the cost of seeks. By making a block large enough, the time to transfer the data from the disk can be made to be significan 简单来说,就是希望传输⼀个block数据的时间能⼤于到这个block的时间,让更多的时间花在数据传输上⽽不是数据定位上。
6.4.2 运⾏测试程序
运⾏程序的指令跟之前是⼀样的,只要替换掉输⼊/输出的⽬录即可。
[root@localhost hadoop-1.0.4]# bin/hadoop jar hadoop-examples-1.0.4.jar wordcount inputTest outputTest
运⾏过程中查看tasktrace可以看到job和task的状态:
运⾏结束后,可以看到⽂件系统中多了⼀个⽬录outputTest
使⽤指令查看运⾏结果:
[root@localhost hadoop-1.0.4]# bin/hadoop dfs -cat outputTest/*
hadoop 1
hello    2
word 1
6.5 停⽌Hadoop
指令为
alhost hadoop-1.0.4]# bin/stop-all.sh
输出信息显⽰:
stopping jobtracker
localhost: stopping tasktracker
stopping namenode
localhost: stopping datanode
localhost: stopping secondarynamenode
可以看出,在hadoop运⾏过程中,有5个守护进程。
(daemon翻译成“后台程序”或“后台进程”会不会好点呢?)
Reference
1、Tom White,《Hadoop: The Definitive Guide》
2、刘鹏,《云计算(第2版)》
3、Apache Hadoop,《》
扩展阅读
1、中国科学院计算技术研究所⽹络科学与技术重点实验室,《
介绍了Hadoop程序员需要完成的⼯作,hadoop程序在三种不同模式下的运⾏⽅式,以及hadoop的效率。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。