打包和部署Hadoop MapReduce作业的正确方法?

时间:2014-03-25 14:30:52

标签: java hadoop deployment jar mapreduce

我在本地节点CentOS上运行Hadoop 2.2.0.2.0.6.0-101。

当我将来自/usr/lib/hadoop/usr/lib/hive的必要jar包含在Eclipse项目中作为依赖项时,我的MapReduce作业在Eclipse中编译。寻找必要的罐子是一个真正的追求!而grep是我这项工作的唯一工具,可以做grep -ri -l "FacebookService" /usr/lib/hadoop

之类的工作

尽管我尝试在编译它的同一本地节点上运行我的应用程序时遇到异常。我放弃尝试找到必要的罐子 - 修复一个例外之后会出现一个新的例子。

现在,在通过添加来自/usr/lib/hadoop/usr/lib/hive的广告来修复了大约10个例外后,我得到了一个非常好的例子:

java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.

有趣的部分:当我从这些目录中添加所有 jar时,我的程序会运行!

最后一个解决方案在我的情况下不起作用,因为我需要创建一个自给自足的包来在另一个分布式Hadoop安装上运行我的应用程序。

部署Hadoop MapReduce作业的正确方法是什么? 我应该如何设置Hadoop CLASSPATH以在任何节点上运行MapReduce作业?

1 个答案:

答案 0 :(得分:0)

重申Vishal推荐的内容:使用Maven进行依赖关系管理。 MR项目的典型maven pom.xml(简单)如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>hadoop.test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.0.0-cdh4.2.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

这就是美:hadoop-client封装了所有依赖项。

回到运行生成的jar文件的问题:

您可以有两种情况:

  1. 您尝试运行的m / c是群集的一部分,即已安装和配置hadoop。在这种情况下,命令&#34; hadoop jar&lt;&gt;&#34;应包括所有与hadoop相关的依赖项。你必须添加你的依赖罐子。

  2. m / c没有安装hadoop。在这种情况下,您可以通过检查有效POM来使用maven获取jar列表。

  3. 希望很清楚。