web-dev-qa-db-ja.com

スレッド「メイン」Java.lang.NoClassDefFoundErrorの例外:org / Apache / hadoop / hbase / HBaseConfiguration

Hadoop1.0.3とHBase0.94.22を使用しています。マッパープログラムを実行して、Hbaseテーブルから値を読み取り、ファイルに出力しようとしています。次のエラーが発生します:

Exception in thread "main" Java.lang.NoClassDefFoundError: org/Apache/hadoop/hbase/HBaseConfiguration
    at Java.lang.Class.forName0(Native Method)
    at Java.lang.Class.forName(Class.Java:340)
    at org.Apache.hadoop.util.RunJar.main(RunJar.Java:149)
Caused by: Java.lang.ClassNotFoundException: org.Apache.hadoop.hbase.HBaseConfiguration
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:372)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:361)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:360)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)

コードは以下の通りです

import Java.io.IOException;
import org.Apache.hadoop.fs.Path;
import org.Apache.hadoop.hbase.HBaseConfiguration;
import org.Apache.hadoop.hbase.client.Result;
import org.Apache.hadoop.hbase.client.Scan;
import org.Apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
import org.Apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.Apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.Apache.hadoop.hbase.mapreduce.TableMapper;
import org.Apache.hadoop.hbase.util.Bytes;
import org.Apache.hadoop.io.IntWritable;
import org.Apache.hadoop.io.Text;
import org.Apache.hadoop.mapreduce.Job;
import org.Apache.hadoop.mapreduce.lib.output.FileOutputFormat;


    public class Test {

    static class TestMapper extends TableMapper<Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);

        public void map(ImmutableBytesWritable row, Result value, Context context) throws    IOException, InterruptedException
        {
            ImmutableBytesWritable userkey = new ImmutableBytesWritable(row.get(), 0 , Bytes.SIZEOF_INT);
            String key =Bytes.toString(userkey.get());
            context.write(new Text(key), one);

        }
    }


    public static void main(String[] args) throws Exception {

        HBaseConfiguration conf = new HBaseConfiguration();
        Job job = new Job(conf, "hbase_freqcounter");
        job.setJarByClass(Test.class);
        Scan scan = new Scan();

        FileOutputFormat.setOutputPath(job, new Path(args[0]));
        String columns = "data";
        scan.addFamily(Bytes.toBytes(columns));
        scan.setFilter(new FirstKeyOnlyFilter());
        TableMapReduceUtil.initTableMapperJob("test",scan, TestMapper.class, Text.class, IntWritable.class, job);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        System.exit(job.waitForCompletion(true)?0:1);

    }

}

上記のコードをjarファイルにエクスポートし、コマンドラインで以下のコマンドを使用して上記のコードを実行します。

hadoop jar /home/testdb.jar test

ここで、testは、マッパーの結果を書き込むフォルダーです。

原因:Java.lang.ClassNotFoundException:org.Apache.zookeeper.KeeperException のような他のいくつかのリンクを確認しました。ここでは、クラスパスにzookeeperファイルを含めることが提案されていますが、プロジェクトの作成中にEclipseでは、hbaseのlibディレクトリからzookeeperファイルをすでに含めています。私が含めたファイルはzookeeper-3.4.5.jarです。 Ansもこのリンクにアクセスしました HBase --Java.lang.NoClassDefFoundError in Java ですが、クライアントAPIではなくhbaseテーブルから値を取得するためにマッパークラスを使用しています。私はどこかで間違いを犯していることを知っています、みんな私を助けてくれませんか?

「HBaseConfigurationconf = new HBaseConfiguration();」の最初の行を除くメイン関数のすべてのコードを削除してから、コードをjarファイルにエクスポートし、jarファイルをhadoopとしてコンパイルしようとすると、別の奇妙なことに気づきました。 jartest.jarそれでも同じエラーが発生します。 conf変数を誤って定義しているか、環境に問題があるようです。

5
Abhisekh

問題の修正を取得しました。hadoop-env.shファイルにhbaseクラスパスを追加していませんでした。以下は私が仕事を機能させるために追加したものです。

$ export HADOOP_CLASSPATH=$HBASE_HOME/hbase-0.94.22.jar:\
    $HBASE_HOME/hbase-0.94.22-test.jar:\
    $HBASE_HOME/conf:\
    ${HBASE_HOME}/lib/zookeeper-3.4.5.jar:\
    ${HBASE_HOME}/lib/protobuf-Java-2.4.0a.jar:\
    ${HBASE_HOME}/lib/guava-11.0.2.jar
7
Abhisekh

hadoop-env.shファイルを編集しようとしましたが、ここで説明した変更が機能しませんでした。

うまくいったのはこれです:

export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$HBASE_HOME/lib/*"

hadoop-env.shの最後に追加しました。 HBASE_HOME変数を設定することを忘れないでください。 $HBASE_HOMEをhbaseインストールの実際のパスに置き換えることもできます。

4
Vaclav C.

パス/構成が異なる人がいる場合。これを機能させるためにhadoop-env.shに追加したものは次のとおりです。

$ export HADOOP_CLASSPATH="$HBASE_HOME/lib/hbase-client-0.98.11-hadoop2.jar:\
    $HBASE_HOME/lib/hbase-common-0.98.11-hadoop2.jar:\
    $HBASE_HOME/lib/protobuf-Java-2.5.0.jar:\
    $HBASE_HOME/lib/guava-12.0.1.jar:\
    $HBASE_HOME/lib/zookeeper-3.4.6.jar:\
    $HBASE_HOME/lib/hbase-protocol-0.98.11-hadoop2.jar"

注:$HBASE_HOMEを設定していない場合は、2つの選択肢があります。 --By export HBASE_HOME=[your hbase installation path]-または、$HBASE_HOMEをhbaseフルパスに置き換えます

2
Spacez

ここでCreateTableは私のJavaクラスファイルです

このコマンドを使用します

Java -cp .:/home/hadoop/hbase/hbase-0.94.8/hbase-0.94.8.jar:/home/hadoop/hbase/hbase-0.94.8/lib/* CreateTable

0
y durga prasad