hadoop自定义java程序

ca1c2owp  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(492)

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

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

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

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

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

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

..

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

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

  1. package org.scd.putmerge;
  2. import java.io.IOException;
  3. import java.util.Scanner;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.FSDataInputStream;
  6. import org.apache.hadoop.fs.FSDataOutputStream;
  7. import org.apache.hadoop.fs.FileStatus;
  8. import org.apache.hadoop.fs.FileSystem;
  9. import org.apache.hadoop.fs.Path;
  10. /**
  11. *
  12. * @author Anup V. Saumithri
  13. *
  14. */
  15. public class PutMerge
  16. {
  17. public static void main(String[] args) throws IOException
  18. {
  19. Configuration conf = new Configuration();
  20. FileSystem hdfs = FileSystem.get(conf);
  21. FileSystem local = FileSystem.getLocal(conf);
  22. Path inputDir = new Path(args[0]);
  23. Path hdfsFile = new Path(args[1]);
  24. try
  25. {
  26. FileStatus[] inputFiles = local.listStatus(inputDir);
  27. FSDataOutputStream out = hdfs.create(hdfsFile);
  28. for(int i=0; i<inputFiles.length; i++)
  29. {
  30. System.out.println(inputFiles[i].getPath().getName());
  31. FSDataInputStream in = local.open(inputFiles[i].getPath());
  32. byte buffer[] = new byte[256];
  33. int bytesRead = 0;
  34. while((bytesRead = in.read(buffer)) > 0)
  35. {
  36. out.write(buffer, 0, bytesRead);
  37. }
  38. in.close();
  39. }
  40. out.close();
  41. }
  42. catch(IOException ex)
  43. {
  44. ex.printStackTrace();
  45. }
  46. }
  47. }
mfpqipee

mfpqipee1#

将putmerge类放入jar的方式可能有点不正确。
如果你做了一个 jar tf putmerge.jar ,则必须在代码(即org/scd/putmerge)中的包(org.scd.putmerge)中提到的路径中看到putmerge类。
如果没有,试着做下面的事情来达到这个目的。确保已将putmerge.class复制到org/scd/putmerge/目录中。

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

接下来,再次验证 jar tf putmerge.jar 检查是否现在看到 org/scd/putmerge/PutMerge.clas 在输出中输入。
如果一切正常,您可以再次尝试运行hadoop jar。但是看看这些错误,我发现您实际上并没有将putmerge类包含在包中。您应该使用org.scd.putmerge.putmerge。所以,正确的方法应该是--

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

相关问题