欢迎投稿

今日深度:

hbase的createTable,

hbase的createTable,


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

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

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

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

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

[java] view plain copy print?
  1. byte[][] regions = new byte[][] {   
  2.   Bytes.toBytes("A"),  
  3.   Bytes.toBytes("D"),  
  4.   Bytes.toBytes("G"),  
  5.   Bytes.toBytes("K"),  
  6.   Bytes.toBytes("O"),  
  7.   Bytes.toBytes("T")  
  8. };  
就表示有7个region(6+1),具体region表示的行键为: [java] view plain copy print?
  1. [1] start key: , end key: A  
  2. [2] start key: A, end key: D  
  3. [3] start key: D, end key: G  
  4. [4] start key: G, end key: K  
  5. [5] start key: K, end key: O  
  6. [6] start key: O, end key: T  
  7. [7] start key: T, end key:  
这个例子来源于HBase权威指南。

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

[java] view plain copy print?
  1. 13/06/24 11:33:49 WARN client.HBaseAdmin: Creating x took too long  
[java] view plain copy print?
  1. 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]  
  2.     at org.apache.hadoop.hbase.ipc.HBaseClient.wrapException(HBaseClient.java:802)  
  3.     at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:775)  
  4.     at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:257)  
  5.     at $Proxy4.createTable(Unknown Source)  
  6.     at org.apache.hadoop.hbase.client.HBaseAdmin.createTableAsync(HBaseAdmin.java:405)  
  7.     at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:317)  
  8.     at GIS.Update.TestUpdate.testHBase(TestUpdate.java:181)  
  9.     at GIS.Update.TestUpdate.main(TestUpdate.java:267)  
  10. 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]  
  11.     at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:164)  
  12.     at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:155)  
  13.     at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:128)  
  14.     at java.io.FilterInputStream.read(Unknown Source)  
  15.     at org.apache.hadoop.hbase.ipc.HBaseClient$Connection$PingInputStream.read(HBaseClient.java:299)  
  16.     at java.io.BufferedInputStream.fill(Unknown Source)  
  17.     at java.io.BufferedInputStream.read(Unknown Source)  
  18.     at java.io.DataInputStream.readInt(Unknown Source)  
  19.     at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.receiveResponse(HBaseClient.java:539)  
  20.     at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.run(HBaseClient.java:477)  
  21. Exception in thread "main" org.apache.hadoop.hbase.client.RegionOfflineException: Only 0 of 1000 regions are online; retries exhausted.  
  22.     at org.apache.hadoop.hbase.client.HBaseAdmin.createTable(HBaseAdmin.java:355)  
  23.     at GIS.Update.TestUpdate.testHBase(TestUpdate.java:181)  
  24.     at GIS.Update.TestUpdate.main(TestUpdate.java:267)  

具体就是说建表超时了,google了好久也没找到解决办法。 [java] view plain copy print?
  1. createTableAsync  
但是用第四个函数,尽管报异常,但是还是在后台把表建完,region数也正好

www.htsjk.Com true http://www.htsjk.com/hbase/42235.html NewsArticle hbase的createTable, Hbase建表函数提供了四个重载函数,分别是 [java] view plain copy print ? void  createTable(HTableDescriptor desc)   void  createTable(HTableDescriptor desc,  byte [] startKey, byte [] endKey, ...
相关文章
    暂无相关文章
评论暂时关闭