由于项目的需要,需要对一个分布式文件系统进行深入的学习,在MooseFS(MFS)和Hadoop的HDFS进行了大概一周的文档阅读、比较和资料的查阅,还是决定了用Apache的Hadoop开源项目进行开发,功能更强大,面向对象语言的开发(Java)而且比较大的开源组织的支持,文档也比较齐全,虽然都是基于Google File System(GFS)的实现,但是HDFS还是保留了更多的GFS的特性。支持超大文件的存储,高容错性(比MFS)且提供高吞吐量的数据访问,对于项目的需求来说,已经足以。
经过1天的资料阅读、软件安装与配置,终于搞定了Linux Ubuntu下 Hadoop 1.0.3版本的单节点配置,而且配置工作量不是很大。网上的配置版本很多,而且没有针对1.X的配置说明(可能跟之前0.2.X的类似吧),参考资料有:《Hadoop 权威指南》、《Hadoop 开发者》第一期、Michael G. Noll的一篇文章和《Hadoop实践》。学习Hadoop的网站、网址可以参考:
- (Hadoop官方网站)
- (Hadoop中文论坛)
- (Hadoop中文文档)
- (Hadoop Java API)
- (Hadoop版本下载)
- (Michael G. Noll的文章)
- (《Hadoop权威指南(原版)》)
- (Hadoop Wiki)
- (Hadoop Presentations)
- (Getting Started With Hadoop)
这里把自己的配置过程和配置文件分享下。
1. 安装Oracle VM VirtualBox虚拟机(虚拟机随意,物理机最好,虚拟机作为单节点跑起Hadoop还是比较慢的)并安装Ubuntu 11.10(Ubuntu版本也随意,不过建议版本不要太旧)。可以到我的网盘下载。 (Ubuntu 镜像文件)和 (VirtualBox)
2.安装Java JDK
我是用的是稳定的1.6版本,1.6.32。下载地址 。下载jdk-6u32-linux-i586.bin版本。Linux下安装bin文件命令:
(1)移动到自己安装JDK的路径,我的路径是:/usr/lib/jvm/jdk6下,没有的文件夹自己创建;
(2)chmod +x jdk-6u32-linux-i586.bin
(3)./jdk-6u32-linux-i586.bin
安装完成然后配置环境变量。 使用vim或者gedit来编辑/etc/profile文件。在文件末尾添加:
export JAVA_HOME=/usr/lib/jvm/jdk6/jdk1.6.0_32
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
至此JDK安装完成。终端使用java -version查看版本是否匹配。注意Ubuntu自带的openjdk是不能正常运行Hadoop的(自己没有尝试,很多文档这么说),所以还是建议安装下JDK
3. 安装SSH
终端下使用下面的命令:
ssh-keygen -t rsa -P "" (生成SSH key)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys (公布公钥。如果~下没有.ssh文件夹,首先手动先创建一个.ssh文件夹)
ssh localhost (测试是否成功)
(我的过程没问题,有的可能会遇到 connection refused错误。 查百度解决)
4. 禁用IPv6 (原因是Ubuntu上的IPv6可能会与0.0.0.0冲突,而0.0.0.0在Hadoop中又被广泛使用)
编辑/etc/sysctl.conf文件,在文件末尾添加:
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
完成并保存,测试是否禁用成功。 终端使用 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 命令,如果是0则没有禁用,1则表示禁用成功
(这个是在别人那里看到的,不配置没试过,可能对于基本的运行,不用这样禁用ipv6)
5. 安装Eclipse
下载并解压即可。下载地址
(对于正常运行Hadoop,Eclipse是不需要的。这个是用来看代码的)
6. 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml和mapred-site.xml)
我使用的是 hadoop1.0.3版本,在之前提到的hadoop下载地址下载。解压hadoop压缩文件即可,我是解压到~/eric/下。下面便是配置这四个配置文件。切记你在Ubuntu下的用户有对需要使用的文件夹有读写权限,这是很重要的。最好不要在命令行中使用sudo,最好chmod来改变文件夹的权限。
(1)hadoop-env.sh
- #export JAVA_HOME= ...
替换成自己的JAVA_HOME路径,切记要去掉“#”,我的路径是 export JAVA_HOME=/usr/lib/jvm/jdk6/jdk1.6.0_32
- export HADOOP_PID_DIR=/home/eric/hadoop-pid
这个是为可能会遇到的守护进程启动不了问题所修改的,路径可以自己人为指定,而且在/etc/profile文件末尾添加 export HADOOP_PID_DIR=/home/eric/hadoop-pid。这个是我在解决no namenode to stop 和 no datanode to stop时解决问题所遇到的另一个问题,指定了这个路径,问题便解决了。
(2)core-site.xml
- 首先拷贝src/core文件夹下的core-default.xml文件到conf目录下,然后重命名成core-site.xml(默认在conf文件夹下的core-site.xml内容是空的),进行如下修改:
- <property> <name>hadoop.tmp.dir</name> <value>/home/eric/hadoop-datastore/hadoop-${user.name}</value> <description>A base for other temporary directories.</description></property>
<!-- 这个配置非常重要,在其他配置文件中是会用到这个路径的。 -->
- <property> <name>fs.default.name</name> <value>hdfs://localhost:9999</value> <description>description></property>
<!-- 这个配置非常重要,这是在之后的编程中要匹配的地址,确保端口号没被使用. -->
(3)hdfs-site.xml
- 首先拷贝src/hdfs文件夹下的hdfs-default.xml文件到conf目录下,然后重命名成hdfs-site.xml(默认在conf文件夹下的hdfs-site.xml内容是空的),进行如下修改:
- <property> <name>dfs.replication</name> <value>1</value> <description></description></property>
<!-- 由于是在单节点上配置,所以副本为1.没有尝试不是1的结果,但是有的文档说是会因为找不到其他的datanode节点而出现错误。 -->
- <property> <name>dfs.data.dir</name> <value>${hadoop.tmp.dir}/dfs/data</value> <description></description></property>
- <property> <name>dfs.name.dir</name> <value>${hadoop.tmp.dir}/dfs/name</value> <description></description></property>
<!-- 以上这两个配置项也是很重要的,默认的是使用了在core-site.xml中的hadoop.tmp.dir路径下的。保持这样就行,在之后的format的时候,会显示这个dfs.name.dir的。 -->
(4)mapred-site.xml
<property>
<name>mapred.job.tracker</name> <value>localhost:9998</value> <description></description> </property><! -- 配置job tracker -->
7.编写Test文件用来在HDFS上存储文件并检查是否成功
import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class Test { public static void main(String[] args) { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); Path f = new Path("hdfs://localhost:9999/test.txt"); FSDataOutputStream out = fs.create(f); for(int i=0;i<100;i++){ out.writeChars("test" + i + "\n"); } out.close(); } catch (IOException e) { e.printStackTrace(); } }}
打包成test.jar并拷贝到hadoop/bin目录下,终端进入~/eric/hadoop/bin目录。
- hadoop namenode -format (#格式化)
- start-all.sh (#启动)
- ./hadoop fs -ls /
- .hadoop jar ./test.jar Test
- ./hadoop fs -ls /
- ./hadoop fs -cat /test.txt
- stop-all.sh (#结束)
下面的截图可以供参考:
format success
start-all success
write success
write success
stop success
对于学习hadoop希望有帮助~ ^_^
补充:
1. 启动脚本
在Hadoop Wiki中看到如下对启动脚本的介绍,不清楚具体针对的版本是怎样,个人觉得可能是0.2.X之后的,这样也好,把HDFS和MapRed分开了。
-
start-dfs.sh - Starts the Hadoop DFS daemons, the namenode and datanodes. Use this before start-mapred.sh
-
stop-dfs.sh - Stops the Hadoop DFS daemons.
-
start-mapred.sh - Starts the Hadoop Map/Reduce daemons, the jobtracker and tasktrackers.
-
stop-mapred.sh - Stops the Hadoop Map/Reduce daemons.
-
start-all.sh - Starts all Hadoop daemons, the namenode, datanodes, the jobtracker and tasktrackers. Deprecated; use start-dfs.sh then start-mapred.sh
-
stop-all.sh - Stops all Hadoop daemons. Deprecated; use stop-mapred.sh then stop-dfs.sh