Hi all,

I assume usually people will execute Hadoop/HDFS jobs using something like
"./hadoop jar myjar.jar". I'm wondering is there anyway to bypass
"./hadoop" part, just using "java" or "java -jar"? I'm only using APIs from
HDFS, nothing from Hadoop MapReduce.

I have a simple program here, just write one sentence into HDFS and then
read the content and print to screen.

import java.io.*;
import java.util.ArrayList;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HelloHDFS {
    public static void main (String [] args) throws IOException {
        String filename = args[0];
        Path file = new Path(filename);
        FileSystem hdfs = FileSystem.get(new Configuration());
        FSDataOutputStream out = hdfs.create(file);
        out.writeUTF("Foo foo foo!");
        out.flush();
        out.close();
        FSDataInputStream in = hdfs.open(file);
        int bytes;
        byte[] buffer = new byte[512];
        while ((bytes = in.read(buffer)) > 0) {
                System.out.write(buffer, 0, bytes);
        }
        in.close();
    }
}

I compress this into a jar, and it can run successfully using "hadoop -jar
myjar test". However, when I try to use "java -jar " or "java [classname]",
it throughs NoClassDefFoundError like:

$ java -jar bin/hdfsUtil.jar test
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/hadoop/fs/Path
        at hdfs.HelloHDFS.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.Path
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 1 more

I have hadoop-core-0.20.203.0.jar and commons-logging-1.1.1.jar in my
CLASSPATH and I'm sure they are undamaged, but I still have these no class
found exceptions. Do I need to include other libraries to solve it?

Thanks in advance,
Yuduo Zhou

Reply via email to