hbase和osgi - 找不到hbase-default.xml

时间:2012-04-17 12:45:22

标签: maven hadoop osgi hbase

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

还将hbase-default.xml添加到生成的包中。在生成的osgi-jar中,当我打开它时,结构看起来像这样:

  • 组织/
  • META-INF
  • HBase的-default.xml中

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

实现的

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

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

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

感谢您的任何提示。

- 编辑

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

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

我真的希望你知道如何让它运行起来:)

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果hbase-default.xml位于CLASSPATH中的.jar文件中,那么通常可以通过java程序找到该文件。

我已阅读hbase邮件列表。

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

答案 2 :(得分:0)

面对这个问题,实际上通过将hbase-site.xml放入我调用hbase的包中来修复它,发现建议here

  

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