繁体   English   中英

将外部jar设置为hadoop classpath

[英]Setting external jars to hadoop classpath

我试图将外部罐子设置为hadoop classpath但到目前为止没有运气。

我有以下设置

$ hadoop版本
Hadoop 2.0.6-alpha Subversion https://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_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar

我能看到上面的HADOOP_CLASSPATH已经被hadoop选中了

$ hadoop classpath
的/ 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-hdfs /.//:/ 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:正在运行的职位:job_1415115532989_0001 14/11/04 16:43:55 INFO mapreduce.Job:工作职位_1415115532989_0001以超级模式运行:false 14/11/04 16:43 :56 INFO mapreduce.Job:地图0%减少0%14/11/04 16:45:27 INFO mapreduce.Job:地图50%减少0%14/11/04 16:45:27 INFO mapreduce.Job:任务Id:attempt_1415115532989_0001_m_000001_0,状态:FAILED错误:java.lang。 ClassNotFoundException :au.com.bytecode.opencsv。 java.net.URLClassLoader $ java中的CSVParser $ java。在java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)java.net上的java.security.AccessController.doPrivileged(Native Method)中的CSV播放器(URLClassLoader.java:356)。 URLClassLoader.findClass(URLClassLoader.java:354)at java.lang.ClassLoader.loadClass(ClassLoader.java:425)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)at 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)at 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(Native Method)的javax.security.auth.Subject.doAs(Subject.java:415)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation。 java的:1 478)在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:153)

任何帮助都非常感谢。

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

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

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

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

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

我在HDP CLuster中完成了这个。我已经在hbase libs中复制了我的opencsv jar并在运行我的jar之前将其导出

将ExternalJars复制到HDP LIBS:

运行打开的CSV Jar: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 classpathhbase classpath

5.现在运行你的Jar.It将拿起opencsv jar并将正确执行。

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

看起来您也尝试过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.run(String [])给定的工具。 它使用给定的Configuration,或者如果它为null则构建一个Configuration,然后使用conf的可能修改版本设置Tool的配置。

现在在run方法中,当我们调用getConf()时,我们得到了Configuration的修改版本。 因此,请确保您的代码中包含以下行。 如果你实现了其他所有内容并仍然使用Configuration conf = new Configuration(),那么什么都行不通。

Configuration conf = getConf();

我通过实现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”

拿起文件的locatin。 就我而言>我在/usr/lib/hive/lib/opencsv*.jar下找到了它

现在提交命令

hadoop classpath

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

在我的情况下它工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM