3

因为 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-bundle 中使用,该包应该用于获取 hbase 连接和查询数据库。此 osgi-bundle 由 RCP 应用程序使用。

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

谢谢你的任何提示。

- 编辑

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

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

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

4

3 回答 3

2
Thread.currentThread().setContextClassLoader(HBaseConfiguration.class.getClassLoader());

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

于 2012-09-25T19:00:50.617 回答
1

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

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

检查您的pom.xml:在“进程资源”阶段,hbase-default.xml 的“ @@@VERSION@@@ ”将被实际版本字符串替换。但是,如果此阶段配置设置为“目标”而不是“任务”,则不会发生替换。你可以看看你的 pom.xml,如果是这样,请将标签更正。

于 2012-04-19T07:55:55.923 回答
0

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

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

于 2013-05-27T08:47:02.553 回答