【问题标题】:hbase and osgi - can't find hbase-default.xmlhbase 和 osgi - 找不到 hbase-default.xml
【发布时间】:2012-04-17 12:45:22
【问题描述】:

因为 hbase 不能作为 osgi-ified 包提供,但我设法使用 maven felix 插件(hbase 0.92 和相应的 hadoop-core 1.0.0)创建了包,并且两个包都在 OSGi 中启动 :)

hbase-default.xml 也被添加到生成的包中。在生成的 osgi-jar 中,当我打开它时,结构如下所示:

  • 组织/
  • 元信息
  • hbase-default.xml

这是通过<Include-Resource>@${pkgArtifactId}-${pkgVersion}.jar!/hbase-default.xml</Include-Resource>实现的

当我真正想连接到 hbase 时,问题就出现了。找不到 hbase-default.xml,因此我无法创建任何配置文件。

hbase osgi 包在另一个 osgi 包中使用,该包应该用于获取 hbase 连接和查询数据库。此 osgi-bundle 由 RCP 应用程序使用。

我的问题是,我必须将我的 hbase-default.xml 放在哪里,以便在启动包时可以找到它?或者为什么它没有意识到文件存在?

感谢您的任何提示。

--编辑

我找到了一个反编译器,因此我可以查看执行配置加载的源(hadoop-core,它不通过 maven 提供任何源),现在我看到使用了 Threads contextClassLoader(如果不可用配置类本身的classLoader),所以在我看来它找不到资源,但是,根据描述,它应该也检查父母(但是OSGi环境中的父母是谁?)?

我测试从应该使用 hbase 的 OSGi-bundle 中获取资源,我将 hbase-default.xml 添加到创建的 jar 文件中(见上文),当我获得 contextClassLoader 的线。当我进一步研究代码时,我意识到没有办法为 HBaseConfiguration 设置类加载器(虽然可以为“简单”hadoop-Configuration 设置类加载器,HBaseConfiguration 继承自,但创建过程HBaseConfiguration 不允许这样做,因为它只是在 create() 方法中创建一个新对象。

我真的希望你知道如何启动和运行它:)

【问题讨论】:

  • 您解决过这个问题吗?我面临同样的问题。我已经尝试了我能想到的一切,但无济于事。
  • 不,抱歉。决定为此部分切换到非 osgi

标签: maven hadoop osgi hbase


【解决方案1】:
Thread.currentThread().setContextClassLoader(HBaseConfiguration.class.getClassLoader());

确保在您的 OSGI bundle.hbase 中加载的 HBaseConfiguration 类将使用线程上下文类加载器,以便加载资源(hbase-default.xml 和 hbase-site.xml)。设置 TCCL 将允许您加载默认值并在以后覆盖它们。

【讨论】:

  • 这就是为我解决问题的原因。第一次尝试没有奏效。现在不知道为什么,如果是因为有其他干扰我然后删除了。
【解决方案2】:

如果 hbase-default.xml 在 CLASSPATH 中的 .jar 文件中,则该文件通常可以被 java 程序找到。

我已经阅读了 hbase 邮件列表。

检查您的 pom.xml: 在 'process-resource' 阶段,hbase-default.xml 的 '@@@VERSION@@@' 将被替换为实际的版本字符串。但是,如果此阶段配置设置为“target”,而不是“tasks”,则不会发生替换。 你可以看看你的 pom.xml,如果是的话,把标签更正一下。

【讨论】:

  • 首先,感谢您的回复。不幸的是,我目前无法仔细检查,但我很确定@@@VERSION@@@ 已替换为版本字符串。如果明天不是真的,我会纠正它。
【解决方案3】:

遇到了这个问题,实际上是通过将 hbase-site.xml 放在我调用 hbase 的包中来修复它,找到了建议 here

在 OSGi 中使用此组件:此组件在 OSGi 环境中功能齐全,但是,它需要用户执行一些操作。 Hadoop 使用线程上下文类加载器来加载资源。通常,线程上下文类加载器将是包含路由的包的包类加载器。因此,默认配置文件需要从包类加载器中可见。处理它的典型方法是在你的包根目录中保留一份 core-default.xml 的副本。该文件可以在 hadoop-common.jar 中找到。

【讨论】:

  • 感谢您的提示。你真的是指 hbase-site.xml 吗?或 hbase-default.xml ?
  • hbase-site.xml 虽然现在我在捆绑启动时遇到了 NoSuchElementException 的另一个问题......
  • 将 hbase-site.xml 添加到捆绑包的问题是在生产环境中我不知道 hbase 的配置。我不再在那个项目中,但我会使用 JMX 来设置所需的参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2016-04-08
相关资源
最近更新 更多