HBase-建表(普通建表及预分区建表)
package com.hbase.HBaseAdmin; import java.io.IOException; 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;
import org.apache.hadoop.hbase.client.RegionLocator;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair; /**
* @author:FengZhen
* @create:2018年9月6日
*/
public class CreateTable { private static String addr="HDP233,HDP232,HDP231";
private static String port="2181";
private static Connection connection; /**
* 获取连接
*/
public static void getConnection(){
Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum",addr);
conf.set("hbase.zookeeper.property.clientPort", port);
try {
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
} /*
* 关闭连接
*/
public static void close() {
/**
* close connection
**/
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
createTablePrePartition();
} /**
* 建表
*/
public static void createTable() {
getConnection();
try {
//获取admin实例
Admin admin = connection.getAdmin();
//创建表描述符
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("test_create"));
//添加列族描述符到表描述符中
HColumnDescriptor columnDescriptor = new HColumnDescriptor(Bytes.toBytes("info"));
tableDescriptor.addFamily(columnDescriptor);
//调用create方法
admin.createTable(tableDescriptor);
//检查表是否可用
boolean avail = admin.isTableAvailable(TableName.valueOf("test_create"));
System.out.println("Table available: " + avail);
} catch (IOException e) {
e.printStackTrace();
} finally {
close();
}
} //---------------------------------------通过预分区建表-----------------------------------------
/**
* Printing regions of table: test_pre_partition1
[1]start key: ,end key:1
[2]start key:1 ,end key:13
[3]start key:13 ,end key:25
[4]start key:25 ,end key:37
[5]start key:37 ,end key:49
[6]start key:49 ,end key:61
[7]start key:61 ,end key:73
[8]start key:73 ,end key:85
[9]start key:85 ,end key:100
[10]start key:100 ,end key:
Printing regions of table: test_pre_partition2
[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:
*/
/**
* 打印表中region信息
* @param tableName
* @throws IOException
*/
public static void printTableRegions(String tableName) throws IOException {
System.out.println("Printing regions of table: " + tableName);
//返回表中所有region的起始行键与终止行键列表
RegionLocator regionLocator = connection.getRegionLocator(TableName.valueOf(tableName));
//获取所有region的边界。
//第一个region的起始行键与最后一个region的终止行键都是空字节,这是HBase中默认的规则
//起始和终止行键都是已经计算好的,或是提供给用户的拆分键。
//需要注意的是,前一个region的终止行键与后一个region的起始行键是串联起来的
//终止行键不包含在前一个region中,而是作为起始行键包含在后一个region中。
Pair<byte[][], byte[][]> pair = regionLocator.getStartEndKeys();
for(int n = 0; n < pair.getFirst().length; n++) {
byte[] sk = pair.getFirst()[n];
byte[] ek = pair.getSecond()[n];
System.out.println("[" + (n + 1) + "]" +
"start key:" + (sk.length == 8 ? Bytes.toLong(sk) : Bytes.toStringBinary(sk)) +
" ,end key:" + (ek.length == 8 ? Bytes.toLong(ek) : Bytes.toStringBinary(ek)));
}
}
/**
* 通过预分区的方式建表
* @throws IOException
*/
public static void createTablePrePartition() {
getConnection();
String tableName = "test_pre_partition1";
String tableName2 = "test_pre_partition2";
try {
//获取admin实例
Admin admin = connection.getAdmin();
//创建表描述符
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
//添加列族描述符到表描述符中
HColumnDescriptor columnDescriptor = new HColumnDescriptor(Bytes.toBytes("info"));
tableDescriptor.addFamily(columnDescriptor);
//调用create方法,同时设置region边界。
//能够以特定数量拆分特定起始行键和特定终止行键,并创建表。
//startKey必须小于endKey,并且numRegions需要大于等于3,否则会抛出异常,这样才能确保region有最小的集合
//此方法使用Bytes.split()方法计算region边界,然后将计算得到的边界作为已拆分边界列表,并调用createTable(final HTableDescriptor desc, byte[][] splitKeys)方法
admin.createTable(tableDescriptor, Bytes.toBytes(1L), Bytes.toBytes(100L), 10);
printTableRegions(tableName); //创建表中region的拆分行键
byte[][] regions = new byte[][] {
Bytes.toBytes("A"),
Bytes.toBytes("D"),
Bytes.toBytes("G"),
Bytes.toBytes("K"),
Bytes.toBytes("O"),
Bytes.toBytes("T")
};
tableDescriptor.setName(TableName.valueOf(tableName2));
//使用新表明和region的已拆分键值列表作为参数调用建表命令
//使用已拆分行键的集合:使用了已经拆分好的region边界列表,因此结果都是与预期相符的。
admin.createTable(tableDescriptor, regions);
printTableRegions(tableName2);
} catch (IOException e) {
e.printStackTrace();
} finally {
close();
}
}
}
还有createTableAsync方法,这个方法使用表描述符和预拆分的region边界作为参数,并进行异步建表,但执行过程与createTable殊途同归
同步模式仅仅是异步模式的简单封装,增加了不断检查这个任务是否已经完成的循环操作。
HBase-建表(普通建表及预分区建表)的更多相关文章
- HBase 热点问题——rowkey散列和预分区设计
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作).大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响 ...
- Hbase预分区种子生成
提前生成Hbase预分区种子,在创建Hbase表时也进行相应的预分区,同时设置预分区的个数,预分区的范围对应Hbase监控页面的Region Server的start key与End key,从而使数 ...
- ASM时的OFM特性对影的建数据文件名称的影响及为SYSTEM表空间的数据文件使用别名
客户遇到个DG的问题,存储使用的ASM管理,有多个磁盘盘. 在主库创建数据文件,备库自己主动创建的数据文件都在同一磁盘组,而且在主库创建数据文件是指定的是类似**.DBF的名字,到备库也变成了使用AS ...
- HBase表预分区
在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,当这个一个region过大时就会进行split.如果在创建HBase的时候就进行预分区则会减 ...
- hbase源码系列(八)从Snapshot恢复表
在看这一章之前,建议大家先去看一下snapshot的使用.这一章是上一章snapshot的续集,上一章了讲了怎么做snapshot的原理,这一章就怎么从snapshot恢复表. restoreSnap ...
- 项目总结07:JS图片的上传预览和表单提交(FileReader()方法)
JS图片的上传预览和表单提交(FileReader()方法) 一开始没有搞明白下面这块代码的,今天有时间简单整理下 核心点:FileReader()方法 以下是代码(以JSP文件为例) <!DO ...
- 关于Hbase的预分区,解决热点问题
Hbase默认建表是只有一个分区的,开始的时候所有的数据都会查询这个分区,当这个分区达到一定大小的时候,就会进行做split操作: 因此为了确保regionserver的稳定和高效,应该尽量避免reg ...
- HBase Rowkey的散列与预分区设计
转自:http://www.cnblogs.com/bdifn/p/3801737.html 问题导读:1.如何防止热点?2.如何预分区?扩展:为什么会产生热点存储? HBase中,表会被划分为1.. ...
- rowkey散列和预分区设计解决hbase热点问题(数据倾斜)
Hbase的表会被划分为1....n个Region,被托管在RegionServer中.Region二个重要的属性:Startkey与EndKey表示这个Region维护的rowkey的范围,当我们要 ...
随机推荐
- 【BZOJ4176】Lucas的数论 莫比乌斯反演
[BZOJ4176]Lucas的数论 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)) ...
- MogoDB 分片键
MongoDB 根据分片键分割 collection 中的文档,然后分配到分片集群的成员中. 分片键可以是一个存在于每个文件中的索引字段或者复合索引字段. MongoDB 使用不同范围的分片键值来分割 ...
- 好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
Git commits历史是如何做到如此清爽的? - 知乎 https://www.zhihu.com/question/61283395/answer/186122300 尤雨溪 前端开发.Java ...
- 防sql注入之参数绑定 SQL Injection Attacks and Defense
http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...
- Java基础 - 函数与方法
java 是一门面向对象编程,其它语言中的函数也就是java中的方法 方法的基本使用方法 package com.demo7; /* * 函数/方法 * * 定义格式: * 修饰符 返回值类型 方法名 ...
- Oracle数据库使用Analyze提升sql性能
Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...
- 为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )
setlocale 配置地域化信息. 语法: string setlocale(string category, string locale); 返回值: 字符串 函数种类: 操作系统与环境 内容 ...
- SpringBoot + Thymeleaf + Validate验证
在开发业务时,不可避免的需要处理一些校验, 如果是写 if-else 这种代码去校验, 那会有一大段这样的代码.不过还好有个校验插件: javax.validation.validation-api ...
- 【24】response对象以及Python3中的一些变化
request.COOKIES 用来获取cookie response.write() 写的方法是response对象的 转自:博客园python3的变化 print 由一个语句(st ...
- 学习Hive和Impala必看经典解析
Hive和Impala作为数据查询工具,它们是怎样来查询数据的呢?与Impala和Hive进行交互,我们有哪些工具可以使用呢? 我们首先明确Hive和Impala分别提供了对应查询的接口: (1)命令 ...