将外部jar设置为hadoop类路径

tv6aics1  于 2021-06-02  发布在  Hadoop
关注(0)|答案(5)|浏览(397)

我正在尝试将外部jar设置为hadoop类路径,但到目前为止还没有成功。
我有以下设置
$hadoop版本
hadoop 2.0.6-alpha subversionhttps://git-wip-us.apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109由jenkins于2013-10-31t07:55z从源代码处编译,校验和为95e88b2a9589fa69d6d5c1dbd48d4e此命令使用/usr/lib/hadoop/hadoop-common-2.0.6-alpha.jar运行
类路径
$echo$hadoop\u类路径
/home/tom/workspace/libs/opencsv-2.3.jar
我可以看到上面的hadoop\u类路径已经被hadoop获取了
$hadoop类路径
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadoop///:/home/tom/workspace/libs/opencsv-2.3.jar:/usr/lib/hadoop-hdfs/:/usr/lib/hadoop-hdfs/lib/:/usr/lib/hadoop-yarn/lib/:/usr/lib/hadoop-yarn///:/usr/lib/hadoop-mapreduce/lib/:/usr/lib/hadoop-mapreduce///
命令
$sudo hadoop jar flightsbycarrier.jar flightsbycarrier/user/root/1987.csv/user/root/result
我也尝试了-libjars选项
$sudo hadoop jar flightsbycarrier.jar flightsbycarrier/user/root/1987.csv/user/root/result-libjars/home/tom/workspace/libs/opencsv-2.3.jar
堆栈跟踪
14/11/04 16:43:23 info mapreduce.job:正在运行作业:作业\u 1415115532989 \u 0001 14/11/04 16:43:55 info mapreduce.job:作业作业\u 1415115532989 \u 0001正在uber模式下运行:false 14/11/04 16:43:56 info mapreduce.job:Map0%减少0%14/11/04 16:45:27 info mapreduce.job:Map50%减少0%14/11/04 16:45:27 info mapreduce.job:任务id:尝试\u 1415115532989 \u 0001 \u m \u000001 \u 0,状态:失败错误:java.lang.classnotfoundexception:au.com.bytecode.opencsv.csvparser at java.net.urlclassloader$1.run(urlclassloader)。java:366)在java.net.urlclassloader$1.run(urlclassloader。java:355)位于java.net.urlclassloader.findclass(urlclassloader)的java.security.accesscontroller.doprivileged(本机方法)。java:354)在java.lang.classloader.loadclass(类加载器。java:425)在sun.misc.launcher$appclassloader.loadclass(launcher。java:308)在java.lang.classloader.loadclass(classloader。java:358)在flightsbycarriermapper.map(flightsbycarriermapper。java:19)在flightsbycarriermapper.map(flightsbycarriermapper。java:10)在org.apache.hadoop.mapreduce.mapper.run(mapper。java:144)在org.apache.hadoop.mapred.maptask.runnewmapper(maptask。java:757)在org.apache.hadoop.mapred.maptask.run(maptask。java:339)在org.apache.hadoop.mapred.yarnchild$2.run(yarnchild。java:158)位于java.security.accesscontroller.doprivileged(本机方法)javax.security.auth.subject.doas(主题。java:415)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1478)在org.apache.hadoop.mapred.yarnchild.main(yarnchild。java:153)
非常感谢您的帮助。

u5rb5r59

u5rb5r591#

运行Map的节点上缺少外部jar。必须将其添加到缓存中才能使其可用。尝试:

DistributedCache.addFileToClassPath(new Path("pathToJar"), conf);

不确定是哪个版本 DistributedCache 已弃用,但从hadoop 2.2.0开始,您可以使用:

job.addFileToClassPath(new Path("pathToJar"));
zyfwsgd6

zyfwsgd62#

我试着在hadoop类路径中设置opencsv jar,但是没有成功。我们需要显式地复制类路径中的jar,这样才能工作。它确实对我有效。以下是我遵循的步骤:
我已经在hdp集群中完成了这项工作,我在hbase libs中复制了opencsv jar,并在运行jar之前将其导出
将externaljars复制到hdp库:
要运行opencsvjar:1.复制目录/usr/hdp/2.2.9.1-11/hbase/lib/和/usr/hdp/2.2.9.1-11/hadoop-yarn/lib中的opencsv jar


**sudo cp  /home/sshuser/Amedisys/lib/opencsv-3.7.jar /usr/hdp/2.2.9.1-11/hbase/lib/**

2.使用sudo chmod 777 opencsv-3.7.jar 3.list files ls-lrt授予文件权限
4.出口 hadoop classpath : hbase classpath 5.现在运行jar。它将获取opencsv jar并正确执行。

piv4azn7

piv4azn73#

我通过实现下面的toolrunner找到了另一种解决方法。通过这种方法,hadoop接受命令行选项。我们可以避免将文件添加到distributedcache的硬编码

public class FlightsByCarrier extends Configured implements Tool {

       public int run(String[] args) throws Exception {
         // Configuration processed by ToolRunner
         Configuration conf = getConf();

         // Create a JobConf using the processed conf
         JobConf job = new JobConf(conf, FlightsByCarrier.class);

         // Process custom command-line options
         Path in = new Path(args[1]);
         Path out = new Path(args[2]);

         // Specify various job-specific parameters     
         job.setJobName("my-app");
         job.setInputPath(in);
         job.setOutputPath(out);
         job.setMapperClass(MyMapper.class);
         job.setReducerClass(MyReducer.class);

         // Submit the job, then poll for progress until the job is complete
         JobClient.runJob(job);
         return 0;
       }

       public static void main(String[] args) throws Exception {
         // Let ToolRunner handle generic command-line options 
         int res = ToolRunner.run(new Configuration(), new FlightsByCarrier(), args);

         System.exit(res);
       }
     }
vs91vp4v

vs91vp4v4#

如果要将外部jar添加到hadoop类路径,那么最好将jar复制到hadoop正在查看的现有目录之一。在命令行上运行命令“hadoop classpath”,然后找到一个合适的文件夹并将jar文件复制到该位置,hadoop将从那里获取依赖关系。这不适用于cloudera等,因为您可能没有将文件复制到hadoop类路径文件夹的读/写权限。
看起来您也尝试了libjars选项,是否编辑了驱动程序类以实现工具接口?首先确保按如下所示编辑驱动程序类:

public class myDriverClass extends Configured implements Tool {

      public static void main(String[] args) throws Exception {
         int res = ToolRunner.run(new Configuration(), new myDriverClass(), args);
         System.exit(res);
      }

      public int run(String[] args) throws Exception
      {

        // Configuration processed by ToolRunner 
        Configuration conf = getConf();
        Job job = new Job(conf, "My Job");

        ...
        ...

        return job.waitForCompletion(true) ? 0 : 1;
      }
    }

现在编辑“hadoop jar”命令,如下所示:

hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file

现在让我们了解下面发生了什么。基本上,我们通过实现工具接口来处理新的命令行参数。toolrunner用于运行实现工具接口的类。它与genericoptionsparser一起工作,解析通用hadoop命令行参数并修改工具的配置。
在main()中调用 ToolRunner.run(new Configuration(), new myDriverClass(), args) -在使用给定的泛型参数进行分析之后,将按tool.run(字符串[])运行给定的工具。它使用给定的配置,如果为null,则构建一个配置,然后使用可能修改的conf版本设置工具的配置。
现在在run方法中,当我们调用getconf()时,我们得到了配置的修改版本。所以确保你的代码中有下面一行。如果您实现了其他所有功能,并且仍然使用configuration conf=new configuration(),则什么都不起作用。

Configuration conf = getConf();
sbtkgmzw

sbtkgmzw5#

我找到了一个非常简单的解决方案:以root身份登录:
cd/usr/lib查找-名称“opencsv.jar”
找到文件的位置。在我的例子中,我在/usr/lib/hive/lib/opencsv*.jar下找到了它
现在提交命令
hadoop类路径
结果显示了hadoop搜索jar文件的目录。选取一个目录并将opencsv*jar复制到该目录。
在我的情况下,成功了。

相关问题