Apache Karaf遇到Apache HBase

介绍

Apache HBase是模仿Google Bigtable的开源,分布式,版本化,面向列的商店。 如果您是普通读者,那么您可能已经知道Apache Karaf是什么,但是对于那些不是的读者:Apache Karaf是一个OSGi运行时,可以在任何OSGi框架之上运行,并为您提供一系列服务,强大的配置概念,可扩展的外壳等等。

由于Apache HBase 尚未准备好OSGi,因此开发OSGi应用程序的人通常很难理解如何在OSGi中使用HBase。

这篇文章解释了如何构建使用HBase的OSGi应用程序。 请注意,这篇文章不是关于在OSGi内运行HBase的部分,而是重点介绍如何在OSGi内使用客户端api。 与往常一样,我将重点介绍基于Karaf的容器,例如Apache ServiceMix , Fuse ESB等,但本文中的大多数内容通常适用于所有OSGi运行时。

HBase和OSGi

让我们仔细看一下HBase,并解释一下HBase与OSGi的关系。

坏消息

  • HBase不提供OSGi元数据,这意味着您需要自己包装HBase或为HBase找到第三方捆绑包。
  • HBase作为单个jar传入。
  • 使用Hadoop配置。

第一点很简单。 乍一看,第二点似乎并不是什么坏消息,但是如果您稍加思考,您就会意识到,当所有东西都放在一个罐子里时,它们并不是完全模块化的。 例如,客户端api位于同一个jar中,具有avro和thrift接口,即使您不需要它们,它们仍将在那里。 因此,该jar中包含的东西对于您的用例可能完全没用。

请注意,单个jar语句不引用诸如Hadoop或Zookeeper之类的依赖项。

作为HBase的事实取决于Hadoop配置加载机制,这也是个坏消息,因为在OSGi中运行时,某些版本的Hadoop有点发痒。

好消息

  • HBase内没有类加载怪物,因此,当您尝试在OSGi中使用客户端api时,您不会真正被咬。

挑战

因此,存在两种类型的挑战,第一种是为HBase找到或创建一个捆绑包,该捆绑包将具有对您的用例有意义的要求。 第二个是在OSGi中加载hbase客户端配置。

寻找HBase的捆绑包

据我所知, Apache ServiceMix Bundles提供了用于HBase的捆绑包 。 但是,当前提供的捆绑软件在所需软件包方面的需求比实际需要的要多(请参阅坏消息,第二点)。 提供具有更明智要求的捆绑包目前仍在进行中,希望将很快发布。

在此端口中,我将使用Pax Url Wrap Protocol 。 包装协议将为任何jar动态创建OSGi元数据。 此外,所有软件包导入都将标记为可选,因此您不必处理不必要的要求。 这可以帮助您入门,但是不建议在生产环境中使用。 因此,您可以在POC中使用它,但是当它需要投入生产时,最好使用适当的捆绑包。

为HBase创建Karaf功能描述符

经过试验后,我发现可以通过安装以下功能描述符中列出的捆绑软件在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中的表现似乎更好。

在OSGi中创建HBase客户端配置

本节中描述的内容可能会有所不同,具体取决于您使用的Hadoop jar版本。 我将尝试提供涵盖所有情况的通用解决方案。

通常,在配置hbase客户端时,只需要在类路径中保留一个hbase-site.xml。 在OSGi内部,这并不总是足够的。 某些版本的hadoop将设法获取该文件,而另一些则不会。 在许多情况下,hbase会抱怨当前版本与hbase-defatult.xml中的版本不匹配。

一种解决方法是将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 bundle classloader设置为线程上下文类加载器。

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

我之所以提出这个建议,是因为hbase将利用线程上下文类加载器来加载资源(hbase-default.xml和hbase-site.xml)。 设置TCCL将允许您加载默认值并在以后覆盖它们。

下面的代码片段显示了如何设置TCCL,以便直接从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无法找到正确的类加载器,则HBase内部类将重新创建配置,这可能会导致您遇到问题。

思想

HBase与几乎所有不提供对OSGi的即开即用支持的库一样。 如果您了解类加载的基础知识,则可以使其正常工作。 当然,无论您是否使用OSGi,了解类装入器都是迟早要使用的。

接下来的几周,我打算在OSGi中使用全新的camel-hbase组件乘坐HBase骑在骆驼的背面,敬请期待 。

编辑:原始帖子已被编辑,因为其中包含一个片段,我发现最好避免该片段(将HBase配置共享为OSGi服务)。

参考: Apache Karaf在Ioannis Canellos博客博客上与我们的JCG合作伙伴 Ioannis Canellos 见了Apache HBase 。

翻译自: https://www.javacodegeeks.com/2013/11/apache-karaf-meets-apache-hbase.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网架构成长之路(24)-Docker练习之Compose容器编排

0.前言  一开始学的之后&#xff0c;是想一步到位直接上Kubernetes(K8s)的&#xff0c;后面没想到&#xff0c;好像有点复杂&#xff0c;有些概念不是很懂。因此学习东西还是要循序渐进&#xff0c;慢慢来。先了解单机编排技术Docker Compose&#xff0c;了解一些技术细节及原…

CSS原理解析之模型篇

写在前面&#xff1a;尝试回答几个问题&#xff1a;什么是盒模型&#xff0c;控制盒模型的属性有哪些&#xff1f;Margin、Padding、Border、Width、Height这些属性改变/影响盒模型&#xff0c;但每个属性都会在所有元素上生效么&#xff1f;如果存在区别&#xff0c;那么和元素…

Quartz遇到的问题

本文首次发布于My Blog,作者张琦(Ian),转载请保留原文链接。 有状态和无状态 使用有状态&#xff08;StatefulJob&#xff09;还是无状态的任务&#xff08;Job&#xff09; 在 Quartz 中&#xff0c;基本来说&#xff0c;任务分为有状态和无状态两种。实现 Job 接口的任务缺省…

android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称&#xff0c;希望本文对大家学Android有所帮助。<在BaseActivity的onCreate方法中:public class BaseActivity extends AppCompatActivity { Override protected void onCreate(Nul…

RIP RETE时间获得PHREAKY

我刚刚完成了我称为PHREAK的新规则算法的一些高级文档&#xff0c;这是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平&#xff0c;但希望仍然很有趣。 它建立在ReteOO之上&#xff0c;非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用RETE算法并应…

Hadoop自学笔记(三)MapReduce简单介绍

1. MapReduce Architecture MapReduce是一套可编程的框架&#xff0c;大部分MapReduce的工作都能够用Pig或者Hive完毕。可是还是要了解MapReduce本身是怎样工作的&#xff0c;由于这才是Hadoop的核心&#xff0c;而且能够为以后优化和自己写做准备。 Job Client, 就是用户 Job …

洛谷 P2051 [AHOI2009]中国象棋 解题报告

P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关&#xff0c;在一个N行M列的棋盘上&#xff0c;让你放若干个炮&#xff08;可以是0个&#xff09;&#xff0c;使得没有一个炮可以攻击到另一个炮&#xff0c;请问有多少种放置方法。大家肯定很清楚&am…

VirtualDOM与diff(Vue实现)

写在前面 因为对Vue.js很感兴趣&#xff0c;而且平时工作的技术栈也是Vue.js&#xff0c;这几个月花了些时间研究学习了一下Vue.js源码&#xff0c;并做了总结与输出。文章的原地址&#xff1a;https://github.com/answershuto/learnVue。在学习过程中&#xff0c;为Vue加上了…

使用Java的RESTful Web服务

REST代表“代表性状态转移”&#xff0c;由Roy Fielding于2000年在其论文“建筑风格和基于网络的软件体系结构设计”中首次提出。 REST是一种建筑风格。 HTTP是一种协议&#xff0c;其中包含一组REST体系结构约束。 REST基础 REST中的所有内容都被视为资源。 每个资源都由UR…

android 基础应用程序,android应用程序基本实现(基础篇).ppt

《android应用程序基本实现(基础篇).ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《android应用程序基本实现(基础篇).ppt(22页珍藏版)》请在人人文库网上搜索。1、Android应用程序基本实现,复杂的应用,上节课&#xff0c;我们实现了一个基本的android的应用程序…

windows npm安装webpack

Webpack: Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。 参考下图&#xff1a; 安装Webpack: 1.首先需要安装node.js&#xff08;npm&#xff09; 下载地址&#xff1a;node.js dow…

ThreadLocal如何实现?

这是我上周的帖子的后续文章&#xff0c;在那篇文章中我解释了ThreadLocal用法的动机 。 从帖子中我们可以回想起&#xff0c;如果您希望每个线程都有一个独立初始化的变量副本&#xff0c;则ThreadLocal确实是一个很酷的概念。 现在&#xff0c;好奇的人可能已经开始问“我如何…

WPFの操作文件浏览框几种方式

WPFの操作文件浏览框几种方式 原文:WPFの操作文件浏览框几种方式方式1&#xff1a; 使用win32控件OpenFileDialog Microsoft.Win32.OpenFileDialog ofd new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt ".xml"; ofd.Filter "xml file|*.xml"; if…

为什么你应该尝试@reach/router

最近react-router的一个作者另外写了一个类react-router的组件 reach/router&#xff0c;尝试后感觉太棒了。如果你的项目只是web端的话我认为可以把你的react-router换掉了。下面是我到目前看到的所有非常好的点。 小&#xff0c;就4kb,压缩后比react-router小40kb左右。 更少…

android 浏览器 div穿透,解决IE 上重叠div 对 mouseover 事件的穿透方法之一

解决IE 下重叠div 对 mouseover 事件的穿透方法之一? ? ? ? 历经一天半的时间&#xff0c;我这前端的白痴终于想到了一个解决IE 下重叠div ?对 mouseover 事件的穿透方法。??现象&#xff1a; 两个并列关系的Div(没有父子关系)&#xff0c;但是两个Div在位置上面有重叠&…

类加载器工作机制

类加载器工作机制&#xff1a;1.装载&#xff1a;将Java二进制代码导入jvm中&#xff0c;生成Class文件。2.连接&#xff1a;a&#xff09;校验&#xff1a;检查载入Class文件数据的正确性 b&#xff09;准备&#xff1a;给类的静态变量分配存储空间 c&#xff09;解析&#xf…

webviewjavascriptbridge android ios,js与ios交互使用WebViewJavascriptBridge如何写多个函数

//js与webview交互初始化function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {return callback(WebViewJavascriptBridge);}if (window.WVJBCallbacks) {return window.WVJBCallbacks.push(callback);}window.WVJBCallbacks [callback];v…

JavaFX中的塔防

我想长时间使用我的游戏引擎来编写《塔防》游戏&#xff0c;但是由于另一个小组努力创建JavaFX《塔防》游戏&#xff0c;所以我认为我宁愿创建另一款游戏。 从邮件列表中&#xff0c;我了解到不再开发其他游戏。 因此&#xff0c;我决定尝试一下。 塔防是一款非常适合基于图块…

CSS pointer-events属性的使用

楔子 在前端的开发中&#xff0c;我们都是直接与用户接触&#xff0c;应该尽量让用户感到操作畅快愉悦&#xff0c;获得类似native的感觉。其中动画是最常用的方法。 这里的需求是&#xff0c;弹层的设计&#xff0c;这个弹层希望可以像 native 上的弹层一样&#xff0c;点击…

海思NB-IOT的SDK看门狗的使用

1. 看门狗需要喂狗&#xff0c;如果自己写的任务一直运行&#xff0c;那么空闲任务无法运行会导致看门狗复位&#xff0c;来看下看门狗的机制&#xff0c;首先系统启动的时候创建了空闲任务 在这个函数里面void vTaskStartScheduler( void )创建了下面的空闲任务 xReturn xTas…