使用0.22.X系列版本的Hadoop快有一年时间了,主要集中在HDFS上。期间自己参与了部署Hadoop集群(1 Server + 20PC),也参与了分析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无法启动。最明显的一个问题是由这个配置项导致的:
XHTML
<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文件。
目前,在伪分布式环境下,已经试用了Raid的XOR编码方案对指定目录下的文件进行编码。