Ubuntu 上 Hadoop 1.0.3 单节点 配置-运行 成功

由于项目的需要,需要对一个分布式文件系统进行深入的学习,在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的网站、网址可以参考:

 

这里把自己的配置过程和配置文件分享下。

 

1. 安装Oracle VM VirtualBox虚拟机(虚拟机随意,物理机最好,虚拟机作为单节点跑起Hadoop还是比较慢的)并安装Ubuntu 11.10(Ubuntu版本也随意,不过建议版本不要太旧)。可以到我的网盘下载。 http://115.com/file/c2ay5l3r (Ubuntu 镜像文件)和 http://115.com/file/c2ay5b0z (VirtualBox)

2.安装Java JDK

我是用的是稳定的1.6版本,1.6.32。下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html。下载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

下载并解压即可。下载地址 http://www.eclipse.org/downloads/

(对于正常运行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

posted @ 2012-06-12 11:29  hanyuanbo  阅读(2508)  评论(0编辑  收藏  举报