Hadoop 0.22.0 及其 RAID 部署

        使用0.20.X系列版本的Hadoop快有一年时间了,主要集中在HDFS上。期间自己参与了部署Hadoop集群(1 Server + 20 PC),也参与了分析HDFS的源码。

        这几天,由于项目需要,转移到了0.22.0版本了,需要重新部署Hadoop集群。这次部署要牵扯到mapreduce项目下contribute中的raid。目的是:部署0.22.0版本Hadoop的集群,配置并试用其raid的功能。由于之前对0.22.0版本不熟悉,所以在部署集群前,准备先在Ubuntu上部署伪分布式的,熟悉相关文件的位置和使用。

        0.22.0版本伪分布式的部署和其他版本的没有什么本质的不同,主要是有一些细节需要处理,并需要熟悉整个项目相关文件的组织结构。下面主要记录一下在伪分布式安装和编译Raid时的一些问题和解决方法。

        1. 从hadoop-0.22.0.tar.gz解压后的目录可知,该版本相比于0.20.X系列目录结构有较大变化。这给一直使用0.20.X版本系列的人带来了一点儿麻烦,需要大致翻看一下各个目录都有什么。

        2. 配置注意事项:
       在hadoop-env.sh中启用JAVA_HOME的配置和你需要的配置项;
       配置好masters、slaves列表文件,其中masters中只需要指定SecondaryNamenode所在的结点的hostname或IP地址即可;
       对于配置文件可以按照core-site.xml、hdfs-site.xml、mapred-site.xml的顺序依次填写配置项;
       如果要使用raid,还需要在hdfs-site.xml和raid源码目录下的raid.xml中进行配置,可参看HDFS RAID的
Wiki

        3. Hadoop集群的管理和使用脚本,要赋予可执行权限。另外,与hdfs、mapreduce相关的shell脚本文件已经被分开放在相应的目录下。为了使用方便可以将相应文件拷贝到$HADOOP_HOME/bin下,也可以在环境变量PATH中添加这些文件所在的目录。

        4. 重新编译Raid项目,显示Ivy无法解析:

[ivy:resolve]         ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]         ::          UNRESOLVEDDEPENDENCIES         ::
[ivy:resolve]         ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]         ::org.apache.hadoop#hadoop-common;0.22.0-SNAPSHOT: not found
[ivy:resolve]         ::org.apache.hadoop#hadoop-common-test;0.22.0-SNAPSHOT: not found
[ivy:resolve]         ::org.apache.hadoop#hadoop-hdfs;0.22.0-SNAPSHOT: not found
[ivy:resolve]         :::::::::::::::::::::::::::::::::::::::::::::: 
         解决方法是:进入$HADOOP_HOME/mapreduce/ivy查找libraries.properties文件,找到hadoop-common.version和hadoop-hdfs.version这两项,改成
hadoop-common.version=0.22.0
hadoop-hdfs.version=0.22.0 
        5. Raid配置相关的问题
       关于Raid的配置和使用并没有清晰完整的指南,最完整的的应该算是
HDFS RAID Wiki里的介绍。但是,这个Wiki里有错误,只看这个Wiki进行配置的话,肯定会导致RaidNode无法启动。最明显的一个问题是由这个配置项导致的:             
<property>
  <name>fs.hdfs.impl</name>
  <value>org.apache.hadoop.dfs.DistributedRaidFileSystem</value>
  <description>The FileSystem for hdfs: uris.</description>
</property> 
       

        其中的value部分应该是org.apache.hadoop.hdfs.DistributedRaidFileSystem,否则肯定会在日志文件中看到报类找不到的错误。

        当然,只是改了这里日志里还是会不停的报错,剩下的部分就只能根据错误看源码慢慢分析、改正、验证了。比如:
        Q:日志文件报BlockFixer中有一处类型转换异常,就是尝试将DistributedRaidFileSystem对象转换为DistributedFileSystem对象。
        A:查看相关函数,发现其中需要使用相关代码的变量在函数内只有定义,未被引用,猜测该变量没用,在源码中注释了相应行,重新打包Raid,用新生成的jar文件替换原来的jar文件。

             A: 在BlockFixer.java中将getDFS(Path)方法改为:

 
/**
   * Returns a DistributedFileSystem hosting the path supplied.
   */
  protected DistributedFileSystem getDFS(Path p) throws IOException {
	LOG.info("[-Control Flow-]:" + p.getFileSystem(getConf()));
    	return (DistributedFileSystem) ((DistributedRaidFileSystem)p.getFileSystem(getConf())).getFileSystem();
  }

         然后,在raid目录下执行Ant jar命令,将在mapreduce/build/的对应目录下生成新的jar文件,替换原有jar文件。   

         目前,在伪分布式环境下,已经试用了Raid的XOR编码方案对指定目录下的文件进行编码。

         最近进度:已经在集群上试用。

         由于项目需要,近期会持续关注HDFS Raid,在我的个人博客里会及时分享一些最新动态。

         我的博客:http://zhoutai.duapp.com

有关编译器优化的更完整信息,请参阅优化通知
标签: