0

我有一个名为 putmerge 的简单 Java 程序,我正在尝试执行它。我已经研究了 6 个小时,在网上研究了很多地方,但找不到解决方案。基本上我尝试使用以下命令构建包含所有类库的 jar:

javac -classpath *:lib/* -d playground/classes playground/src/PutMerge.java

然后我使用以下命令构建 jar。

jar -cvf playground/putmerge.jar -C playground/classes/ .

然后我尝试使用以下命令执行它:

bin/hadoop jar playground/putmerge.jar org.scd.putmerge "..inputPath.." "..outPath"

..

Exception in thread "main" java.lang.ClassNotFoundException: com.scd.putmerge
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:270)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)

我尝试了每一种排列/组合来运行这个简单的 jar,但是我总是得到某种异常,如上所示。

我的源代码:

package org.scd.putmerge;

import java.io.IOException;
import java.util.Scanner;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

/**
 * 
 * @author Anup V. Saumithri
 *
 */
public class PutMerge
{
    public static void main(String[] args) throws IOException
        {
        Configuration conf = new Configuration();
        FileSystem hdfs = FileSystem.get(conf); 
        FileSystem local = FileSystem.getLocal(conf);

        Path inputDir = new Path(args[0]);
        Path hdfsFile = new Path(args[1]);



        try
        {
            FileStatus[] inputFiles = local.listStatus(inputDir);
            FSDataOutputStream out = hdfs.create(hdfsFile);

            for(int i=0; i<inputFiles.length; i++)
            {
                System.out.println(inputFiles[i].getPath().getName());
                FSDataInputStream in = local.open(inputFiles[i].getPath());

                byte buffer[] = new byte[256];
                int bytesRead = 0;
                while((bytesRead = in.read(buffer)) > 0)
                {
                    out.write(buffer, 0, bytesRead);
                }
                in.close();
            }
            out.close();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }   
    }
}
4

1 回答 1

1

您将 PutMerge 类放入 jar 中的方式可能有点不正确。

如果您执行 a jar tf putmerge.jar,您必须在代码(即 org/scd/putmerge)中的包 (org.scd.putmerge) 中提到的路径内看到 PutMerge 类。

如果不尝试执行以下操作来实现这一目标。确保您已将 PutMerge.class 复制到 org/scd/putmerge/ 目录中。

jar -cvf playground/putmerge.jar org/scd/putmerge/PutMerge.class

接下来,再次验证jar tf putmerge.jar以检查现在是否org/scd/putmerge/PutMerge.clas在输出中看到 s。

如果一切正常,您可以尝试再次运行 hadoop jar。但是查看错误,我发现您实际上并未将 PutMerge 类包含在包中。您应该使用org.scd.putmerge.PutMerge。所以,正确的方法应该是——

bin/hadoop jar playground/putmerge.jar org.scd.putmerge.PutMerge "..inputPath.." "..outPath"
于 2013-09-22T12:11:08.837 回答