背景
远程提交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
分享到:
相关推荐
3. **依赖管理**:MavenRunHelper支持添加、删除和更新项目依赖,同时会自动解决依赖冲突,使得管理项目依赖变得简单易行。 4. **插件管理**:除了基本的生命周期,MavenRunHelper还允许用户方便地配置和执行各种...
标题中的“配合m2eclipse,改造tomcatPluginV321根据maven的依赖自动热部署”涉及了两个主要的开发工具集成:M2Eclipse(Maven插件)和Tomcat Plugin V321,以及它们如何协同工作以实现基于Maven依赖的自动热部署。...
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar
使用maven管理依赖包时会遇到依赖冲突的问题,解决起来非常麻烦。MavenRunHelper插件作为解决冲突的利器,能够高效率的展示出冲突列表,快速解决冲突问题。由于网络等问题,常常无法下载插件。现提供IntelliI IDEA ...
通过手动配置和使用 `maven-ant-tasks-2.1.3.jar`,开发者可以在 Ant 构建环境中高效地管理依赖和执行 Maven 目标,提高开发效率。在实际项目中,根据具体的构建需求,合理运用 Maven Ant Tasks,可以大大提升开发和...
Maven 使用 tomcat8-maven-plugin 插件 Maven 是一个流行的构建自动化工具,它可以帮助开发者自动完成项目的编译、测试、打包、部署等任务。 Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-...
软件介绍: idea Maven Helper的本地离线安装包,这个能够解决idea插件无法在线安装的问题。IDEA在线安装Maven Helper插件有时候会很慢,需要先将下载的ZIP压缩包解压后再使用。
例如,你可以使用Ant来定义特定的构建任务,如生成Thrift代码,然后使用Maven来管理这些生成代码的依赖,并负责整个项目的构建流程。在Thrift 0.9.0版本中,可能需要配置特定的Maven或Ant插件来支持Thrift的编译。 ...
Maven-Ant-Task 是一个 Maven 插件,允许在 Ant 项目中使用 Maven 依赖管理和插件机制。使用 Maven-Ant-Task,可以将 Maven 依赖管理和 Ant 任务驱动结合起来,实现自动化构建。 五、实践示例 以 myssh2 工程为例...
下面我们将详细讨论如何使用Ant实现这个目标。 首先,确保你已经安装了Ant,并且在项目中创建了`build.xml`文件。这个文件是Ant的构建脚本,定义了构建过程中的各种任务。要将依赖的jar与源码编译后的class文件合并...
在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...
### Jenkins 实现 Maven 项目自动部署到 Tomcat 在当今快速发展的软件开发环境中,持续集成(CI)与持续部署(CD)已经成为不可或缺的部分。本文将详细介绍如何利用 Jenkins 实现 Maven 项目的自动部署到 Tomcat ...
将"MavenRunHelper.rar"解压后,将得到的插件文件放入IDEA的plugins目录下,然后重启IDEA,插件就会自动加载并生效。当然,用户也可以通过IDEA的内置插件市场搜索并在线安装。 总的来说,MavenRunHelper是IDEA用户...
- 使用Maven的deploy插件将你的jar包部署到私有仓库: ``` mvn deploy ``` 4. **验证部署** - 在Nexus的Web界面中,查看“my-private-repo”仓库,确认你的jar包已成功上传。 - 在其他项目中,同样添加对私有...
"elasticsearch 5.4.0 maven 依赖jar包" 指的是在 Maven 项目中使用 Elasticsearch 5.4.0 版本时,需要的全部依赖库文件。这些 jar 包包括 Elasticsearch 核心库、X-Pack 插件以及其他相关的第三方库,例如 Lucene、...
6. JBoss Forge和WildFly Swarm: 对于使用JBoss相关技术栈的开发者,Forge和WildFly Swarm提供了一种快速迭代的方法,它们可以监测源代码并自动部署到本地服务器。 总的来说,Maven项目中的热部署是通过各种工具和...
MavenRunHelper,用于进行maven项目jar包依赖关系以及冲突情况查看的工具类
1. **Maven的生命周期**:Maven的`install`目标会把编译后的项目打包并部署到本地仓库,`tomcat7:run`或`tomcat8:run`插件目标可以直接启动Tomcat服务器并部署项目。这样,每当源码发生变化,Maven会自动编译并更新...