鉴于以下HBase架构方案(来自官方常见问题解答)......
您如何为两个实体之间的多对多关联设计Hbase表,例如学生和课程?
我会定义两个表:
学生:学生ID学生数据(姓名,地址,...)课程(在此处使用课程ID作为列限定符)
课程:课程id课程数据(姓名,教学大纲,...)学生(在这里使用学生ID作为栏目限定词)
此模式使您可以快速访问查询,显示学生(学生表,课程系列)的所有课程,或所有课程的学生(课程表,学生家庭).
您如何满足这一要求:" 给我所有共享至少两门共同课程的学生 "?您可以在HBase中构建一个返回该集合的"查询",还是必须检索所有相关数据并在代码中自行处理?
有没有一种有效的方法来删除HBase中的多行或者我的用例气味是否不适合HBase?
有一个表格'chart',其中包含图表中的项目.行键的格式如下:
chart|date_reversed|ranked_attribute_value_reversed|content_id
有时我想为给定日期重新生成图表,所以我想删除从'chart | date_reversed_1'开始直到'chart | date_reversed_2'的所有行.有没有比为Scan找到的每一行发出删除更好的方法?要删除的所有行都将彼此接近.
我需要删除行,因为我不希望一个项目(一个content_id)有多个条目,如果它的ranking_attribute_value已被更改,它将具有多个条目(其更改是图表需要重新生成的原因).
作为一个HBase的初学者,所以也许我可能会滥用行以获得更好的列 - 如果你有设计建议,很酷!或者,也许图表在文件中更好地生成(例如,没有HBase用于输出)?我正在使用MapReduce.
我尝试以伪分布式模式运行HBase.但是在设置hbase-site.xml之后它不起作用.
每次我尝试在hbase shell中运行命令时都会收到此错误:
错误:org.apache.hadoop.hbase.ZooKeeperConnectionException:org.apache.hadoop.hbase.ZooKeeperConnectionException:org.apache.zookeeper.KeeperException $ ConnectionLossException:KeeperErrorCode = /Lbase的connectionLoss
我设置了ssh并确保所有端口都正确.
而且,我无法阻止hbase ./bin/stop-hbase.sh.我只得到以下输出.
stopping hbase........................................................
Run Code Online (Sandbox Code Playgroud) Google Cloud BigTable不支持协处理器:
不支持协处理器.您无法创建实现org.apache.hadoop.hbase.coprocessor接口的类.
https://cloud.google.com/bigtable/docs/hbase-differences
我可以理解协处理器需要在每个Tablet(RS)节点上部署客户代码(jar).尽管如此,端点协处理器对HBase应用程序至关重要,可确保在某些情况下的数据位置.Apache Phoenix等HBase扩展依赖于Observer协处理器来维护二级索引,因此缺乏协处理器支持看起来像是一个与我不兼容的主要领域.
未来是否可以支持协处理器,以及在BigTable平板电脑上执行自定义Java"存储过程"有哪些变通方法?
更新1: Apache Phoenix coprosessors列表:
我在EMR集群上运行HBase,我试图用本地机器上的Spark访问它上面的表.
它似乎连接到动物园管理员,但甚至不知道我寻找的表是否存在.
这是我的代码,以及hbase-site.xml文件和我得到的消息.
package org.apache.spark.examples
import org.apache.hadoop.fs.Path
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.spark._
object HBaseTestEMR {
def main(args: Array[String]) {
val sparkConf = new SparkConf().setAppName("HBaseTest").setMaster("local[4]")
val sc = new SparkContext(sparkConf)
val conf = HBaseConfiguration.create()
val table_name="empl"
conf.addResource(new Path("/home/spark/development/hbase/conf/hbase-site.xml"))
conf.set(TableInputFormat.INPUT_TABLE, table_name)
println("-------------1")
val admin = new HBaseAdmin(conf)
//println(admin.listTables())
println("-------------2")
if (admin.isTableAvailable(table_name)) println("la table existe")
else println("la table n'existe pas")
println("-------------3")
sc.stop()
}
}
Run Code Online (Sandbox Code Playgroud)
HBase的-site.xml中
<configuration>
<property><name>fs.hdfs.impl</name><value>emr.hbase.fs.BlockableFileSystem</value></property>
<property><name>hbase.regionserver.handler.count</name><value>100</value></property>
<property><name>hbase.zookeeper.quorum</name><value>ec2-52-26-***-***.us-west-2.compute.amazonaws.com</value></property>
<property><name>hbase.rootdir</name><value>hdfs://10.0.0.25:9000/hbase</value></property>
<property><name>hbase.cluster.distributed</name><value>true</value></property>
<property><name>hbase.tmp.dir</name><value>/mnt/var/lib/hbase/tmp-data</value></property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
和我得到的信息
15/06/10 12:00:28 INFO ZooKeeper: Client environment:java.io.tmpdir=/tmp …Run Code Online (Sandbox Code Playgroud) 我有运行hbase实例的应用程序连接,我们计划将应用程序移动到docker容器中,但保持hbase在docker之外运行.我可以让我的app在docker container中运行,在运行docker container时使用add-host选项连接到hbase,如下所示
docker run -dit --add-host hbasehost:xxx.xxx.xxx.xxx mydockerimage
Run Code Online (Sandbox Code Playgroud)
然而我们需要的是swarm的自动缩放功能,因为我们有多个服务要运行,如果我想运行我的应用程序作为docker服务而不是单个容器,实现这个的正确方法是什么,我找不到任何引用到"docker service"中的"--add-host"
使用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,我如何知道存在于系列中的给定值的数据类型:限定符?
谢谢!
我的本地环境: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) 我在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中没有找到任何关于它的内容. …
我的客户端正在使用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 ×5
java ×2
apache-spark ×1
apache-storm ×1
docker ×1
docker-swarm ×1
emr ×1
hbase-client ×1
latency ×1
mapreduce ×1
nosql ×1
performance ×1
phoenix ×1
shell ×1
sql ×1