我有一个可以并行化的解决方案,但我(还)没有使用hadoop/nosql的经验,而且我不确定哪种解决方案最适合我的需求.理论上,如果我有无限的CPU,我的结果应该立即返回.所以,任何帮助将不胜感激.谢谢!
这就是我所拥有的:
我无法预先计算我的聚合值,但由于每个键都是独立的,因此应该可以轻松扩展.目前,我将这些数据放在postgres数据库中,其中每个数据集都在自己的分区中.
作为概念证明,我尝试了hadoop:
从我粗略的概念验证中,我可以看到这将很好地扩展,但我可以看到hadoop/hdfs有延迟我已经读过它通常不用于实时查询(即使我没有用返回结果在5秒内回复用户).
关于如何处理这个问题的任何建议?我当时正考虑尝试HBase以获得感觉.我应该看看Hive吗?卡桑德拉?伏地魔?
谢谢!
如果我想插入表格:
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 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,我如何知道存在于系列中的给定值的数据类型:限定符?
谢谢!
什么是NotServingRegionException在HBase的?
我的HBase集群一直运行良好,但在过去的几天里,一个像下面这样的奇怪错误消息不断弹出:
180次操作失败:NotServingRegionException:180次,服务器出现问题:xyza:60020,
我正在使用Thrift将数据插入HBase.看起来大多数数据插入正常,但作业仍然会抛出这个"错误".
在Internet上搜索显示此异常可能与区域拆分有关,但如何修复HBase或我的脚本以便不再抛出此异常?
我的本地环境: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) 我从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)
注意:
我在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回购.
此外,我需要能够从HBase表中删除单元格.但我在storm-hbase doc中没有找到任何关于它的内容. …
看来Hbase RegionServer是单个节点,不像Cassandra那样有复制节点.我知道当一个RegionServer关闭时,HMaster会将崩溃的RS上的区域分配给其他RS.
但是新的RegionServer准备好服务崩溃的区域需要多长时间,如果花了太长时间,客户端不能等待太长时间,客户端会抛出异常甚至丢失的数据,对吧?
我正在尝试通过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.
我的客户端正在使用org.apache.hbase:hbase-client:2.1.0"并且服务器正在运行 1.2.0-cdh5.11.1(1.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秒钟才能完成的请求-并且成功完成了。
除了这些超时之外,我从使用更改AsyncConnection为Connection(无论如何都不需要使其异步),并且正在考虑仅GET拨打电话而不是exists。
但是在这一点上,我很沮丧。我没有看到任何财产以及5s的来源。甚至没有超时,它实际上成功了!
有人遇到过吗?有什么方法可以让hbase-client发出指标吗?服务器端指标显示延迟没有增加(扫描指标)。
hbase ×10
hadoop ×4
java ×4
hive ×2
nosql ×2
apache-storm ×1
cassandra ×1
hadoop2 ×1
hbase-client ×1
latency ×1
performance ×1
phoenix ×1
shell ×1