标签: hbase

实时查询/汇总数百万条记录 - hadoop?HBase的?卡桑德拉?

我有一个可以并行化的解决方案,但我(还)没有使用hadoop/nosql的经验,而且我不确定哪种解决方案最适合我的需求.理论上,如果我有无限的CPU,我的结果应该立即返回.所以,任何帮助将不胜感激.谢谢!

这就是我所拥有的:

  • 1000个数据集
  • 数据集键:
    • 所有数据集都具有相同的键
    • 100万把钥匙(后来可能是10或2000万)
  • 数据集列:
    • 每个数据集具有相同的列
    • 10到20列
    • 大多数列是我们需要聚合的数值(avg,stddev,并使用R来计算统计数据)
    • 一些列是"type_id"列,因为在特定查询中,我们可能只想包含某些type_ids
  • Web应用程序
    • 用户可以选择他们感兴趣的数据集(从15到1000)
    • 应用程序需要呈现:每列的密钥和聚合结果(avg,stddev)
  • 更新数据:
    • 可以添加,删除或替换/更新整个数据集
    • 能够添加列会很酷.但是,如果需要,可以只替换整个数据集.
    • 永远不要向数据集添加行/键 - 因此不需要具有大量快速写入的系统
  • 基础设施:
    • 目前两台机器每台24芯
    • 最终,想要能够在亚马逊上运行这个

我无法预先计算我的聚合值,但由于每个键都是独立的,因此应该可以轻松扩展.目前,我将这些数据放在postgres数据库中,其中每个数据集都在自己的分区中.

  • 分区很好,因为可以轻松添加/删除/替换分区
  • 数据库很适合基于type_id的过滤
  • 数据库不容易编写并行查询
  • 数据库适用于结构化数据,而我的数据不是结构化的

作为概念证明,我尝试了hadoop:

  • 为特定type_id为每个数据集创建了一个制表符分隔文件
  • 上传到hdfs
  • map:检索每个键的值/列
  • 减少:计算的平均值和标准偏差

从我粗略的概念验证中,我可以看到这将很好地扩展,但我可以看到hadoop/hdfs有延迟我已经读过它通常不用于实时查询(即使我没有用返回结果在5秒内回复用户).

关于如何处理这个问题的任何建议?我当时正考虑尝试HBase以获得感觉.我应该看看Hive吗?卡桑德拉?伏地魔?

谢谢!

hadoop hbase hive cassandra nosql

7
推荐指数
1
解决办法
7721
查看次数

hbase中是否有最大版本号?

如果我想插入表格:

row | fam:qualifier | timestamp | value
1 | foo:bar | 12345 | 2
1 | foo:bar | 12346 | 3
1 | foo:bar | 12347 | 2
1 | foo:bar | 12348 | 1
.
.
. 
1 | foo:bar | 123410 | 2
Run Code Online (Sandbox Code Playgroud)

我可以在hbase shell中指定获取特定行的最大版本数,但是当我指定实例'100'时它只返回4个版本......有没有最大值?

hbase

7
推荐指数
1
解决办法
1万
查看次数

Java(HBase)API:如何知道以字节为单位存储的值的数据类型

使用HBase Java API时,我有一行代码如下:

byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));
Run Code Online (Sandbox Code Playgroud)

假设我不知道它是否为此值的Int或String类型,我应该在它之间使用Byte.toInt(value)Byte.toString(value)正确打印值

这不是一个真正的HBase/Hadoop问题,而是一个Java问题,但我用Google搜索并找不到获取它的方法.有可能知道吗?

另一方面,从HBase Java API,我如何知道存在于系列中的给定值的数据类型:限定符?

谢谢!

java hbase

7
推荐指数
2
解决办法
4136
查看次数

HBase:什么是NotServingRegionException?

什么是NotServingRegionException在HBase的?

我的HBase集群一直运行良好,但在过去的几天里,一个像下面这样的奇怪错误消息不断弹出:

180次操作失败:NotServingRegionException:180次,服务器出现问题:xyza:60020,

我正在使用Thrift将数据插入HBase.看起来大多数数据插入正常,但作业仍然会抛出这个"错误".

在Internet上搜索显示此异常可能与区域拆分有关,但如何修复HBase或我的脚本以便不再抛出此异常?

java hadoop hbase database-connection nosql

7
推荐指数
1
解决办法
4023
查看次数

运行Hbase shell时出错

我的本地环境:OS X 10.9.2,Hbase 0.98.0,Java1.6

CONF/HBase的-site.xml中

 <property>
     <name>hbase.rootdir</name>
     <!--<value>hdfs://127.0.0.1:9000/hbase</value> need to run dfs -->
     <value>file:///Users/apple/Documents/tools/hbase-rootdir/hbase</value>
 </property>

 <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/Users/apple/Documents/tools/hbase-zookeeper/zookeeper</value>
 </property> 
Run Code Online (Sandbox Code Playgroud)

CONF/hbase-env.sh

export JAVA_HOME=$(/usr/libexec/java_home -d 64 -v 1.6)
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
Run Code Online (Sandbox Code Playgroud)

当我跑的时候

> list
Run Code Online (Sandbox Code Playgroud)

在Hbase shell中,我遇到以下错误:

2014-03-29 10:25:53.412 java[2434:1003] Unable to load realm info from SCDynamicStore
2014-03-29 10:25:53,416 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2014-03-29 10:26:14,470 ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 4 attempts
2014-03-29 10:26:14,471 WARN  [main] zookeeper.ZKUtil: hconnection-0x5e15e68d, quorum=localhost:2181, baseZNode=/hbase …
Run Code Online (Sandbox Code Playgroud)

shell hadoop hbase

7
推荐指数
2
解决办法
2万
查看次数

增加Hadoop 2中的Hive映射器数量

我从Hive创建了一个HBase表,我正在尝试对它进行简单的聚合.这是我的Hive查询:

from my_hbase_table 
select col1, count(1) 
group by col1;
Run Code Online (Sandbox Code Playgroud)

地图减少作业只产生2个映射器,我想增加它.使用普通地图缩小作业,我将配置纱线和映射器内存以增加映射器的数量.我在Hive中尝试了以下操作,但它不起作用:

set yarn.nodemanager.resource.cpu-vcores=16;
set yarn.nodemanager.resource.memory-mb=32768;
set mapreduce.map.cpu.vcores=1;
set mapreduce.map.memory.mb=2048;
Run Code Online (Sandbox Code Playgroud)

注意:

  • 我的测试集群只有2个节点
  • HBase表有超过5M的记录
  • Hive日志显示HiveInputFormat和一些splits = 2

java hadoop hbase hive hadoop2

7
推荐指数
2
解决办法
3万
查看次数

从Apache Storm bolt插入和删除HBase中的值的方法

我在Hadoop上运行的Storm拓扑配置为伪分布式模式.拓扑包含一个必须将数据写入Hbase的螺栓.我的第一个用于测试目的的execute方法是在我的bolt 方法中创建(和关闭)连接和写入数据.但是看起来我的本地机器上没有那么多资源来处理所有进入HBase的请求.在大约30个成功处理请求后,我在Storm工作日志中看到以下内容:

o.a.z.ClientCnxn [INFO] Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
o.a.z.ClientCnxn [INFO] Socket connection established to localhost/127.0.0.1:2181, initiating session
o.a.z.ClientCnxn [INFO] Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
o.a.h.h.z.RecoverableZooKeeper [WARN] Possibly transient ZooKeeper, quorum=localhost:2181, exception=org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid
Run Code Online (Sandbox Code Playgroud)

我的想法是通过为每个螺栓实例创建单个连接来减少HBase的连接数 - 在prepare方法中打开连接并关闭它cleanup.但是根据文档cleanup不保证在分布式模式下调用.

在此之后,我发现了Storm的Hbase框架 - storm-hbase.不幸的是,几乎没有关于它的信息,只是README在它的github回购.

  1. 所以我的第一个问题是使用storm-hbase进行Storm-Hbase集成是一个很好的解决方案吗?什么是最好的方法呢?

此外,我需要能够从HBase表中删除单元格.但我在storm-hbase doc中没有找到任何关于它的内容. …

hbase apache-storm

7
推荐指数
1
解决办法
1655
查看次数

Hbase需要多长时间才能恢复一个崩溃的RegionServer

看来Hbase RegionServer是单个节点,不像Cassandra那样有复制节点.我知道当一个RegionServer关闭时,HMaster会将崩溃的RS上的区域分配给其他RS.

但是新的RegionServer准备好服务崩溃的区域需要多长时间,如果花了太长时间,客户端不能等待太长时间,客户端会抛出异常甚至丢失的数据,对吧?

hbase

7
推荐指数
1
解决办法
1885
查看次数

HBase Cluster-无法通过phoenix客户端连接到hbase

我正在尝试通过Phoenix连接HBase集群.首先,我将Phoenix客户端和查询服务器jar文件复制到HMaster和HRegion lib文件夹,然后重新启动HBase服务.

服务器 - 通过/bin/queryserver.py启动Phoenix服务器.它运行正常.

客户 - AvaticaClientRuntimeException: Remote driver error: RuntimeException: java.sql.SQLException: No suitable driver found for "http://hacluster:8764".

记录详情

高可用性集群的Hbase-site.xml文件配置

<property>
  <name>hbase.master</name>
  <value>activenamenode:60000</value> 
</property> 
<property> 
  <name>hbase.rootdir</name> 
  <value>hdfs://hacluster/HBase</value>
</property> 
<property> 
  <name>hbase.cluster.distributed</name> 
  <value>true</value> 
</property> 
<property> 
  <name>hbase.zookeeper.quorum</name> 
  <value>zk1,zk2,zk3</value> 
</property> 
<property> <name>hbase.rpc.timeout</name> 
  <value>60000</value>
<property>
Run Code Online (Sandbox Code Playgroud)

它在伪节点集群上工作.但在启用HA的Hadoop集群中失败了.

在HA Cluster中,我为文件中的hbase.rootdir属性设置了活动的namenode url而不是HA nameservice hbase-site.xml.

hbase high-availability phoenix

7
推荐指数
1
解决办法
335
查看次数

尽管超时时间较短,但是稳定数量的HBase请求几乎完全需要5000毫秒(成功)才能完成。不知道为什么

我的客户端正在使用org.apache.hbase:hbase-client:2.1.0"并且服务器正在运行 1.2.0-cdh5.11.11.2.0-cdh5.11.0在替代测试集群中)。

我的客户端非常简单,它Connection在启动时实例化了一个类(由于Apache的建议,该类很繁重且线程安全,因此在线程之间共享)。然后,对于每个请求,它创建一个Table类并执行一个.exists(new Get(rowKey))操作。

像这样:

Connection conn = ConnectionFactory.createConnection(hbaseConfig);
Run Code Online (Sandbox Code Playgroud)

final Table table = conn.getTable(tableName);
return table.exists(new Get(context.getKey()));
Run Code Online (Sandbox Code Playgroud)

大多数情况下,最糟糕的情况是,到HBase的请求延迟时间为40ms。通常,它会在10毫秒左右完成。

但是,我们注意到偶尔的请求大约需要5000毫秒(5秒)的时间-但仍能成功完成!

偶尔,我的意思是每分钟大约1个请求(每分钟总共600个请求,所以速率很小)。但这很稳定。

这些几乎恰好在5s(+/- 100-200ms)左右。那是奇怪的部分。这不是一个峰值。

起初,我怀疑这是客户端的错误配置,我需要设置更严格的超时,因此我设置了以下内容:

hbaseConfig.set(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
hbaseConfig.set(HConstants.HBASE_CLIENT_PAUSE, "50");
hbaseConfig.set(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, "2000");
hbaseConfig.set(HConstants.HBASE_RPC_TIMEOUT_KEY, "1500");
hbaseConfig.set(HConstants.HBASE_RPC_SHORTOPERATION_TIMEOUT_KEY, "2000");
hbaseConfig.set(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, "1500");
hbaseConfig.set(HConstants.ZOOKEEPER_RECOVERABLE_WAITTIME, "2000");
hbaseConfig.set(HConstants.ZK_SESSION_TIMEOUT, "2000");
hbaseConfig.set("zookeeper.recovery.retry", "1");
hbaseConfig.set("zookeeper.recovery.retry.intervalmill","200");
hbaseConfig.set("hbase.ipc.client.socket.timeout.connect", "2000");
hbaseConfig.set("hbase.ipc.client.socket.timeout.read", "2000");
hbaseConfig.set("hbase.ipc.client.socket.timeout.write", "2000");
Run Code Online (Sandbox Code Playgroud)

换句话说,5000ms超过了全局超时时间(如中所述HConstants.HBASE_CLIENT_OPERATION_TIMEOUT)。

但是我有大约5秒钟才能完成的请求-并且成功完成了。

除了这些超时之外,我从使用更改AsyncConnectionConnection(无论如何都不需要使其异步),并且正在考虑仅GET拨打电话而不是exists

但是在这一点上,我很沮丧。我没有看到任何财产以及5s的来源。甚至没有超时,它实际上成功了!

有人遇到过吗?有什么方法可以让hbase-client发出指标吗?服务器端指标显示延迟没有增加(扫描指标)。

java performance hbase latency hbase-client

7
推荐指数
1
解决办法
232
查看次数