背景
远程提交MR job时将MR job依赖的所有jar都发布到HDFS中,同时将这些jar加到hadoop job的classpath上。
如果每次手动上传就太费劲。项目集成maven。所以打算在maven package时将所有jar通过脚本上传到远程HDFS上
编写ant脚本
使用了,haddop的ant 插件。说白了就是一些util方法,调用了fsshell。没有文档,写的时候需要参考plugin的源代码。呵呵。
关键:
<hdfs cmd="rm" args="@{mapred.lib.dir}/*.jar" conf="@{hadoop.conf.dir}">
cmd:命令,参考hadoop fs
args:参数,逗号分隔
conf:core-site.xml的所在的文件目录
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- ========================================项目构建文件 ====================================================================== -->
<project>
<import file="build.property.xml" />
<!--
<path id="dev_classpath">-->
<!--
<pathelement location="${resource.dir}"/>
<pathelement location="${classes.dir}"/>-->
<!--
<fileset dir="${dev.ant.contrib.dir}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${dev.ant.contrib.lib.dir}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${dev.hadoop.home}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${dev.hadoop.home.lib}">
<include name="**/*.jar" />
</fileset>
</path>-->
<target name="init">
<echo message="init copy and generate mapred libs">
</echo>
<taskdef resource="org/apache/maven/artifact/ant/antlib.xml">
</taskdef>
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
</taskdef>
<!--<echo message="set classpath success"/>-->
<taskdef resource="net/sf/antcontrib/antlib.xml">
</taskdef>
<taskdef resource="org/apache/hadoop/ant/antlib.xml">
</taskdef>
<echo message="import external antcontrib and hadoop ant extention task success">
</echo>
<!--
<delete file="${resource.dir}/${mapred.lib.outfile}"/>
<echo message="delete ${resource.dir}/${mapred.lib.outfile} success">
</echo>
<touch file="${resource.dir}/${mapred.lib.outfile}">
</touch>
<echo message="create ${resource.dir}/${mapred.lib.outfile} success">
</echo>-->
</target>
<target name="dev_copy_libs">
<foreach param="local.file" target="dev_copy_lib">
<fileset dir="${lib.dir}" casesensitive="yes">
<exclude name="**/hadoop*.jar" />
<exclude name="**/hbase*.jar" />
<exclude name="**/zookeeper*.jar" />
</fileset>
<fileset dir="target" casesensitive="yes">
<include name="${project.jar}" />
</fileset>
</foreach>
</target>
<target name="dev_copy_lib">
<hdfs cmd="copyFromLocal" args="${local.file},${dev.mapred.lib.dir}" conf="${dev.hadoop.conf.dir}">
</hdfs>
<echo message="copy ${local.file} to remote hdfs files file system: ${dev.mapred.lib.dir} success">
</echo>
</target>
<macrodef name="macro_upload_mapred_lib" description="upload mapred lib">
<attribute name="hadoop.conf.dir" />
<attribute name="mapred.lib.dir" />
<sequential>
<property name="mapred.lib.dir" value="@{mapred.lib.dir}">
</property>
<echo message="hadoop conf dir: @{hadoop.conf.dir}">
</echo>
<hdfs cmd="rm" args="@{mapred.lib.dir}/*.jar" conf="@{hadoop.conf.dir}">
</hdfs>
<echo message="rm remote dir @{mapred.lib.dir}">
</echo>
</sequential>
</macrodef>
<target name="dev_upload_jars" depends="init">
<macro_upload_mapred_lib hadoop.conf.dir="${dev.hadoop.conf.dir}" mapred.lib.dir="${dev.mapred.lib.dir}" />
<echo message="----------------------------------------">
</echo>
<echo message="begin to copy libs to ${dev.mapred.lib.dir} exclude hadoop*, hbase*,">
</echo>
<antcall target="dev_copy_libs">
</antcall>
<echo message="all files has been copied to ${dev.mapred.lib.dir}">
</echo>
<echo message="----------------------------------------">
</echo>
</target>
</project>
build.properties.xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
<property file="build.properties"></property>
<property name="classes.dir" value="target/classes"></property>
<property name="lib.dir" value="lib"></property>
<property name="resource.dir" value="src/main/resource"></property>
<property name="mapred.lib.outfile" value="mapred_lib.properties"></property>
<property name="lib.dir" value="lib"></property>
<property name="project.jar" value="${project.name}-${project.version}.jar"/>
<!--
<property name="dev.ant.contrib.dir" value="${dev.ant.contrib.dir}"></property>
<property name="dev.ant.contrib.lib.dir" value="${dev.ant.contrib.dir}/lib"></property>
<property name="dev.hadoop.home" value="${dev.hadoop.home}"></property>
<property name="dev.hadoop.home.lib" value="${dev.hadoop.home}/lib"></property>-->
</project>
build.properties
src.conf.dir=src/main/conf
target.dir=target
#dev
dev.mapred.lib.dir=/user/root/mrlib/dev
dev.hadoop.conf.dir=${src.conf.dir}/dev
#test
test.mapred.lib.dir=/user/mrlib/test
test.hadoop.conf.dir=${src.conf.dir}/test
#testout
testout.mapred.lib.dir=/user/mrlib/testout
testout.hadoop.conf.dir=${src.conf.dir}/testout
配置pom.xml,因为我们使用了很多第三方的ant plugin。加入到ant plugin的dependency中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>upload mapred jars</id>
<phase>package</phase>
<configuration>
<target>
<ant antfile="${basedir}/build.xml" inheritRefs="true">
<target name="${envcfg.dir}_upload_jars" />
</ant>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.94.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b3</version>
<exclusions>
<exclusion>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>${hadoop.version}-modified</version>
<optional>true</optional>
<exclusions>
<exclusion>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</exclusion>
<exclusion>
<groupId>net.sf.kosmosfs</groupId>
<artifactId>kfs</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jdt</groupId>
<artifactId>core</artifactId>
</exclusion>
<exclusion>
<groupId>net.java.dev.jets3t</groupId>
<artifactId>jets3t</artifactId>
</exclusion>
<exclusion>
<groupId>oro</groupId>
<artifactId>oro</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-ant</artifactId>
<version>${hadoop.version}</version>
<optional>true</optional>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact-ant</artifactId>
<version>2.0.4</version>
</dependency>
</dependencies>
</plugin>
运行:
执行maven install,看到所有jar都发布到了hdfs上。hoho。
- 大小: 97.5 KB
分享到:
相关推荐
jenkins+maven-tomcat插件自动部署
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar
MavenRunHelper
软件介绍: idea Maven Helper的本地离线安装包,这个能够解决idea插件无法在线安装的问题。IDEA在线安装Maven Helper插件有时候会很慢,需要先将下载的ZIP压缩包解压后再使用。
MavenRunHelper,用于进行maven项目jar包依赖关系以及冲突情况查看的工具类
MavenRunHelper插件的作用是帮助用户更轻松地在InteliJ IDEA中运行maven项目,它可以自动配置Maven运行环境,并且可以自动识别 maven项目的依赖关系,从而节省时间和精力。
jenkins实现maven项目自动部署到tomcat 实现自动部署,
达梦数7据库j驱动包及方言包,maven依赖jar包,DM达梦数据库jdbc-jar包dialect方言jar包
在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包
在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(三)开发和发布自己开发的maven插件
4、在links中新建maven.txt文件,内容为插件地址,例如:path=D:\eclipse_gzds\myplugins\maven(注意这里斜杠,不是反斜杠) 5、将maven.txt扩展名改为maven.lin 6、在eclipse根目录下找到eclipse.ini并打开,在...
Maven使用tomcat8-maven-plugin插件
标签:ant-1.6.5.jar.zip,ant,1.6.5,jar.zip包下载,依赖包
maven-assembly-plugin 插件打第三方依赖包进 jar,spring 有 org.springframework.beans.factory.parsing.BeanDefinitionParsingException 异常怎么办? maven-shade-plugin 插件打第三方依赖包,spring 有 java....
这是一个springboot+maven写的demo,主要演示springboot项目通过maven插件,将依赖与配置文件打包到jar包外部,实现灵活的项目管理.仅供参考学习
使用maven管理依赖包时会遇到依赖冲突的问题,解决起来非常麻烦。MavenRunHelper插件作为解决冲突的利器,能够高效率的展示出冲突列表,快速解决冲突问题。由于网络等问题,常常无法下载插件。现提供IntelliI IDEA ...
elasticsearch 5.4 maven依赖jar包 x-pack-transport5.4.0所有依赖jar包
把maven 的MavenRunHelper插件放到idea 安装目录下的plugins重启就可以了