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之后,问题解决!!
相关推荐
3. **依赖管理**:确保所有依赖的JAR包都已添加,包括Hadoop的依赖库,如Apache Commons、Guava等。如果使用Maven或Gradle,可以在构建文件中添加相应的依赖。 4. **编写代码**:现在可以开始编写使用Hadoop API的...
在Solr中,除了内置的分词器外,用户还可以通过添加第三方Jar包来扩展分词功能。例如,`solr_jar`这个压缩包可能包含了针对特定语言或特定需求的自定义分词器,如支持多语种、专业术语或者社交媒体文本的处理。这些...
新的Hadoop部署生态中,HDFS将Block管理交给了第三方服务,使得理论上可以支持无限数量的文件。同时,HDFS提供了一个统一的访问层,允许大数据应用对后端存储服务进行一致性的访问,尽管这可能导致失去数据的局部性...
这些库可能包括Hadoop本身、其他Apache项目的依赖,或者其他第三方工具和框架。 7. `classes`:编译后的Java类文件和资源文件会被放置在这个目录下,这些是运行Hadoop MapReduce任务的二进制代码。 通过研究这个...
5. **lib**目录:包含了Hadoop依赖的第三方库文件,这些库支持Hadoop的各种功能,如网络通信、序列化和XML解析等。 6. **build**和**src**目录:构建脚本和源代码分别位于这两个目录中。通过构建脚本(通常是Ant或...
`classes`目录通常包含插件编译后的Java类文件,而`lib`目录则包含插件运行所需的第三方库文件,这些库可能包含了与Hadoop交互所必需的API。 总的来说,Hadoop-Eclipse插件是Java开发者在Windows环境下进行Hadoop...
1. 准备:收集所有必要的Spark相关文件,包括Spark核心库、第三方依赖JAR文件、用户的应用程序代码等。 2. 配置:根据需求设置Spark的配置参数,如Master地址、Executor数量、内存分配等。 3. 打包:使用Spark ...
1. **依赖管理**:Hadoop项目通常依赖于大量的第三方库,这些库可能包含相同的类,导致冲突。jarjar通过重命名或排除重复的类,避免了类路径冲突,确保了程序的正常运行。 2. **优化JAR结构**:在大数据处理中,...
3. **lib**:这里包含了插件运行所需的第三方库文件,比如Hadoop客户端的相关jar包,这些库文件使得插件能够与Hadoop集群通信,执行MapReduce任务。 4. **META-INF**:这是标准的Java存档(JAR)文件的一部分,包含...
6. 配置yum源:更新系统到最新版本,配置可信的第三方软件仓库,以便获取必要的依赖包。 7. 关闭防火墙:防火墙可能阻止集群内的通信,关闭防火墙或配置防火墙规则允许Hadoop服务端口。 8. 配置ssh免key:设置无...
- **依赖管理**: Spark项目通常需要依赖Scala库以及其他第三方库,这些依赖可以通过构建工具(如Maven或Sbt)进行管理。 - **示例**: 如果使用Maven,则需要在项目的`pom.xml`文件中添加相应的依赖项。 ##### 2、...
它集成了大量常用的第三方库配置,如JDBC、MongoDB、JPA、RabbitMQ、Quartz等,让开发者能够快速创建独立运行的应用。 2. **MySQL**: MySQL是一款关系型数据库管理系统,广泛用于Web应用,支持事务处理、高并发读写...
- **监控工具**: 介绍了如何使用Hadoop自带或其他第三方工具来监控集群的状态。 **10.3 维护** - **日常维护**: 说明了如何进行日常的维护工作,确保Hadoop集群稳定运行。 #### 十一、Pig简介 **11.1 安装和运行...
3. **第三方工具**:例如Cloudera Manager、Ambari等,提供更丰富的监控和告警功能。 4. **自定义脚本**:编写脚本定期收集和汇总KPI,结合可视化工具展示。 5. **集成监控系统**:如Prometheus、Grafana等,可以与...
3. **阴影(shaded)打包**: 在Java开发中,阴影打包是一种将第三方库的代码合并到单一JAR文件中的技术,通常用来解决依赖冲突。这个过程会重写类名以避免命名冲突,同时包含所有必要的依赖。 4. **开源文化**: 开源...
- lib目录:依赖的第三方库,可能包含Hadoop、Apache Commons、推荐算法库等。 - resources目录:非Java资源文件,如输入数据、日志模板等。 五、项目实施步骤 1. 配置Hadoop环境,确保集群正常运行。 2. 编写...
- **丰富的类库**:Java拥有大量的第三方库,可以方便地扩展Hadoop的功能。 - **生态系统**:Java拥有庞大的开发者社区,为Hadoop提供了持续的技术支持。 #### 三、Hadoop实战应用 Hadoop的应用场景广泛,尤其是在...
内置的测试模块如unittest和doctest,第三方测试工具如py.test和mock,都是在进行代码质量控制时不可或缺的工具。此外,消息队列和Celery的使用,以及如何在Flask应用中使用Celery进行后台任务处理,也是Python Web...
6. 监控和管理:利用HBase自带的监控界面或者第三方工具监控HBase的运行状态和性能。 总之,HBase是大数据领域的重要组件,尤其适用于需要实时访问和处理大规模结构化数据的场景。正确理解和使用HBase,能够帮助你...
2. **lib** 目录:存放了所有必要的依赖库文件,包括Java JARs和其他第三方库。 3. **conf** 目录:存放配置文件,如`hive-site.xml`,用于定制Hive的行为和设置。 4. **scripts** 和 **metastore-server** 目录:...