最近想用C++访问HDFS的文件,因为是在windows上做开发,但apache并没有编译出windows版本的C++开发包,因此决定自己在windows上做编译,在编译过程中遇到一些问题,特此记录下来。目前已经编译好的hadoop安装包,需要的可以下载使用
http://download.csdn.net/detail/for_onxx/8838933
进入正题,本次编译环境为windows8.1 64位,VS2012,hadoop2.6.编译步骤如下:
1.下载hadoop2.6源码,下载地址:
http://hadoop.apache.org/releases.html
2.把源码解压到某目录,解压时最好放到根目录,如 D:\hd,因为hadoop源码的目录非常深,如果不放到根目录下,可能超过windows目录长度的限制导致解压失败。
打开源码目录下的 BUILDING.txt 文件,里面有windows编译的介绍,如下图:
可以看到,要编译的话必需安装 JDK1.6以上(最好不用1.8)、MAVEN3.0以上、Protobuf2.5(其它版本不行),findbugs、cmake(越新越好)、cgwin和zlib,
这些东西的安装方法,我不具体一一介绍了,大家到网上搜索一下,需要注意的是,安装完之后要在path环境变量中添加相应的路径:
JDK: 添加JAVA_HOME环境变量,并把%JAVA_HOME%\bin添加到PATH环境变量末尾。
MAVEN: 添加MAVEN_HOME环境变量,并把%MAVEN_HOME%\bin添加到PATH环境变量末尾。
Protoubuf: 下载源码后,用VS编译出来protoc.exe,并把protoc.exe所在目录添加到PATH环境变量末尾。
findbugs: 添加FINDBUGS_HOME环境变量,并把%FINDBUGS_HOME%\bin添加到PATH环境变量末尾。
cmake: 添加CAMKE_HOME环境变量,并把%CMAKE_HOME%\bin添加到PATH环境变量末尾。
cgwin: 添加CYGWIN_HOME环境变量,并把%CYGWIN_HOME%\bin添加到PATH环境变量末尾
以上写得有点罗嗦,除了JAVA_HOME必须增加环境变量以外,其它的只需要把bin目录或exe目录增加到PATH就可以了,为了方便我是把相应的环境变量也加上去了。
3. 因为使用的是native-win编译,因此需要msbuild,windows sdk或者vs2010 Professional,官方说不能使用express版本的VS,因为它不能编译x64的程序。
同样不能用VS2012,其实是因为它的pom.xml文件写死了是用VS2010版本。当然,如果安装了windows sdk的话,也可以不使用VS进行编译。
我的电脑上只安装了VS2012,所以懒得安装其它的东西了,直接用它编译
4. 第2步做完后,用管理员身份打开VS2012命令行工具,切换到hadoop目录下,
设置编译64位:
set Platform=x64
设置zlib目录
set ZLIB_HOME=D:\zlib-1.2.8
开始编译:
mvn package -Pdist,native-win -DskipTests -Dtar
因为用的是VS2012进行编译,不出意料的话,在编译过程会出现2处错误,编译的时候我没截图,就文字说明了:
错误1:
是编译 hadoop-common-project 的时候,看错误描述是没找到VC100编译器,因为默认生成了VS2010的项目,但我没装.
解决方法:
在源码目录下搜索 *.sln,搜索到native.sln和winutils.sln,用VS2012打开,升级为2012的项目,再编译一次,OK.
本来是想在pom.xml看它在哪里指定了生成vs2010的sln,但竟然没找到。。。
错误2:
这个错误是编译 hadoop-hdfs-project 的时候,这个错误描述很扯,我当时找不到是什么问题,重新编译几次,错误提示竟然不一样。
后来发现还是VS版本的问题。为了避免这个错误发生,可以提前修改hadoop源码目录下的 hadoop-hdfs-project\hadoop-hdfs\pom.xml文件,
大概是579行最右边,把 -D ‘Visual Studio 10 Win64’
改成如下图所示:
再次编译,不出意外的话,一路畅通,最后编译成功。
用同样的方法,只要是安装了VS2010以后的版本,都应该是可以编译通过的。