对码当歌,猿生几何?

利用Ant构建Hadoop高效开发环境

最近Hadoop的研究中,都是利用Mockito来模拟数据进行,下一个阶段需要在Hadoop服务器上做大量的运行进行验证,同时也要为正式使用做准备。 

今天考虑使用Ant来搭建一个Hadoop的开发和调试环境,不使用hadoop自带的插件。

思路如下:

1、  利用Ant在开发机器上将代码编译、打包,最终得到可执行的jar包。

2、  利用Ant的SSH属性,将jar包传到hadoop服务器的指定工作目录。

这样就开发机器做为编码客户端,与执行服务器之间关联,代码部署的时间基本不用考虑,开发效率可以提高,也利于在真实环境进行验证程序。 

再扩展开来,可以利用Ant操作hadoop服务器,实现与开发客户端的交互,因为Ant可以通过SSH实现Linux服务器的命令操作。 

如下是根据需要改造的Ant的bulid.xml文件,实现了:目录清理、目录构建、编译、打包、SFTP上传功能: 

<?xml version="1.0" encoding="UTF-8"?>  
<project name="AntTest" default="all" basedir=".">  
      
    <property name="src" location="./src" />  
    <property name="build" location="./build/classes" />  
    <property name="dist" location="./lib" />  
  
  
    <path id="project.classpath">  
        <fileset dir="D:ProjectJavaOpenSourceHadoophadoop-0.20.205.0-binhadoop-0.20.205.0lib">  
            <include name="*.jar" />  
        </fileset>  
    </path>  
  
    <target name="all" depends="clean,sshexec"></target>  
    <!-- Generate directory -->  
    <target name="init">  
        <tstamp />  
        <mkdir dir="${build}" />  
        <mkdir dir="${dist}" />  
    </target>  
  
    <!-- compile java -->  
    <target name="compile" depends="init">  
        <javac srcdir="${src}" destdir="${build}" includeantruntime="no">  
            <compilerarg line="-encoding GBK " />  
            <!-- 给编译器指定编码,防止出现:"警告: 编码 GBK 的不可映射字符"-->  
            <classpath refid="project.classpath" />  
        </javac>  
    </target>  
    <!-- jar -->  
    <target name="dist" depends="compile">  
        <mkdir dir="${dist}" />  
        <jar jarfile="${dist}/hadoop_project.jar" basedir="${build}" />  
    </target>  
  
    <!-- clean -->  
    <target name="clean">  
        <delete dir="${build}" />  
        <delete dir="${dist}" />  
        <echo message="clean dir">  
        </echo>  
    </target>  
  
    <!-- run -->  
    <target name="run" depends="dist">  
        <java classpath="${build}" classname="demo.guide.chp7.HelloWorld">  
            <classpath refid="project.classpath" />  
            <!--     <classpath refid="${build}" />  -->  
        </java>  
    </target>  
  
    <!-- sftp -->  
    <target name="sshexec" depends="run">  
        <scp todir="root:****@192.168.9.181:/tmp/" trust="true">  
            <fileset dir="${dist}" />  
        </scp>  
    </target>  
  
</project>  

在Ant改造中,遇到了以下几个问题,特记录如下:

1、 Includeantruntime 问题:

运行报错:

compile:

    [javac]D:ProjectJavaHadoop_workspacehadoop_projectulid.xml:37: warning:'includeantruntime' was not set, defaulting to build.sysclasspath=last; set tofalse for repeatable builds

[javac] Compiling 1 sourcefile to D:ProjectJavahadoop_workspacehadoop_projectuildclasses 

原因及解决方法:

新版本的Ant需要设置Includeantruntime属性:

includeantruntime :指出是否应在类路径中包括 Ant 运行时程序库,默认为 yes。

这里设置为“no”即可解决。 

2、 Error running javac.execompiler的错误

编译的时候,出现build.xml:32 Errorrunning javac.exe compiler 或者 build.xml:97: Unable tofind a javac compiler 的错误。

原因及解决方法:

这个原因是没有正确指定JRE的路径,javac找不到导致的。在Eclispe里面打开后,发现是默认到JRE的安装目录,这里修改为指向到JDK的目录即可解决。

修改的菜单路径为: Window-->Preferences-->Java-->InstalledJRES

增加JDK的目录并选中即可(取消之前的JRE目录的选择)。 

3、 实现SFTP遇到Could notload a dependent class com/jcraft/jsch/Logger 的错误:

使用SFTP的时候,遇到Could not load a dependent class com/jcraft/jsch/Logger的错误,错误信息如下:

Could not load a dependent classcom/jcraft/jsch/Logger

It is not enough to have Ant's optional JARs

  you need theJAR files that the optional tasks depend upon.

      Ant's optional task dependencies arelisted in the manual. 

原因及解决方法:

Ant自带的jsch的jar包存在问题,需要从官方网站下载后重新引入。

下载地址为:http://www.jcraft.com/jsch/index.html 

下载后,在Window-->Preferences-->Ant-->Runtime中,添加外部jar引用,增加新的jsch的jar包即可。 

4、 警告:编码UTF-8 的不可映射字符

Ant可以编译成功,但出现警告:编码 UTF-8 的不可映射字符 

原因为项目编码为GBK的问题,两个办法可以解决:

1、  修改项目编码格式

2、  在ant的javac的编译节点中,增加以下属性:

<compilerargline="-encodingGBK "/>

<!-- 给编译器指定编码,防止出现:"警告: 编码 UTF-8 的不可映射字符"-->

在这里我还是要推荐下我自己建的大数据学习交流qq裙:522189307 , 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴。上述资料加群可以领取