Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到Hadoop映射器类_Java_Hadoop_Mapreduce_Distributed Filesystem - Fatal编程技术网

Java 未找到Hadoop映射器类

Java 未找到Hadoop映射器类,java,hadoop,mapreduce,distributed-filesystem,Java,Hadoop,Mapreduce,Distributed Filesystem,我使用ApacheHadoop1.2.1开发了一个MapReduce程序。我使用EclipseIDE进行初始开发,以模拟hadoop分布式计算环境,所有输入和输出文件都来自本地文件系统。此程序将在Eclipse中执行,不会出现任何问题。然后,我使用Eclipse创建了一个JAR文件,并尝试在一台hadoop机器的集群上运行该文件,但收到错误: 以下是我设置和运行hadoop作业的代码: String outputPath = "/output"; String hadoopInstruction

我使用ApacheHadoop1.2.1开发了一个MapReduce程序。我使用EclipseIDE进行初始开发,以模拟hadoop分布式计算环境,所有输入和输出文件都来自本地文件系统。此程序将在Eclipse中执行,不会出现任何问题。然后,我使用Eclipse创建了一个JAR文件,并尝试在一台hadoop机器的集群上运行该文件,但收到错误:

以下是我设置和运行hadoop作业的代码:

String outputPath = "/output";
String hadoopInstructionsPath = args[0];

Job job = new Job();
job.setJarByClass(Main.class);  //setJarByClass is here but not found apparently?!?
job.setJobName("KLSH");

FileInputFormat.addInputPath(job, new Path(hadoopInstructionsPath));
FileOutputFormat.setOutputPath(job,new Path(outputPath));


job.setMapperClass(KLSHMapper.class);
job.setReducerClass(KLSHReducer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

System.exit(job.waitForCompletion(true) ? 0:1);
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;
然后,我使用eclipse创建一个jar,使用File->Export->Runnable jar File创建要在集群上运行的jar文件

我用于运行作业的命令如下所示(KLSH.jar是jar文件的名称,/hadoopInstruction是args[0]输入参数,imageFeature.Main/指定主类的位置)

这将产生以下输出:

14/11/12 11:11:48 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/11/12 11:11:48 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
14/11/12 11:11:48 INFO input.FileInputFormat: Total input paths to process : 1
14/11/12 11:11:48 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/11/12 11:11:48 WARN snappy.LoadSnappy: Snappy native library not loaded
14/11/12 11:11:49 INFO mapred.JobClient: Running job: job_201411051030_0022
14/11/12 11:11:50 INFO mapred.JobClient:  map 0% reduce 0%
14/11/12 11:11:56 INFO mapred.JobClient: Task Id : attempt_201411051030_0022_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: imageFeatures.KLSHMapper
...
因此它会出错,因为它找不到映射器类。有“No job jar file set”警告,但我觉得我已经在第一段代码中指定了job.setJarByClass,所以我不知道为什么会抛出此错误

我还知道KLSHMapper类在JAR中,因为如果我运行以下命令:

jar tf KLSH.jar
mvn install:install-file -DgroupId=jeigen -DartifactId=jeigen -Dversion=1 -Dpackaging=jar -Dfile=/path/to/the/location/of/Jeigen.jar
我得到了相当多的输出,但这里有一部分输出:

...
imageFeatures/Main.class
imageFeatures/Feature.class
imageFeatures/FileLoader.class
imageFeatures/KLSHMapper.class
...

所以很明显KLSHMapper类就在那里。。。我尝试过修改hadoop类路径以包含KLSH.jar路径,尝试过将KLSH.jar复制到DFS并尝试使用该路径而不是本地文件系统上的路径,还尝试过使用-libjars说明符执行作业。无论我尝试了什么,hadoop似乎都无法找到我的Mapper类。有人能指出我做错了什么吗?我似乎无法从在Eclipse中工作的代码跳到在实际的Hadoop集群上工作。谢谢

您的文件中是否有导入语句:

import imageFeatures.KLSHMapper;

您还需要在CLASSPATH环境变量中包含包含imageFeatures.KLSMapper的jar文件。这是一个非常奇怪的外来代码,所以我可能有点不对劲……

在做了一些额外的工作之后,我能够解决我自己的问题。最终,这取决于我构建jar文件的方式,然后我尝试在hadoop集群上执行该文件

我没有使用eclipse来构建JAR文件,而是从命令行使用Maven来构建JAR文件。在pom.xml文件中,可以使用以下内容指定主类:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>maxTemp.MaxTemperature</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
现在,当您使用hadoop执行jar文件时,您将不再需要指定mainClass,因为您已经在jar的清单中这样做了。如果JAR清单中没有这一行,则需要使用以下语法在集群上执行作业:

./hadoop jarFile [mainClass] args...
使用清单文件中的行,您可以按如下方式执行作业:

./hadoop jarFile args...
作为旁白,我遇到了一些问题,因为我使用jeigen java库来做一些线性代数。我的集群无法找到我使用过的依赖项(jeigen.jar),它抛出了更多错误。我最终建造了一个胖罐子,正如本网站所描述的:

通过对pom.xml文件进行一些添加,我能够生成一个带有依赖项的maxTemp jar,然后集群能够找到我的所有依赖项,因为它们包含在jar文件中。我希望这有助于节省一些人在未来的时间。其中一些依赖项在我的本地系统上,Maven无法获取它们。我可以使用以下命令将maven指向它们并手动安装它们:

jar tf KLSH.jar
mvn install:install-file -DgroupId=jeigen -DartifactId=jeigen -Dversion=1 -Dpackaging=jar -Dfile=/path/to/the/location/of/Jeigen.jar
下面是我的pom.xml文件,它生成两个JAR,一个包含依赖项,另一个不包含依赖项:

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>maxTemp</groupId>
  <artifactId>maxTemp</artifactId>
  <version>0.0.1</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>  
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>maxTemp.MaxTemperature</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <archive>
              <manifest>
                <mainClass>maxTemp.MaxTemperature</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>
                jar-with-dependencies
              </descriptorRef>
            </descriptorRefs>
          </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>
  <dependencies>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-tools</artifactId>
      <version>1.2.1</version>
    </dependency>

    <dependency>
      <groupId>jeigen</groupId>
      <artifactId>jeigen</artifactId>
      <version>1</version>
    </dependency>

    <dependency>
      <groupId>jna</groupId>
      <artifactId>jna</artifactId>
      <version>4.0.0</version>
    </dependency>

  </dependencies>
</project>

4.0.0
maxTemp
maxTemp
0.0.1
src
maven编译器插件
3.1
1.7
1.7
org.apache.maven.plugins
maven jar插件
最大温度
maven汇编插件
最大温度
带有依赖项的jar
组装
包裹
单一的
org.apache.hadoop
hadoop客户端
1.2.1
org.apache.hadoop
hadoop内核
1.2.1
org.apache.hadoop
hadoop工具
1.2.1
杰根
杰根
1.
jna
jna
4.0.0

请问,奇怪的是什么?我的代码基于Hadoop《定义指南》(第三版)一书中的示例代码。这是我第一次认真尝试使用Hadoop做除数词以外的任何事情。有更好的方法吗?我只是不熟悉hadoop分布式计算环境。不是想批评你在做什么。我相信你的思路是对的。您看过Job类的文档了吗:我想我可以肯定的是,您遇到的错误更多地与java没有找到有问题的类文件有关。必须有一个对jar文件在类路径中的物理位置的引用,然后在Java中,您需要指定在哪里可以找到有问题的包(这通常是通过import语句完成的)。我怀疑您可能是正确的。几乎可以肯定,这是一个路径问题,在某个地方没有正确地输入到作业中。我会继续调查的。谢谢你的反馈!