HBase建表函数createTable的几点说明

HBase建表函数提供了四个重载函数,分别是

void createTable(HTableDescriptor desc)
void createTable(HTableDescriptor desc, byte[] startKey,byte[] endKey, int numRegions)
void createTable(HTableDescriptor desc, byte[][] splitKeys)
 
void createTableAsync(HTableDescriptor desc, byte[][] splitKeys)
这四个函数的相同点是都是根据表描述符来创建表。其中一个不同是钱三个函数式同步创建(也就是表没创建完,函数不返回)。而带Async的这个函数式异步的(后台自动创建表)。

第一个函数相对简单,就是创建一个表,这个表没有任何region。后三个函数是创建表的时候帮你分配好指定数量的region(提前分配region的好处,了解HBase的人都清楚,为了减少Split,这样能节省不少时间)

第二个函数是使用者指定表的“起始行键”、“末尾行键”和region的数量,这样系统自动给你划分region。根据的region数,来均分所有的行键。这个方法的问题是如果你的表的行键不是连续的,那样的话就导致有些region的行键不会用到,有些region是全满的

所以HBase很人性的给了第三种和第四种方法。这两个函数是用户需要自己region的划分。这个函数的参数splitKeys是一个二维字节数据,行的最大数表示region划分数+1,列就表示region和region之间的行键。比如:

    byte[][] regions = new byte[][] { 
      Bytes.toBytes("A"),
      Bytes.toBytes("D"),
      Bytes.toBytes("G"),
      Bytes.toBytes("K"),
      Bytes.toBytes("O"),
      Bytes.toBytes("T")
    };
就表示有7个region(6+1),具体region表示的行键为:

[1] start key: , end key: A
[2] start key: A, end key: D
[3] start key: D, end key: G
[4] start key: G, end key: K
[5] start key: K, end key: O
[6] start key: O, end key: T
[7] start key: T, end key:
这个例子来源于HBase权威指南。

但是后三个函数,再建表时,如果region数过多,会报这个异常:

13/06/24 11:33:49 WARN client.HBaseAdmin: Creating x took too long
java.net.SocketTimeoutException: Call to cloudgis4/192.168.3.7:60000 failed on socket timeout exception: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/192.168.2.198:37133 remote=cloudgis4/192.168.3.7:60000]
	at org.apache.hadoop.hbase.ipc.HBaseClient.wrapException(HBaseClient.java:802)
	at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:775)
	at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:257)
	at $Proxy4.createTable(Unknown Source)
	at org.apache.hadoop.hbase.client.HBaseAdmin.createTableAsync(HBaseAdmin.java:405)
	at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:317)
	at GIS.Update.TestUpdate.testHBase(TestUpdate.java:181)
	at GIS.Update.TestUpdate.main(TestUpdate.java:267)
Caused by: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/192.168.2.198:37133 remote=cloudgis4/192.168.3.7:60000]
	at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:164)
	at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:155)
	at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:128)
	at java.io.FilterInputStream.read(Unknown Source)
	at org.apache.hadoop.hbase.ipc.HBaseClient$Connection$PingInputStream.read(HBaseClient.java:299)
	at java.io.BufferedInputStream.fill(Unknown Source)
	at java.io.BufferedInputStream.read(Unknown Source)
	at java.io.DataInputStream.readInt(Unknown Source)
	at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.receiveResponse(HBaseClient.java:539)
	at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.run(HBaseClient.java:477)
Exception in thread "main" org.apache.hadoop.hbase.client.RegionOfflineException: Only 0 of 1000 regions are online; retries exhausted.
	at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:355)
	at GIS.Update.TestUpdate.testHBase(TestUpdate.java:181)
	at GIS.Update.TestUpdate.main(TestUpdate.java:267)

具体就是说建表超时了,google了好久也没找到解决办法。

createTableAsync
但是用第四个函数,尽管报异常,但是还是在后台把表建完,region数也正好

HBase是一个分布式的、面向列的NoSQL数据库,其表的结构与关系型数据库不同。HBase表的建表语句可以通过HBase Shell或HBase API来执行。 下面是一个示例的HBase建表语句: ```shell create 'mytable', 'cf1', 'cf2' ``` 上述语句创建了名为"mytable"的表,并且指定了两个列族"cf1"和"cf2"。列族是表中列的集合,可以理解为逻辑上的分组。 在HBase中,列是没有预定义的模式的,因此可以根据需要动态添加列。对于每个列,可以存储多个版本的数据。 可以通过以下语句修改表的配置: ```shell alter 'mytable', NAME => 'cf1', VERSIONS => 3 ``` 上述语句将列族"cf1"的版本数设置为3。 另外,还可以通过HBase API来创建表。以下是一个Java API的示例: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; public class CreateTableExample { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); try (Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin()) { TableName tableName = TableName.valueOf("mytable"); HTableDescriptor tableDescriptor = new HTableDescriptor(tableName); HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("cf1"); HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("cf2"); tableDescriptor.addFamily(columnDescriptor1); tableDescriptor.addFamily(columnDescriptor2); admin.createTable(tableDescriptor); } } } ``` 上述代码使用HBase的Java API创建了名为"mytable"的表,并添加了两个列族"cf1"和"cf2"。 需要注意的是,上述示例只是简单的表结构创建示例,实际使用时,还需根据具体需求进行适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值