1.Hadoop的简介
wikipedia:hadoop
2.安装与配置
我用的操作系统为Ubuntu 11.10
安装Hadoop:
下载地址
需要注意的是,目前各个版本的信息如下
- 0.20.X – legacy stable version
- 0.20.203.X – current stable version
- 0.20.204.X – previous beta version
- 0.20.205.X – current beta version
- 0.22.X – does not include security
- 0.23.X – current alpha version
这里我下载了0.20.203.0,解压,放在了个人目录下,/home/huangchao/hadoop
配置hadoop,这里至少要指定conf/hadoop-env.sh中的JAVA_HOME,找到
# The java implementation to use. Required.
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
这句,将JAVA_HOME指到你自己的JDK安装目录。
如果你想任何路径下使用hadoop命令,则可以将hadoop的目录添加到PATH里面。
可以通过输入hadoop version判断。
关于hadoop的快速入门,Google下会得到这个网址http://hadoop.apache.org/common/docs/r0.19.2/cn/quickstart.html
但是这里面的配置已经稍微有点过时了,这是0.19.2的版本,你会发现找不到hadoop-site.xml这个文件。最好和自己所用的版本对应的文档去看,http://hadoop.apache.org/common/docs/r0.20.203.0/#Getting+Started
这里主要说一下伪分布式的操作方法,至于集群,我还还没有试过,以后再说。
首先要保证自己的机子安装了ssh,ubuntu 11.10默认安装了openssh-client,openssh-server却没有安装,apt-get下就ok了,然后确认自己的机子不用密码就可以登录,如果
$ssh localhost失败,可以用命令
$ ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
来产生公钥,具体关于ssh的介绍和操作,阮一峰老师刚好写了一篇介绍。
配置conf/目录下的3个文件:
conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
要理解这3个文件,需要对hadoop的结构有所了解,关于hadoop的结构完全可以写成另外一篇文章,这里主要介绍环境的配置,所以Hadoop的结构只是简单介绍下。
Hadoop主要依赖与2项技术:MapReduce和HDFS(Hadoop Distributed File System,有时候简称DFS),关于MapReduce的内容可以参照《Mapreduce:simplified data processing on large clusters》这篇论文,而HDFS可以参考《Hadoop权威指南》。
Hadoop中,和MapReduce相关的有JobTracker和TaskTracker;而和HDFS相关的有NameNode,SecondaryNameNode和DataNode.
这五个服务在启动Hadoop守护进程的时候可以看到。
“
Hadoop集群中有两种角色:master与slave,master又分为主master与次master。其中:
- 主 master同时提供NameNode 、SecondaryNameNode 及JobTracker 三种服务;
- 次master只提供SecondaryNameNode 服务;
- 所有slave可以提供DateNode 或TaskTracker 两种服务。
”
上面这段话摘自http://darxin.info/archive/2010/02/e046f531/
同时,基本所有的分布式文件系统都有相关的容错处理,所以相关的数据都会有备份,以防一个节点死掉,数据损坏的情况,默认的数据备份是3份。
上面3个文件的定义主要指定了3个参数的值。列表如下:
参数 | 值 | 说明 |
fs.default.name | hdfs://localhost:9000 | NameNode的主机和端口 |
mapred.job.tracker | localhost:9001 | JobTracker的主机和端口 |
dfs.replication | 1 | 数据复制的份数,因为默认是3份,设置为1就不会出现数据丢失的警告。 |
修改完配置文件,可以格式化一个新的文件系统,基于HDFS的。命令如下:
$ bin/hadoop namenode -format
然后可以启动hadoop的守护进程。
$bin/start-all.sh
输出如下:
starting namenode, logging to /home/huangchao/hadoop/bin/../logs/hadoop-huangchao-namenode-huangchao-Workstation.out
localhost: starting datanode, logging to /home/huangchao/hadoop/bin/../logs/hadoop-huangchao-datanode-huangchao-Workstation.out
localhost: starting secondarynamenode, logging to /home/huangchao/hadoop/bin/../logs/hadoop-huangchao-secondarynamenode-huangchao-Workstation.out
starting jobtracker, logging to /home/huangchao/hadoop/bin/../logs/hadoop-huangchao-jobtracker-huangchao-Workstation.out
localhost: starting tasktracker, logging to /home/huangchao/hadoop/bin/../logs/hadoop-huangchao-tasktracker-huangchao-Workstation.out
可以看到,刚才所说的5个主要服务已经启动。
可以浏览NameNode和JobTracker的网络接口,它们的地址默认为:
- NameNode – http://localhost:50070/
- JobTracker – http://localhost:50030/
如果这两个网页都能正常打开,说明配置什么的没啥问题,如果有问题,可以去Log里面去找。不过一般按照官方的指导来做,不会出现大问题。
下面你就可以利用hadoop来实现自己的任务。
这里用官方提供的wordcount的例子来说明。
wordcount的用法如下
bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
指定<in_dir>和<out_dir>
这里首先在本地创建一个文件夹input,里面有两个文件,file1和file2
file1里面的内容:Hello World Bye World
file2里面的内容:Hello Hadoop Bye Hadoop
然后将这个文件夹传入到HDFS
$ hadoop fs -put input hadoop_in
然后执行$hadoop fs -ls
可以看到:
Found 1 items
drwxr-xr-x – huangchao supergroup 0 2011-12-23 10:24 /user/huangchao/hadoop_in
执行wordcount的命令
$ hadoop jar hadoop-examples-0.20.203.0.jar wordcount hadoop_in hadoop_out
经过一番运算,再去看HDFS中的文件
$ hadoop fs -ls
Found 2 items
drwxr-xr-x – huangchao supergroup 0 2011-12-23 10:24 /user/huangchao/hadoop_in
drwxr-xr-x – huangchao supergroup 0 2011-12-23 10:30 /user/huangchao/hadoop_out
可以看一下运行结果:
$huangchao@huangchao-Workstation:~/hadoop$ hadoop fs -cat hadoop_out/*
Bye 2
Hadoop 2
Hello 2
World 2
可以看到计算结果已经统计出来了。
操作完成后可以停止守护进程。
$bin/stop-all.sh
Hadoop的伪分布式操作的流程基本就是这样,可见几乎所有的操作都用hadoop自己实现的命令集来完成,为了编程的方便,可以将hadoop与Eclipse整合。
安装Eclipse,直接去官网下载,解压即得到绿色的Eclipse。这里下载的是eclipse-jee-indigo-SR1-linux-gtk.tar.gz
在$HADOOP_HOME/contrib/eclipse-plugin/文件夹中有个hadoop-eclipse-plugin-0.20.203.0.jar,需要注意的是这个插件直接添加到Eclipse的目录会出现诸如”An internal error occurred during: “Connecting to DFS local”. org/apache/commons/configuration/Configuration”. 之类的错误。从日志中看是缺少了hadoop/lib中的一些库文件。这个问题比较困惑,因为师兄的0.20.2版本就没有这个问题。到网上搜了下,有解决方案:
“安装插件,配置好连接之后 ,点击大象图标,eclipse连不上DFS。通过Error-log分析出错原因是缺少jar包。解决方法是将commons-httpclient-3.0.1.jar,jackson-core-asl-1.0.1.jar,jackson-mapper-asl-1.0.1.jar,commons-configuration-1.6.jar,commons-lang-2.4.jar放入hadoop-0.20.203.0-eclipse-plugin的lib下
修改hadoop-0.20.203.0-eclipse-plugin/META-INF/MANIFEST.MF
Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-httpclient-3.0.1.jar,lib/jackson-core-asl-1.0.1.jar,lib/jackson-mapper-asl-1.0.1.jar,lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar
”
将修改后的这个文件加入Eclipse的插件目录,启动Eclipse,然后在Window->Preferences->Hadoop Map/Reduce中添加Hadoop的安装目录。
在Window–>Show View中打开Map/Reduce Locations。
然后右键–>New Hadoop Location。在弹出的对话框中,Location name是你自己取的名字,我这里用了local,Map/Reduce Master这里的host和port对应上面mapred-site.xml中mapred.job.tracker的值,我配置的是localhost和9001;DFS Master对应上面core-site.xml中fs.default.name中的值,我配置的是localhost和9000.
完成后,如果屏幕左上方的DFS Locations中的内容可以正常显示,说明配置一切成功,否则去log中看看那里出错了。
然后就可以使用Eclipse编写Hadoop的程序了。
File->New->Project->Map/Reduce Project,剩下的和普通的Java程序没什么区别了。
我这里复制了hadoop examples中的wordcount,然后执行的结果和没有用Eclipse的结果是一样的。