2016-12-19 3 views
-1

マイイエナのHadoopのMapReduceの例では、java.lang.NoClassDefFoundErrorがスローされます。 Mavenプロジェクトです。私は、それが欠けている依存関係に関連しているかもしれないが、私はどれが欠けているかわからないことを読む! 何が問題なのですか?NodeWritable java.lang.NoClassDefFoundErrorのHadoopのイエナ

コンソールログ

java.lang.NoClassDefFoundError: org/apache/jena/hadoop/rdf/types/NodeWritable 
     at org.apache.jena.hadoop.rdf.stats.RdfMapReduceExample.main(RdfMapReduceExample.java:29) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
Caused by: java.lang.ClassNotFoundException: org.apache.jena.hadoop.rdf.types.NodeWritable 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 7 more 

マップコードパート1

package org.apache.jena.hadoop.rdf.mapreduce.count; 

import java.io.IOException; 

import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.jena.hadoop.rdf.types.AbstractNodeTupleWritable; 
import org.apache.jena.hadoop.rdf.types.NodeWritable; 

public abstract class AbstractNodeTupleNodeCountMapper<TKey, TValue, T extends AbstractNodeTupleWritable<TValue>> 
     extends Mapper<TKey, T, NodeWritable, LongWritable> { 
    private LongWritable initialCount = new LongWritable(1); 

    @Override 
    protected void map(TKey key, T value, Context context) throws IOException, InterruptedException { 
     NodeWritable[] ns = this.getNodes(value); 
     for (NodeWritable n : ns) { 
      context.write(n, this.initialCount); 
     } 
    } 

    protected abstract NodeWritable[] getNodes(T tuple); 
} 

マップコード部2

package org.apache.jena.hadoop.rdf.mapreduce.count; 

import org.apache.jena.graph.Triple; 
import org.apache.jena.hadoop.rdf.mapreduce.count.AbstractNodeTupleNodeCountMapper; 
import org.apache.jena.hadoop.rdf.types.NodeWritable; 
import org.apache.jena.hadoop.rdf.types.TripleWritable; 

public class TripleNodeCountMapper<TKey> extends AbstractNodeTupleNodeCountMapper<TKey, Triple, TripleWritable> { 
    @Override 
    protected NodeWritable[] getNodes(TripleWritable tuple) { 
     Triple t = tuple.get(); 
     return new NodeWritable[] { new NodeWritable(t.getSubject()), new NodeWritable(t.getPredicate()), 
       new NodeWritable(t.getObject()) }; 
    } 
} 

コード削減

package org.apache.jena.hadoop.rdf.mapreduce.count; 

import java.io.IOException; 
import java.util.Iterator; 

import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.jena.hadoop.rdf.types.NodeWritable; 

public class NodeCountReducer extends Reducer<NodeWritable, LongWritable, NodeWritable, LongWritable> { 
    @Override 
    protected void reduce(NodeWritable key, Iterable<LongWritable> values, Context context) 
      throws IOException, InterruptedException { 
     long count = 0; 
     Iterator<LongWritable> iter = values.iterator(); 
     while (iter.hasNext()) { 
      count += iter.next().get(); 
     } 
     context.write(key, new LongWritable(count)); 
    } 
} 
そうでない場合は、あなたのコードはまったくコンパイルされないでしょうとしての

仕事ハンドラ

package org.apache.jena.hadoop.rdf.stats; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.jena.hadoop.rdf.io.input.TriplesInputFormat; 
import org.apache.jena.hadoop.rdf.io.output.ntriples.NTriplesNodeOutputFormat; 
import org.apache.jena.hadoop.rdf.mapreduce.count.NodeCountReducer; 
import org.apache.jena.hadoop.rdf.mapreduce.count.TripleNodeCountMapper; 
import org.apache.jena.hadoop.rdf.types.NodeWritable; 

public class RdfMapReduceExample { 

    public static void main(String[] args) { 
     try { 
      // Get Hadoop configuration 
      Configuration config = new Configuration(true); 

      // Create job 
      Job job = Job.getInstance(config); 
      job.setJarByClass(RdfMapReduceExample.class); 
      job.setJobName("RDF Triples Node Usage Count"); 

      // Map/Reduce classes 
      job.setMapperClass(TripleNodeCountMapper.class); 
      job.setMapOutputKeyClass(NodeWritable.class); 
      job.setMapOutputValueClass(LongWritable.class); 
      job.setReducerClass(NodeCountReducer.class); 

      // Input and Output 
      job.setInputFormatClass(TriplesInputFormat.class); 
      job.setOutputFormatClass(NTriplesNodeOutputFormat.class); 
      FileInputFormat.setInputPaths(job, new Path(args[1])); 
      FileOutputFormat.setOutputPath(job, new Path(args[2])); 

      // Launch the job and await completion 
      job.submit(); 
      if (job.monitorAndPrintJob()) { 
       // OK 
       System.out.println("Completed"); 
      } else { 
       // Failed 
       System.err.println("Failed"); 
      } 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } 
} 

のpom.xmlの依存関係が

<dependencies> 
    <!-- https://mvnrepository.com/artifact/org.apache.jena/jena-elephas-common --> 
    <dependency> 
     <groupId>org.apache.jena</groupId> 
     <artifactId>jena-elephas-common</artifactId> 
     <version>3.1.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.jena</groupId> 
     <artifactId>jena-elephas-io</artifactId> 
     <version>3.1.1</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common --> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-mapreduce-client-common</artifactId> 
     <version>2.7.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.7.1</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

答えて

2

あなたの依存関係の宣言は正しいです。

あなたの問題は、あなたのJAR可能性が高いだけであなたのコードが含まれており、必要な依存関係のいずれかが含まれていないということです。したがって、Map Reduceがコードを実行しようとすると、依存関係は存在しません。一般

地図のために構築し、それはあなたのコードと、すべての依存関係が含まれている脂肪のJARを作成するのが最善です減らします。 Mavenアセンブリプラグインを使用してこれを行うことができます(Mavenシェードを使用することもできます)。

は、あなたのpom.xmlにこれを追加します。

 <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <descriptors> 
      <descriptor>hadoop-job.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 

はこのhadoop-job.xml使用を追加します。

<assembly> 
    <id>hadoop-job</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>provided</scope> 
     <outputDirectory>lib</outputDirectory> 
     <excludes> 
     <exclude>${groupId}:${artifactId}</exclude> 
     </excludes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>true</unpack> 
     <includes> 
     <include>${groupId}:${artifactId}</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

基本的にこれはあなたのすべての非提供の依存関係が含まれている脂肪のJARを構築するためにMavenを要求します。これにより、通常のJARの代わりに実行するyour-artifact-VERSION-hadoop-job.jarという追加のアーティファクトが作成されます

+0

ありがとうございます。src/hadoop-job.xmlファイルを作成し、pom.xmlに新しい行を実装しました しかし、 jarを実行して例外を残す: java.lang.NoClassDefFoundError:org/apache/jena/hadoop/rdf/types/NodeWritable at org.apache.jena.hadoop.rdf.stats.RdfMapReduceExample.main(RdfMapReduceExample.java:29) java.lang.ClassNotFoundException:によって引き起こされる) ... org.apache.jena.hadoop.rdf.types.NodeWritable ... また を印刷中の新しいワーリングはfs.FileUtilをWARN:ファイルの削除に失敗しましたまたは[C:\ Users \ ... \ DepJarElement.jar]のままにしてください –

関連する問題