标签: hbase

HBase中的高级查询

鉴于以下HBase架构方案(来自官方常见问题解答)......

您如何为两个实体之间的多对多关联设计Hbase表,例如学生和课程?

我会定义两个表:

学生:学生ID学生数据(姓名,地址,...)课程(在此处使用课程ID作为列限定符)

课程:课程id课程数据(姓名,教学大纲,...)学生(在这里使用学生ID作为栏目限定词)

此模式使您可以快速访问查询,显示学生(学生表,课程系列)的所有课程,或所有课程的学生(课程表,学生家庭).

您如何满足这一要求:" 给我所有共享至少两门共同课程的学生 "?您可以在HBase中构建一个返回该集合的"查询",还是必须检索所有相关数据并在代码中自行处理?

sql hadoop hbase nosql

8
推荐指数
1
解决办法
6343
查看次数

在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.

hadoop hbase mapreduce

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

HBase连接异常

我尝试以伪分布式模式运行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)

hadoop hbase

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

Google Cloud Bigtable协处理器支持

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列表:

  • GroupedAggregateRegionObserver
  • 索引
  • MetaDataEndpointImpl
  • MetaDataRegionObserver
  • ScanRegionObserver
  • SequenceRegionObserver
  • ServerCachingEndpointImpl
  • UngroupedAggregateRegionObserver

hbase phoenix google-cloud-bigtable

8
推荐指数
1
解决办法
837
查看次数

从安装在本地计算机上的Spark的EMR群集上运行的HBase读取数据

我在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)

hadoop hbase emr apache-spark apache-zookeeper

8
推荐指数
0
解决办法
1047
查看次数

Docker:连接到外部数据库

我有运行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 docker docker-swarm

8
推荐指数
1
解决办法
1388
查看次数

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 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万
查看次数

从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请求几乎完全需要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
查看次数