我在本地节点CentOS上运行Hadoop 2.2.0.2.0.6.0-101。
当我在Eclipse项目中包含/usr/lib/hadoop
和/usr/lib/hive
所需的jar文件时,我的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作业?
重申一下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文件的问题:你可以有两种情况:
您正在尝试运行的m/c是集群的一部分,即安装和配置hadoop。在这种情况下,命令"hadoop jar <>"应该包含所有hadoop相关的依赖项。
系统没有安装hadoop。在这种情况下,您可以使用maven通过检查有效的POM来获取jar列表。