`
QING____
  • 浏览: 2255747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mapreduce部署与第三方依赖包管理

 
阅读更多

    Mapreduce部署是总会涉及到第三方包依赖问题,这些第三方包配置的方式不同,会对mapreduce的部署便捷性有一些影响,有时候还会导致脚本出错。本文介绍几种常用的配置方式:

 

1. HADOOP_CLASSPATH

    在hadoop的相关配置文件中,添加CLASSPATH路径,那么在hadoop的各个进程启动时都会载入这些包,因此对于mapreduce-job jar中则不需要额外的引入这些jars,所以mapreduce-job jar会比较小[瘦jar],便于传输;但它的问题也比较明显,如果mapreduce-job中新增了其他引用jar,则必须重新启动hadoop的相关进程。

    我们可以在hadoop-env.sh中,增加如下配置:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/customer/jars

 

    其中“/path/customer/jars”路径为自己的第三方jar所在的本地路径,我们需要在集群中所有的hadoop机器上都同步这些jar。

 

    瘦jar的打包方式(maven):

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
		<execution>
			<id>copy-dependencies</id>
			<phase>prepare-package</phase>
			<goals>
				<goal>copy-dependencies</goal>
			</goals>
			<configuration>
				<outputDirectory>${project.build.directory}/lib</outputDirectory>
				<overWriteReleases>false</overWriteReleases>
				<overWriteSnapshots>false</overWriteSnapshots>
				<overWriteIfNewer>true</overWriteIfNewer>
			</configuration>
		</execution>
	</executions>
</plugin>
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
				<classpathPrefix>lib/</classpathPrefix>
				<mainClass>com.app.script.Main</mainClass>
			</manifest>
		</archive>
	</configuration>
</plugin>

 

    使用了copy-dependencies插件,当使用“mvn package”命令打包之后,第三方引用包会被copy到打包目录下的lib文件中(并非mapreduce-job jar内部的lib文件中),开发者只需要把这些jars上传到所有hadoop集群即可。

 

2. 其他方式

    我们可以将额外的jars包,放置在yarn能够加载的路径下,目前可行的方案为,在yarn-site.xml中修改:

 <property>
		<name>yarn.application.classpath</name>
		<value>$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,
				$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
				$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,
				$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,
				$HADOOP_YARN_HOME/share/hadoop/yarn/*,
				$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*
		</value>
</property>

 

    上述路径为默认配置,我们可以把自己的第三方jars放在"$HADOOP_YARN_HOME/share/hadoop/yarn/lib/"下,经过测试,用户自定义的文件路径并不能很好的生效,这个问题困惑了我很久。

 

    此外,我们还可以修改hadoop-env.sh文件,增加相应的classpath,不过这种方式添加的jars,将会在hadoop的所有子进程中加载(包括yarn进程),这是一种比较快速而且有效的方式,唯一不好的地方就是当jars变更时,需要重启所有的子进程。

 

export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:/path/customer/jars/*"

 

    同时,本人通过在mapred-site.xml中增加如下配置,却不能生效,不确定是何种原因(尽管$HADOOP_HOME正常)

<property>
		<name>mapred.child.env</name>
		<value>LD_LIBRARY_PATH=/path/customer/jars</value>
		<!-- 
			LD_LIBRARY_PATH=$HADOOP_HOME/mapred-lib/thirdparty
		-->
</property>

 

 

3. -libjars选项

    我们可以在使用“hadoo jar”命令时,向启动的job传递“libjars”选项参数,同时配合ToolRunner工具来解析参数并运行Job,这种方式是推荐的用法之一,因为它可以简单的实现job的依赖包和hadoop classpath解耦,可以为每个job单独设置libjars参数。这些jars将会在job提交之后复制到hadoop“共享文件系统中”(hdfs,/tmp文件夹中),此后taskTracker即可load到本地并在任务子进程中加载。

 

    libjars中需要指定job依赖的所有的jar全路径,并且这些jars必须在当前本地文件系统中(并非集群中都需要有此jars),暂时还不支持hdfs。对于在HADOOP_CLASSPATH或者mapred.child.env中已经包含了jars,则不需要再-libjars参数中再次指定。因为libjars需要指定jar的全路径名,所以如果jars特别多的话,操作起来非常不便,所以我们通常将多个job共用的jars通过HADOOP_CLASSPATH或者mapred.child.end方式配置,将某个job依赖的额外的jars(少量的)通过-libjars选项指定。

 

hadoop jar statistic-mr.jar com.statistic.script.Main -libjars /path/cascading-core-2.5.jar,/path/cascading-hadoop-2.5.jar

 

4. Fatjar

    胖jar,即将mapreduce-job jar所依赖的所有jar都“shade”到一个jar中,最终package成一个“独立”的可运行的jar;当然hadoop并不需要这个jar是“可运行的”,它只需要这个jar在运行时不需要额外的配置“--classpath”即可。此外Fatjar仍然可以使用HADOOP_CLASSPATH或者map.child.env所加载的jars,因为我们在打包时可以将这些jars排除,以减少fatjar的大小。

 

    fatjar只不过是一种打包的方式,也仍然可以和“-libjars”选项配合。不过从直观上来说,fatjar确实是解决“-libjars”不方便的技巧。

 

    此例中,我们使用cascading来开发一个mapreduce job,但是我们又不希望cascading的相关依赖包被放入HADOOP_CLASSPATH中,因为其他的job可能不需要或者其他的job有可能使用其他版本的cascading;所以就使用Fatjar,把job程序和cascading的依赖包全部“shade”在一起。

 

    使用maven assambly插件来完成fatjar的打包工作:

    1) pom.xml

<build>
	<finalName>statistic-mapred</finalName>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-assembly-plugin</artifactId>
			<configuration>
				<descriptors>
					<descriptor>src/assembly.xml</descriptor>
				</descriptors>
				<archive>
					<!-- optional -->
					<!--
					<manifest>
						<mainClass>com.script.Main</mainClass>
						<addClasspath>true</addClasspath>
					</manifest>
					-->
				</archive>
			</configuration>
			<executions>
				<execution>
					<id>make-assembly</id>
					<phase>package</phase>
					<goals>
						<goal>single</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

 

    2) assambly.xml

<assembly>
    <id>cascading</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>true</unpack>
            <scope>runtime</scope>
            <!--
            <excludes>
                <exclude>org.apache.hadoop:*</exclude>
            </excludes>
            -->
            <!-- very small jar -->
            <includes>
                <include>cascading:*</include>
                <include>thirdparty:*</include>
            </includes>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

 

   在assambly.xml中我们通过<include>标签来包含需要被“shade”的第三方依赖包,并且采用了unpack(解压)方式,此例中我们只将cascading的jar打进fatjar中,对于其他包将会被忽略,因为这些包已经在hadoop中存在(比如hadoop,hdfs,mapreduce,已经其他的常用包,都可以共用hadoop的),最终我们的打包结果如下:



 

    有了fatjar,确实大大的减少了开发工程师部署mapreduce的复杂度和出错的可能性,如果你有即备的maven环境,建议使用fatjar的方式。将fatjar直接放在hadoop中使用“hadoop jar”指令即可执行,几乎无需关心依赖包遗漏的问题。

 

    此外,需要备注一下,在使用cascading时,如果采用了HADOOP_CLASSPATH方式管理依赖时,会偶尔抛出:

Split class cascading.tap.hadoop.MultiInputSplit not found

 

    尽管cascading的所有依赖包都在CLASSPATH中,也无法解决这个问题,不确定究竟发生了什么!!后来采用了fatjar之后,问题解决!!

 

  • 大小: 24.5 KB
2
0
分享到:
评论

相关推荐

    hadoop的各种jar包

    3. **依赖管理**:确保所有依赖的JAR包都已添加,包括Hadoop的依赖库,如Apache Commons、Guava等。如果使用Maven或Gradle,可以在构建文件中添加相应的依赖。 4. **编写代码**:现在可以开始编写使用Hadoop API的...

    Solr扩展依赖Jar包

    在Solr中,除了内置的分词器外,用户还可以通过添加第三方Jar包来扩展分词功能。例如,`solr_jar`这个压缩包可能包含了针对特定语言或特定需求的自定义分词器,如支持多语种、专业术语或者社交媒体文本的处理。这些...

    Hadoop架构在云上的应用实践.pptx

    新的Hadoop部署生态中,HDFS将Block管理交给了第三方服务,使得理论上可以支持无限数量的文件。同时,HDFS提供了一个统一的访问层,允许大数据应用对后端存储服务进行一致性的访问,尽管这可能导致失去数据的局部性...

    cloud_book-example

    这些库可能包括Hadoop本身、其他Apache项目的依赖,或者其他第三方工具和框架。 7. `classes`:编译后的Java类文件和资源文件会被放置在这个目录下,这些是运行Hadoop MapReduce任务的二进制代码。 通过研究这个...

    Hadoop-2.2.0源码包

    5. **lib**目录:包含了Hadoop依赖的第三方库文件,这些库支持Hadoop的各种功能,如网络通信、序列化和XML解析等。 6. **build**和**src**目录:构建脚本和源代码分别位于这两个目录中。通过构建脚本(通常是Ant或...

    hadoop-eclipse插件

    `classes`目录通常包含插件编译后的Java类文件,而`lib`目录则包含插件运行所需的第三方库文件,这些库可能包含了与Hadoop交互所必需的API。 总的来说,Hadoop-Eclipse插件是Java开发者在Windows环境下进行Hadoop...

    spark instatller工具

    1. 准备:收集所有必要的Spark相关文件,包括Spark核心库、第三方依赖JAR文件、用户的应用程序代码等。 2. 配置:根据需求设置Spark的配置参数,如Master地址、Executor数量、内存分配等。 3. 打包:使用Spark ...

    jarjar ---hadoop

    1. **依赖管理**:Hadoop项目通常依赖于大量的第三方库,这些库可能包含相同的类,导致冲突。jarjar通过重命名或排除重复的类,避免了类路径冲突,确保了程序的正常运行。 2. **优化JAR结构**:在大数据处理中,...

    hadoop-eclipse-plugin-2.6.0

    3. **lib**:这里包含了插件运行所需的第三方库文件,比如Hadoop客户端的相关jar包,这些库文件使得插件能够与Hadoop集群通信,执行MapReduce任务。 4. **META-INF**:这是标准的Java存档(JAR)文件的一部分,包含...

    安装CM和Hadoop.docx

    6. 配置yum源:更新系统到最新版本,配置可信的第三方软件仓库,以便获取必要的依赖包。 7. 关闭防火墙:防火墙可能阻止集群内的通信,关闭防火墙或配置防火墙规则允许Hadoop服务端口。 8. 配置ssh免key:设置无...

    Spark集群与应用.docx

    - **依赖管理**: Spark项目通常需要依赖Scala库以及其他第三方库,这些依赖可以通过构建工具(如Maven或Sbt)进行管理。 - **示例**: 如果使用Maven,则需要在项目的`pom.xml`文件中添加相应的依赖项。 ##### 2、...

    基于hadoop的云盘系统

    它集成了大量常用的第三方库配置,如JDBC、MongoDB、JPA、RabbitMQ、Quartz等,让开发者能够快速创建独立运行的应用。 2. **MySQL**: MySQL是一款关系型数据库管理系统,广泛用于Web应用,支持事务处理、高并发读写...

    Hadoop 权威指南(中文前三章)

    - **监控工具**: 介绍了如何使用Hadoop自带或其他第三方工具来监控集群的状态。 **10.3 维护** - **日常维护**: 说明了如何进行日常的维护工作,确保Hadoop集群稳定运行。 #### 十一、Pig简介 **11.1 安装和运行...

    hadoop统计服务器kpi

    3. **第三方工具**:例如Cloudera Manager、Ambari等,提供更丰富的监控和告警功能。 4. **自定义脚本**:编写脚本定期收集和汇总KPI,结合可视化工具展示。 5. **集成监控系统**:如Prometheus、Grafana等,可以与...

    hadoop-cdh4-0.3.zip

    3. **阴影(shaded)打包**: 在Java开发中,阴影打包是一种将第三方库的代码合并到单一JAR文件中的技术,通常用来解决依赖冲突。这个过程会重写类名以避免命名冲突,同时包含所有必要的依赖。 4. **开源文化**: 开源...

    基于hadoop的电影推荐网站.zip

    - lib目录:依赖的第三方库,可能包含Hadoop、Apache Commons、推荐算法库等。 - resources目录:非Java资源文件,如输入数据、日志模板等。 五、项目实施步骤 1. 配置Hadoop环境,确保集群正常运行。 2. 编写...

    Hadoop实战

    - **丰富的类库**:Java拥有大量的第三方库,可以方便地扩展Hadoop的功能。 - **生态系统**:Java拥有庞大的开发者社区,为Hadoop提供了持续的技术支持。 #### 三、Hadoop实战应用 Hadoop的应用场景广泛,尤其是在...

    python学习之路 精

    内置的测试模块如unittest和doctest,第三方测试工具如py.test和mock,都是在进行代码质量控制时不可或缺的工具。此外,消息队列和Celery的使用,以及如何在Flask应用中使用Celery进行后台任务处理,也是Python Web...

    hbase-1.0.1.1-bin.tar.gz.zip

    6. 监控和管理:利用HBase自带的监控界面或者第三方工具监控HBase的运行状态和性能。 总之,HBase是大数据领域的重要组件,尤其适用于需要实时访问和处理大规模结构化数据的场景。正确理解和使用HBase,能够帮助你...

    apache-hive-2.2.0-bin.tar.gz

    2. **lib** 目录:存放了所有必要的依赖库文件,包括Java JARs和其他第三方库。 3. **conf** 目录:存放配置文件,如`hive-site.xml`,用于定制Hive的行为和设置。 4. **scripts** 和 **metastore-server** 目录:...

Global site tag (gtag.js) - Google Analytics