【问题标题】:Best way to access external jar on local disk访问本地磁盘上的外部 jar 的最佳方法
【发布时间】:2012-05-04 09:45:14
【问题描述】:

我是 java 新手,所以这可能是一个幼稚的问题,我有一个外部 jar 文件,我想以编程方式移动到 Hadoop 文件系统,我有 API 可以这样做,但我只需要提供 jar 的路径文件。我不想使用硬编码路径(绝对和相对),也许如果我可以将它与我的项目一起包含,或者可能更好的东西,以便相同的代码在不同的机器上工作,相同的 jar 文件可能不会出现在不同机器上的相同位置,如果我要给出硬编码路径,那么我需要将文件显式复制到相同位置。


我已经为 Hive 编写了 UDF(jar 文件),它在我的磁盘上可用,现在要访问 Hive 中的 UDF,需要将 jar 添加到 HIVE 类路径,所以我想将 JAR 文件从我的本地系统复制到 HDFS,然后将 jar 从 HDFS 路径添加到 HIVE 类路径。

【问题讨论】:

  • 一种方法是为 Jar 获取 File,然后将其转换为 URL,然后使用 URLClassLoader 加载它。话虽如此,整个方法听起来是错误的。为什么资源不是通过通常的方法简单地构建/加载到 Hadoop 中?
  • 酷。将其添加为标签。顺便说一句-我还将您的第一条评论的症结编辑回了问题。你现在可以删除评论了。

标签: java hadoop user-defined-functions hive hdfs


【解决方案1】:

你可以把两个jar文件放在同一个目录下,路径是这样的

    String path = System.getProperty("user.dir") + File.separator + "name.jar";

System.getProperty("user.dir") 将返回用户的当前工作目录(第一个 jar 文件运行的位置),而 File.separator 是系统相关的默认名称分隔符。

【讨论】:

  • 这对我不起作用,这是我的情况,我有 Java 类库“ABC”,它将以编程方式复制外部 jar 文件。一个将有 Java 应用程序(主代码)“XYZ”将引用'ABC' jar 来调用'ABC' 功能,使用您建议的方法需要将jar 文件alomg 与'XYZ' 放在一起,这对我来说是不可行的
  • 我发现的一种方法是我可以做类似于此 File currentJarFilePath = new File .class.getProtectionDomain().getCodeSource().getLocation().getPath());字符串 currentDirectory = currentJarFilePath.getParent();之后可以使用相对路径来获得所需的外部 jar 文件,但我正在寻找是否有更好的方法来做到这一点。很抱歉造成混乱,我应该更具体一些
【解决方案2】:

要在 Hive 上使用 UDF,您必须将包含 jar 的 UDF 添加到分布式缓存中,以便 Hive 集群中的所有节点都可以使用它。 您可以使用如下语法来执行此操作:

add jar /path_to_jar/my_jar.jar

'/path_to_jar/' 是本地计算机上运行此命令的 jar 的路径。如果需要,可以在将 jar 添加到分布式缓存后,仅通过其名称从您的 MapReduce 或 Hive 代码中访问该 jar。

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 2016-04-04
    • 2011-05-21
    • 2012-03-26
    • 1970-01-01
    • 2021-04-07
    • 2013-08-16
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多