hadoop-libjars和classnotfoundexception

6yjfywim  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(350)

请帮帮我,我卡住了。这是我运行作业的代码。

hadoop jar mrjob.jar ru.package.Main -files hdfs://0.0.0.0:8020/MyCatalog/jars/metadata.csv -libjars hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar,hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/result_file

我确实收到了这些警告:

12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/opencsv.jar is not on the local filesystem. Ignoring.
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/gson.jar is not on the local filesystem. Ignoring.
12/10/26 18:35:50 WARN util.GenericOptionsParser: The libjars file hdfs://0.0.0.0:8020/MyCatalog/jars/my-utils.jar is not on the local filesystem. Ignoring.

然后:线程“main”java.lang.noclassdeffounderror中出现异常:在main类的第行,我尝试从名为my-utils.jar的jar示例化类
所有这些jar都在hfds中(我通过文件浏览器看到它们)
my-utils.jar不包含类,这是noclassdeffounderror的原因之一
我做错了什么?
upd:我正在检查GenericOptions解析器的源代码:

/**
   * If libjars are set in the conf, parse the libjars.
   * @param conf
   * @return libjar urls
   * @throws IOException
   */
  public static URL[] getLibJars(Configuration conf) throws IOException {
    String jars = conf.get("tmpjars");
    if(jars==null) {
      return null;
    }
    String[] files = jars.split(",");
    List<URL> cp = new ArrayList<URL>();
    for (String file : files) {
      Path tmp = new Path(file);
      if (tmp.getFileSystem(conf).equals(FileSystem.getLocal(conf))) {
        cp.add(FileSystem.getLocal(conf).pathToFile(tmp).toURI().toURL());
      } else {
        LOG.warn("The libjars file " + tmp + " is not on the local " +
          "filesystem. Ignoring.");
      }
    }
    return cp.toArray(new URL[0]);
  }

所以:1。逗号2之间没有空格。还是不明白。。。我试着指出:本地文件系统,hdfs文件系统,结果是一样的。好像没有加课。。。

bkkx9g8r

bkkx9g8r1#

仅仅因为它们在hdfs上,并不意味着它们在正在运行的作业的类路径中。
如果您真的只想解决这个问题,我将使用maven构建一个“胖jar”,它在一个jar中包含所有依赖项。您可以使用shade插件来实现这一点。
但是,看看你的命令,它看起来是错误的。我认为您可能会更幸运地使用带有-libjars的“job”命令,如这里所述。我不确定您是否可以使用“hadoopjar”命令指定外部jar。

bgtovc5b

bgtovc5b2#

问题解决了。正确的调用是:

hadoop jar my-job.jar ru.package.Main -files /home/cloudera/uploaded_jars/metadata.csv -libjars /home/cloudera/uploaded_jars/opencsv.jar,/home/cloudera/uploaded_jars/gson.jar,/home/cloudera/uploaded_jars/url-raiting-utils.jar /MyCatalog/http_requests.seq-r-00000 /MyCatalog/output/scoring_result

哪里
/我的目录
是hdfs路径,
/home/cloudera/u jars/
是作业jar中出现问题的本地fs路径。以前,我确实尝试使用简单jar运行作业,它只有三个类:mapper、reducer和main class。现在我提供了maven生成的另一个(它生成了其中两个)第二个jobjar包含所有依赖lib。在它旁边。结构类似于:my-job.jar
-库
--aopalliance-1.0.jar asm-3.2.jar avro-1.5.4.jar。。。commons-beanutils-1.7.0.jar commons-beanutils-core-1.8.0.jar。。。zookeeper-3.4.3-cdh4.0.0.jar
lib文件夹中有76个jar。
但我不明白为什么。

cczfrluj

cczfrluj3#

原因是mrjob.jar决定了hadoop客户机作业所需的jar。要么提供一个胖jar,要么在hadoop\u类路径下包含所有jar。
另一方面,-libjars设置map和reduce任务所需的额外jar。
读这个http://grepalex.com/2013/02/25/hadoop-libjars/

相关问题