0

およびとしてユーザー定義fileInputFormatクラスを使用した mapreduce プログラムで Word ドキュメント ファイルを読み込もうとしています。クラスでは、Apache POI を使用して単語ファイルを読み取ります。しかし、実行時エラーが発生します。Windows 7 プラットフォームで Eclipse と Hadoop-0.20.2 を使用しています。 私は自分を次のように定義 しました:POIに必要なjarファイル(添付の画像)の下に保持し、それらをに追加しました。WordDocxInputFormatWordDocxInputFormatRecordReaderWordDocxInputFormatRecordReader.docxjava.lang.ClassNotFoundException
CLASSPATHJAVA_HOME\lib;C:\cygwin\home\bmohanty6\poijars\;C:\cygwin\home\bmohanty6\poijars\Project->property->libraries->add external jar

ここに画像の説明を入力

次のようにエラーが発生しています

13/09/17 12:35:26 INFO mapred.JobClient: Task Id : attempt_201309101108_0040_m_000000_2, Status : FAILED
Error: java.lang.ClassNotFoundException: org.apache.poi.xwpf.usermodel.XWPFDocument
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at WordDocxInputFormat$WordDocxInputFormatRecordReader.next(WordDocxInputFormat.java:112)
    at WordDocxInputFormat$WordDocxInputFormatRecordReader.next(WordDocxInputFormat.java:1)
    at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:192)
    at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.next(MapTask.java:176)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:48)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
    at org.apache.hadoop.mapred.Child.main(Child.java:170)

ここに私の WordDocxInputFormat.class があります

import java.io.IOException;
import java.util.Arrays;
import java.io.FileInputStream;
import java.util.logging.Level;  
import java.util.logging.Logger;  

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;


import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.extractor.*;

/**
 * Reads complete documents in Binary format.
 */
public class WordDocxInputFormat
    extends FileInputFormat<Text, Text> {

    public WordDocxInputFormat() {
        super();
    }

    protected boolean isSplitable(FileSystem fs, Path filename) {
        return false;
    }

    @Override
    public RecordReader<Text, Text> getRecordReader(
            InputSplit split, JobConf job, Reporter reporter) throws IOException {

        return new WordDocxInputFormatRecordReader((FileSplit) split, job);     
    }

    /**
    * WordDocxInputFormatRecordReader class to read through a given binary document
    * Outputs the filename along with the complete document
    */  
    public class WordDocxInputFormatRecordReader
        implements RecordReader<Text, Text> {

        private final FileSplit fileSplit;
        private final Configuration conf;
        private boolean processed = false;

        public WordDocxInputFormatRecordReader(FileSplit fileSplit, Configuration conf)
            throws IOException {
            this.fileSplit = fileSplit;
            this.conf = conf;
        }

        @Override
        public Text createKey() {
            return new Text();
        }

        @Override
        public Text createValue() {
            return new Text();
        }

        @Override
        public long getPos() throws IOException {
            return this.processed ? this.fileSplit.getLength() : 0;
        }

        @Override
        public float getProgress() throws IOException {
            return this.processed ? 1.0f : 0.0f;
        }

        @Override
        public boolean next(Text key, Text value) throws IOException {
            if (!this.processed) {

                Path file = this.fileSplit.getPath();
                try{
                    XWPFDocument docx = new XWPFDocument(new FileInputStream(file.toString()));
                    XWPFWordExtractor we = new XWPFWordExtractor(docx);
                    key.set(file.getName());
                    value.set(we.getText());
                }
                catch(IOException ex) {
                     Logger.getLogger(WordDocxInputFormatRecordReader.class.getName()).log(Level.SEVERE, null, ex);
                }
                this.processed = true;
                return true;
            }
            else {
                return false;
            }
        }

        @Override
        public void close() throws IOException {
        }
    }   
}
4

1 に答える 1

1

「しかし、java.lang.ClassNotFoundException 実行時エラーが発生しています」

このエラーとランタイムが発生しているが、コンパイル時には発生していない場合は、プログラムを実行するときとコンパイル時に異なるセットアップを使用していることはほぼ間違いありません。つまり、コンパイラをコンパイルすると、jar のある領域が検索されますが、プログラムを実行すると、別の場所が検索され、それらが見つからないため、エラーが実行時にのみ表示されるのはなぜですか。これが本当にあなたの問題である場合、私はいくつかの提案があります:

タグが示唆するようにEclipseを使用している場合は、ビルドパスを確認してください.Eclipseがコンパイルと実行でどのように機能するかわかりません。そのため、確認する必要があるかもしれません.

または、定期的に jar を使用する場合は、このチュートリアルが示すように jvm の外部ライブラリにそれらを追加してみてからコンパイルと実行にその jvm を使用するようにしてください。チュートリアルに示されている領域にそれらを配置すると、コンパイラは、その jvm が使用されるときに、コンパイル時および実行時に jar を自動的にチェックできます。

これが役に立てば幸いです、頑張ってください!

于 2013-09-17T08:33:17.223 に答える