假设我有这个RDBM表(Entity-attribute-value_model):
col1: entityID
col2: attributeName
col3: value
Run Code Online (Sandbox Code Playgroud)
我想使用HBase由于扩展问题.
我知道访问Hbase表的唯一方法是使用主键(游标).您可以获取特定键的游标,并逐个迭代行.
问题是,在我的情况下,我希望能够迭代所有3列.例如 :
所以我有一个想法是构建一个Hbase表来保存数据(表DATA,其中entityID作为主索引),以及2个"索引"表,其中一个以attributeName作为主键,另一个表示值
每个索引表将保存DATA表的指针列表(entityID).
这是一种合理的方法吗?或者是对Hbase概念的"滥用"?
HBase允许通过主键获取操作并在行范围内扫描(思考:游标).(如果你有二级指标的规模和需求,不要担心 - Lucene拯救!但这是另一篇文章.)
你知道Lucene怎么帮忙吗?
- Yonatan
Hbase文档清楚地表明,您应该将类似的列分组到列族中,因为物理存储是由列族完成的.
但是,将两个列族放在同一个表中是什么意思,而不是每个列组有单独的表?这种方式"分区"表更有意义,以及一个"宽"表工作得更好的情况下是否存在特定情况?
单独的表应该导致单独的"行区域",这在某些列族(作为一个整体)非常稀疏时可能是有益的.相反,何时将列族聚集在一起是否有利?
我知道StackOverflow上有一些关于REST和Thrift for HBase的帖子,但我想稍微关注一下性能问题.
我一直在使用Node.js中的以下库连接到HBase实例:
找出为什么我不会从Thrift网关得到响应的麻烦之后,我终于让两个脚本都运行了,结果如下(每个输出相当于1000个操作完成):
??[mt@Marcs-MacBook-Pro]?[~/Sources/node-hbase]
???? node hbase.js
hbase-write: 99ms
hbase-write: 3412ms
hbase-write: 3854ms
hbase-write: 3924ms
hbase-write: 3808ms
hbase-write: 9035ms
hbase-read: 216ms
hbase-read: 4676ms
hbase-read: 3908ms
hbase-read: 3498ms
hbase-read: 4139ms
hbase-read: 3781ms
completed
??[mt@Marcs-MacBook-Pro]?[~/Sources/node-hbase]
???? node thrift.js
hbase-write: 4ms
hbase-write: 931ms
hbase-write: 1061ms
hbase-write: 988ms
hbase-write: 839ms
hbase-write: 807ms
hbase-read: 2ms
hbase-read: 435ms
hbase-read: 562ms
hbase-read: 414ms
hbase-read: 427ms
hbase-read: 423ms
completed
??[mt@Marcs-MacBook-Pro]?[~/Sources/node-hbase]
????
Run Code Online (Sandbox Code Playgroud)
使用的脚本可以在这里找到:https://github.com/stelcheck/node-hbase-vs-thrift
我的问题是,是否有人注意到HB和Thrift之间的差异(或者甚至只是一般的任何应用程序/语言)?
最近我在我的集群中启用了kerberos,一切都运行良好,直到我的kerberos登录到期,比如12小时.此时我创建的任何连接,使用这些连接创建的任何表都会在我使用它们时抛出.这可能会使我的应用程序崩溃,具体取决于我如何处理它.
我不介意崩溃,因为我的应用程序是由滑块管理的,当它下降时会复活应用程序,但这只会在HBase被"使用"时发生(即我在一个现在陈旧的桌子上调用方法连接)可能是由用户交互引起的,这会导致用户体验不佳.
我不希望身份验证实现细节遍及我的应用程序,也不希望更频繁地创建连接对象,因为这是一个代价高昂的操作,会产生大量的RPC调用(zookeeper元数据位置开始).
有没有一个共同的策略(最好是在HBase客户端中内置)来管理kerberos身份验证到期并在发生这种情况时更新HBase连接/表?
我正在使用这个代码示例http://www.vidyasource.com/blog/Programming/Scala/Java/Data/Hadoop/Analytics/2014/01/25/lighting-a-spark-with-hbase来读取hbase使用Spark的表只有通过代码添加hbase.zookeeper.quorum的唯一更改,因为它没有从hbase-site.xml中选择它.
Spark 1.5.3 HBase 0.98.0
我正面临着这个错误 -
java.lang.IllegalAccessError: com/google/protobuf/HBaseZeroCopyByteString
at org.apache.hadoop.hbase.protobuf.RequestConverter.buildRegionSpecifier(RequestConverter.java:921)
at org.apache.hadoop.hbase.protobuf.RequestConverter.buildGetRowOrBeforeRequest(RequestConverter.java:132)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1520)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegionInMeta(ConnectionManager.java:1294)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1128)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1111)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1070)
at org.apache.hadoop.hbase.client.HTable.finishSetup(HTable.java:347)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:201)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:159)
at test.MyHBase.getTable(MyHBase.scala:33)
at test.MyHBase.<init>(MyHBase.scala:11)
at $line43.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.fetch(<console>:30)
at $line44.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:49)
at $line44.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:49)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:370)
at scala.collection.Iterator$class.foreach(Iterator.scala:742)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1194)
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:59)
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:104)
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:48)
at scala.collection.TraversableOnce$class.to(TraversableOnce.scala:308)
at scala.collection.AbstractIterator.to(Iterator.scala:1194)
at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:300)
at scala.collection.AbstractIterator.toBuffer(Iterator.scala:1194)
at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:287)
at scala.collection.AbstractIterator.toArray(Iterator.scala:1194)
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$12.apply(RDD.scala:905)
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$12.apply(RDD.scala:905)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1848)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1848)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:88)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at …Run Code Online (Sandbox Code Playgroud) 2017-04-29 14:24:14,135 ERROR [B.fifo.QRpcServer.handler=49,queue=1,port=16020] ipc.RpcServer:
Unexpected throwable object java.lang.IllegalStateException:
Invalid currTagsLen -32712. Block offset: 3707853, block length: 72841, position: 0 (without header).
at org.apache.hadoop.hbase.io.hfile.HFileReaderV3$ScannerV3.checkTagsLen(HFileReaderV3.java:226)
Run Code Online (Sandbox Code Playgroud)
我的应用程序正在更新计数器(使用增量),但我看到了这个问题.有人能告诉我这意味着什么以及如何解决它?
hbase(main):008:0> scan 'table-name', {LIMIT=>1,STARTROW=>'ad:event_count:b'}
ROW COLUMN+CELL
ERROR: java.io.IOException: java.lang.IllegalStateException: Invalid currTagsLen -32701. Block offset: 272031, block length: 72441, position: 32487 (without header).
at org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.handleException(HRegion.java:5607)
at org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.<init>(HRegion.java:5579)
at org.apache.hadoop.hbase.regionserver.HRegion.instantiateRegionScanner(HRegion.java:2627)
at org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:2613)
at org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:2595)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:2282)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:32295)
Run Code Online (Sandbox Code Playgroud)
我不是没有使用任何标签.让我知道需要什么额外信息.
我有一个应用程序需要针对不同级别的聚合进行分析,这就是OLAP工作负载.我也想经常更新我的数据库.
例如,这是我的更新看起来像(架构看起来像:时间,目标,源IP,浏览器 - >访问)
(15:00-1-2-2010, www.stackoverflow.com, 128.19.1.1, safari) --> 105
(15:00-1-2-2010, www.stackoverflow.com, 128.19.2.1, firefox) --> 110
...
(15:00-1-5-2010, www.cnn.com, 128.19.5.1, firefox) --> 110
Run Code Online (Sandbox Code Playgroud)
然后我想问一下上个月从firefox浏览器访问www.stackoverflow.com的访问量是多少.
我知道Vertica系统可以以相对便宜的方式实现这一点(明智的性能和可扩展性,但可能不是成本方面的).我这里有两个问题.
1)是否有可以构建的开源产品来解决这个问题?特别是,蒙德里安系统的运作情况如何?(可扩展性和性能)2)是否有HBase或Hypertable基础解决方案(显然,裸HBase/Hypertable不能这样做)? - 但如果有基于HBase/Hypertable的项目,可扩展性可能不会成为IMO的问题)?
谢谢!
我是hadoop的新手.我有一个MapReduce作业,应该从Hdfs获取输入并将reducer的输出写入Hbase.我没有找到任何好的例子.
这是代码,运行此示例的错误是map中的Type mismatch,期望ImmutableBytesWritable收到IntWritable.
映射器类
public static class AddValueMapper extends Mapper < LongWritable,
Text, ImmutableBytesWritable, IntWritable > {
/* input <key, line number : value, full line>
* output <key, log key : value >*/
public void map(LongWritable key, Text value,
Context context)throws IOException,
InterruptedException {
byte[] key;
int value, pos = 0;
String line = value.toString();
String p1 , p2 = null;
pos = line.indexOf("=");
//Key part
p1 = line.substring(0, pos);
p1 = p1.trim();
key = Bytes.toBytes(p1);
//Value part
p2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Ubuntu上安装OpenTSDB,我正在关注此文档.但运行这些命令后:
git clone git://github.com/OpenTSDB/opentsdb.git
cd opentsdb
Run Code Online (Sandbox Code Playgroud)
运行此命令是提供以下控制台输出:
./build.sh
Run Code Online (Sandbox Code Playgroud)
控制台输出:
seed-admin@seedadmin-Inspiron-3847:~/Abharthan/opentsdb$ sudo ./build.sh
+ test -f configure
+ ./bootstrap
./bootstrap: 17: exec: autoreconf: not found
Run Code Online (Sandbox Code Playgroud)
有人可以建议问题是什么.