一.参考书:《Hadoop权威指南--第二版(中文)》 下载见
二.hadoop环境安装
1.安装sun-jdk1.6版本
1)目前我只在一台服务器(CentOS5.5)上搭建hadoop环境,因此先卸载已安装的java1.4版本
卸载命令:yum -y remove java
3)安装java(进入jdk安装文件所在目录)
添加bin文件权限:chmod a+x *
安装,sudo ./jdk-6u33-linux-x64-rpm.bin
(若是在普通用户下安装,需要在/etc/sudoers文件下添加语句,表示当前用户可以拥有root权限,具体命令如下
a. su root
b. chmod u+w /etc/sudoers
c. vim /etc/sudoers
d.在root ALL=(ALL) ALL下面添加一行 “username(你要创建的sudoer用户名) ALL=(ALL) ALL”,保存退出
e. chmod u-w /etc/sudoers
)
4)设置JAVA_HOME
编辑用户目录下的.bashrc文件,设置JAVA_HOE命令:export JAVA_HOME=/usr
2.安装hadoop
1)从上下载相应版本的hadoop(本人下载的是1.0.3版本)
2)解压文件
命令:tar -xzf hadoop-1.0.3.tar.gz
3)测试hadoop是否安装成功(进入hadoop安装目录,依次执行以下命令)
a. mkdir input
b. cp conf/*.xml input
c. bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
d. cat output/* (显示“1 dfsadmin” 表示hadoop安装成功)
4)设置环境变量
export HADOOP_HOME=/home/username/hadoop/hadoop-1.0.3
export PATH=$PATH:$HADOOP_HOME/bin
export CLASSPATH=.:$HADOOP_HOME/hadoop-core-1.0.3.jar:$HADOOP_HOME/lib:$CLASSPATH
三.简单Map-Reduce示例
一开始按照书上20~23页(也可参考该页面)上的内容运行简单的MaxTemperature示例,一直没用过。在命令行环境下,输入
% export HADOOP_CLASSPATH=build/classes % hadoop MaxTemperature input/ncdc/sample.txt output就显示:ClassNotFound类似的错误,然后修改,又抛出IOException,后在网上找了好久,得到一个可行的方案。1.参考链接
2.主要步骤
mkdir MaxTemperature
javac -d MaxTemperature MaxTemperature.java
jar cvf MaxTemperature.jar -C MaxTemperature/ .
hadoop jar MaxTemperature.jar MaxTemperature sample.txt output
注意事项:
将map,reduce类的代码复制到MaxTemperature.java中,添加static属性,执行javac命令如遇到Iterator报错时,则添加相应包,如下
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
四.一点感想
今天第一次搭建hadoop环境,主要困难在于按照书上说明一步一步操作时,遇到了错误,这时不确定是书上的知识过时了还是我的操作失误,加之对java不太熟悉,由此浪费了好几个小时的时间。最后,找到了一个正确的方案,成功运行了Map-Reduce的简单示例(单机模式)。总体来说,走出了第一步,有点小成就感。希望能利用这个暑假深入研究hadoop。加油~
五.补充
参考书《Hadoop权威指南(中文第二版)》中第25页说明了,Hadoop从0.20.0版本开始在类型上不兼容先前的API,要重写以前的应用程序才能使新的API发挥作用。这就说明了用旧的API会报一些奇怪的类似ClassNotFound的错误了。
在这里补充下新增的API和旧的API之间的一些明显区别(摘自书中):
1.新的API倾向于使用抽象类,而不是接口,因为这更容易扩展。例如,你可以添加一个方法(用默认的实现)到一个抽象类而不需修改类之前的实现方法。在新的API中,Mapper和Reducer是抽象类。
2.新的API是在org.apache.hadoop.mapreduce包(和子包)中的。之前版本的API则是放在org.apache.hadoop.mapred中的。
3.新的API广泛使用context object(上下文对象),并允许用户代码与MapReduce系统进行通信。例如,MapContext基本上充当着JobConf的OutputCollector和Reporter的角色。
4.新的API同时支持"推"和"拉"式的迭代。在这两个新老API中,键/值记录对被推mapper中,但除此之外,新的API允许把记录从map()方法中拉出,这也适用于reducer。"拉"式的一个有用的例子是分批处理记录,而不是一个接一个。
5.新的API统一了配置。旧的API有一个特殊的JobConf对象用于作业配置,这是一个对于Hadoop通常的Configuration对象的扩展(用于配置守护进程,请参见5.1节)。在新的API中,这种区别没有了,所以作业配置通过Configuration来完成。
6.作业控制的执行由Job类来负责,而不是JobClient,它在新的API中已经荡然无存。