Вступление
Как всегда я буду сосредотачиваться на Karaf контейнеров на основе, например , Apache ServiceMix , Fuse ESB и т.д., но большинство вещей внутри этой должности , как правило , применимо ко всему OSGi время работы.
HBase и OSGi
- HBase не предоставляет метаданных OSGi, что означает, что вам нужно либо самостоятельно обернуть HBase, либо найти сторонний пакет для HBase.
- HBase поставляется в виде одной банки.
- Использует конфигурацию Hadoop.
- Внутри HBase нет монстров загрузки классов, так что вы не будете сильно укушены, когда будете пытаться использовать клиентский API внутри OSGi.
Поиск пакета для HBase
Создание дескриптора функции Karaf для HBase
<feature name="hbase" version="0.90.5" resolver="(obr)" start-level="50">
<feature>war</feature>
<bundle dependency="true">mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxws-api-2.2/1.9.0</bundle>
<bundle dependency="true">mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.saaj-api-1.3/1.9.0</bundle>
<bundle dependency="true">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1</bundle>
<bundle dependency="true">mvn:javax.mail/mail/1.4.5</bundle>
<bundle dependency="true">mvn:commons-codec/commons-codec/1.6</bundle>
<bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-beanutils/1.8.3_1</bundle>
<bundle dependency="true">mvn:commons-collections/commons-collections/3.2.1</bundle>
<bundle dependency="true">mvn:commons-digester/commons-digester/2.1</bundle>
<bundle dependency="true">mvn:commons-jxpath/commons-jxpath/1.3</bundle>
<bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jdom/1.1_4</bundle>
<bundle dependency="true">mvn:commons-lang/commons-lang/2.6</bundle>
<bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/1.7.0_6</bundle>
<bundle dependency="true">mvn:commons-configuration/commons-configuration/1.6</bundle>
<bundle dependency="true">mvn:commons-daemon/commons-daemon/1.0.5</bundle>
<bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-httpclient/3.1_7</bundle>
<bundle dependency="true">mvn:org.apache.commons/commons-math/2.2</bundle>
<bundle dependency="true">mvn:commons-net/commons-net/3.1</bundle>
<bundle dependency="true">mvn:org.codehaus.jackson/jackson-core-asl/1.9.7</bundle>
<bundle dependency="true">mvn:org.codehaus.jackson/jackson-mapper-asl/1.9.7</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jetty/6.1.26_4</bundle>
<bundle dependency="true">mvn:org.apache.zookeeper/zookeeper/3.3.5</bundle><bundle>
mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.hadoop-core/1.0.0_2</bundle>
<bundle>wrap:mvn:org.apache.hbase/hbase/0.90.5</bundle>
</feature>
Фактически этот дескриптор функции практически идентичен дескриптору функции, предоставленному последней версией Apache Camel . Одним из отличий является используемая версия Apache Hadoop . Я предпочел использовать в этом примере немного более низкую версию Apache Hadoop, которая, кажется, ведет себя немного лучше в OSGi.
Создание конфигурации клиента HBase внутри OSGi
Обходной путь должен установить hbase.defaults.for.version, чтобы соответствовать вашей версии HBase:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.defaults.for.version</name>
<value>${hbase.version}</value>
</property>
</configuration>
Подход, который спасет вас в большинстве случаев, заключается в использовании установки загрузчика классов пакета hbase в качестве загрузчика класса контекста потока перед созданием объекта конфигурации.
ClassLoader ocl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(HBaseConfiguration.class.getClassLoader());
Configuration conf = HBaseConfiguration.create();
} finally {
Thread.currentThread().setContextClassLoader(ocl);
}
Обратите внимание, что при использовании этого подхода вам не нужно включать hbase-site.xml в ваш пакет. Вам нужно будет настроить конфигурацию программно.
мысли
В следующие пару недель я собираюсь прокатиться на HBase по задней части верблюда , используя новый компонент camel-hbase внутри OSGi, так что следите за обновлениями.