将外部jar设置为hadoop类路径



我正在尝试将外部jar设置为hadoop类路径,但到目前为止没有成功。

我有以下设置

$hadoop版本
Hadoop 2.0.6-alphaSubversionhttps://git-wip-us.apache.org/repos/asf/bigtop.git-r ca4c88898f95aaa3fd85b5e9c194ffd647c2109詹金斯编译2013-10-31T07:55Z来自校验和为95e88b2a9589fa69d6d5c1dbd48d4e的源该命令是使用/usr/lib/hadop/hadoop-common-2.6-alpha.jar 运行的

Classpath

$echo$HADOOP_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar

我可以看到上面的HADOOP_CLASSPATH已经被HADOOP 选中

$hadoop类路径
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadop////home/tom/workspace/libs/opencsv-2.3.jar:/usr/lib/hoop-hdfs/./://usr/lib/hadoop-hdfs/lib/:/usr/lib/hadooop-hdfs///:/usr/lib/hadop-yarn/lib/:/usr/lib/hadoop-syarn///:/usr/lib/hadop-mapreduce/lib/:usr/lib/hadop mapreduce///

命令

$sudo hadoop jarFlightsByCarrier.jar FlightsByCarrier/user/root/1987.csv/user/root/result

我尝试了-libjars选项以及

$sudo hadoop jarFlightsByCarrier.jar FlightsByCarrier/user/root/1987.csv/user/root/result-libjars/home/tom/workspace/libs/opencsv-2.3jar

堆垛机

2004年11月14日16:43:23信息地图缩减。作业:正在运行作业:Job_14151155322989_00012004年11月14日16:43:55信息地图缩减。作业:作业Job_14151155322989_0001在uber模式下运行:false2004年11月14日16:43:56 INFO mapreduce。作业:映射0%减少0%2004年11月14日16:45:27信息地图缩减。作业:映射50%减少0%2004年11月14日16:45:27信息地图缩减。作业:任务Id:attempt_1415115322989_0001_m_000001_0,状态:失败错误:java.lang.ClassNotFoundException:au.com.bytecode.opencsv.CSVParser位于java.net.URLClassLoader$1.run(URLClassLoader.java:366)位于java.net.URLClassLoader$1.run(URLClassLoader.java:355)位于java.security.AccessController.doPrivileged(本机方法)位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)在sun.mic.Launcher$AppClassLoader.loadClass(Launcher.java:308)位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)在FlightsByCarrierMapper.map(FlightsByCarierMapper.java:19)在FlightsByCarrierMapper.map(FlightsByCarierMapper.java:10)网址:org.apache.hadop.mapreduce.Mapper.run(Mapper.java:144)网址:org.apache.hadop.mapred.MapTask.runNewMapper(MapTask.java:757)网址:org.apache.hadop.mapred.MapTask.run(MapTask.java:339)网址:org.apache.hadop.mapred.YarnChild$2.run(YarnChild.java:158)位于java.security.AccessController.doPrivileged(本机方法)位于javax.security.auth.Subject.doAs(Subject.java:415)网址:org.apache.hadop.security.UserGroupInformation.doAs(UserGroupInformation.java:1478)网址:org.apache.hadop.mapred.YarnChild.main(YarnChild.java:153)

非常感谢您的帮助。

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

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

不确定DistributedCache在哪个版本中被弃用,但从Hadoop 2.2.0开始,您可以使用:

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

如果您要将外部JAR添加到Hadoop类路径,那么最好将您的JAR复制到Hadoop正在查找的现有目录之一。在命令行上运行命令"Hadoop-classpath",然后找到合适的文件夹并将您的JAR文件复制到该位置,Hadoop将从中获取依赖项。这不适用于CloudEra等,因为您可能没有将文件复制到hadoop类路径文件夹的读/写权限。

看起来你也尝试了LIBJARs选项,你是否编辑了驱动程序类来实现TOOL接口?首先确保您编辑您的驱动程序类,如下所示:

    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

现在让我们了解下面发生了什么。基本上,我们通过实现TOOL接口来处理新的命令行参数。ToolRunner用于运行实现Tool接口的类。它与GenericOptionsParser结合使用,解析通用hadoop命令行参数并修改工具的配置。

在我们的Main()中,我们调用ToolRunner.run(new Configuration(), new myDriverClass(), args)-这在使用给定的泛型参数进行分析后运行给定的Tool-by-Tool.run(String[]),。它使用给定的配置,或者如果它为空,则构建一个配置,然后用可能修改的conf版本设置工具的配置。

现在在run方法中,当我们调用getConf()时,我们会得到修改后的Configuration版本因此,请确保您的代码中有以下行。如果您实现了其他一切,并且仍然使用Configurationconf=newConfiguration(),那么什么都不起作用

Configuration conf = getConf();

我尝试在hadoop类路径中设置opencsv jar,但没有成功。我们需要在类路径中显式地复制jar,这样才能工作。它确实对我有效。以下是我遵循的步骤:

我已经在HDP集群中完成了这项工作。我已经在hbase-libs中复制了我的opencsv jar,并在运行我的jar 之前将其导出

将ExternalJars复制到HDP LIBS:

要运行Open CSV Jar:1.复制目录/usr/hdp/2.2.9.1-11/hbase/lib/和/usr/hdp/2.29.1-11/hadoop-yan/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.jar3.列出文件ls-lrt

4.导出hadoop classpath:hbase classpath

5.现在运行你的Jar。它会拾取opencsv Jar并正确执行。

我通过实现下面的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);
       }
     }

我找到了一个非常简单的问题解决方案:以root身份登录:

cd/usr/lib查找-name"opencsv.jar"

拾取文件的定位器。在我的案例中>我在/usr/lib/hive/lib/opencsv*.jar 下找到了它

现在提交命令

hadoop类路径

结果显示了hadoop搜索jar文件的目录。选择一个目录并将opencsv*jar复制到该目录中。

就我而言,它奏效了。

相关内容

  • 没有找到相关文章

最新更新