10

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

我有以下设置

$ hadoop version
Hadoop 2.0.6-alpha Subversion https://git-wip-us.apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109 由 jenkins 于 2013-10-31T07:55Z 从源代码编译,校验和为 95e88b2a95d48dcdbd此命令是使用 /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 类路径
/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

堆栈跟踪

2004 年 14 月 11 日 16:43:23 信息 mapreduce.Job:运行作业:job_1415115532989_0001 14/11/04 16:43:55 信息 mapreduce.Job:作业 job_1415115532989_0001 在 uber 模式下运行:假 14/11/04 16:43 :56 INFO mapreduce.Job: map 0% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: map 50% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: 任务ID:尝试_1415115532989_0001_m_000001_0,状态:失败错误:java.lang。ClassNotFoundException:au.com.bytecode.opencsv。CSV解析器 在 java.net.URLClassLoader$1.run(URLClassLoader.java:366) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader .findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.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) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild .java:158) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:第1478章)

非常感谢任何帮助。

4

5 回答 5

3

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

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

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

job.addFileToClassPath(new Path("pathToJar")); 
于 2014-11-05T05:54:56.653 回答
2

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

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

将 ExternalJars 复制到 HDP LIBS:

运行 Open CSV Jar: 1.将 opencsv jar 复制到目录 /usr/hdp/2.2.9.1-11/hbase/lib/ 和 /usr/hdp/2.2.9.1-11/hadoop-yarn/lib

**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. 列出文件 ls -lrt

4.出口hadoop classpathhbase classpath

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

于 2016-06-02T10:54:06.200 回答
2

如果您要将外部 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 Interface来处理新的命令行参数。ToolRunner 用于运行实现 Tool 接口的类。它与GenericOptionsParser结合使用来解析通用 hadoop 命令行参数并修改工具的配置。

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

现在在 run 方法中,当我们调用 getConf() 时,我们会得到配置的修改版本。因此,请确保您的代码中有以下行。如果您实现其他所有内容并仍然使用 Configuration conf = new Configuration(),则没有任何效果。

Configuration conf = getConf();
于 2016-03-27T00:20:55.513 回答
0

我通过实现如下所示的 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);
       }
     }
于 2014-11-05T15:33:32.380 回答
0

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

cd /usr/lib 找到 . -名称“opencsv.jar”

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

现在提交命令

hadoop 类路径

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

就我而言,它起作用了。

于 2016-01-29T10:13:54.547 回答