首先创建一个maven项目,然后导入以下依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.2.5</version>
</dependency>
<!-- 使用mr程序操作hbase 数据的导入 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-mapreduce</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-- phoenix 凤凰 用来整合Hbase的工具 -->
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.hbase与java客户端的连接
/**
*hbase的java客户端连接操作
*/
public class HbaseDemo {
public static void main(String[] args) throws Exception {
//创建配置对象
Configuration conf = HBaseConfiguration.create();
//配置zookeeper的连接对象,因为zookeeper存储了所有的hbase的储存信息,所以可以通过zookeeper操作hbase
conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
//获取hbase的连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//获取用户对象,可获得一系列对表和名称空间进行操作的方法
Admin admin = conn.getAdmin();
//获取表名对象
TableName[] tableNames = admin.listTableNames();
for (TableName tableName : tableNames) {
//可直接打印表名对象
//System.out.println(tableName);
//也可以通过表名对象将表名转换成字符串
String tbname = tableName.getNameAsString();
//通过表名对象获取它所在的名称空间名
String namespace = tableName.getNamespaceAsString();
System.out.println(namespace+"-"+tbname);
}
//获取表的对象,给他一个表名,返回一个该表的对象,可以对这个表内的数据进行操作
Table tb = conn.getTable(TableName.valueOf("tb_user2"));
tb.close();
admin.close();
conn.close();
}
}
2.将获取连接对象的方法封装起来方便调用
public class HbaseUtils {
/**
* 封装获取连接对象的方法
* @return
*/
public static Connection getConnection(){
//创建配置对象
Configuration conf = HBaseConfiguration.create();
//配置zookeeper的连接对象,因为zookeeper存储了所有的hbase的储存信息,所以可以通过zookeeper操作hbase
conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
//获取hbase的连接对象
Connection conn = null;
try {
conn = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
}
3.创建名称空间的方法
/**
*创建名称空间的方法
* @throws IOException
*/
public static void createNamespace() throws IOException {
//获取连接对象
Connection conn = HbaseUtils.getConnection();
//获取用户对象
Admin admin = conn.getAdmin();
//获取namespace的对象
NamespaceDescriptor doit = admin.getNamespaceDescriptor("doit");
//判断该名称空间是否存在,存在就先删除了再创建
if (doit!=null){
//删除名称空间需要先删除它里面的表,通过名称空间获取表的对象
TableName[] doits = admin.listTableNamesByNamespace("doit");
for (TableName tableName : doits) {
//遍历表,先禁用表,然后才能删除表
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
//删除名称空间
admin.deleteNamespace("doit");
}
//doit不存在,就创建一个doit,创建时,需要先获取名称空间的构建器,
NamespaceDescriptor.Builder doit1 = NamespaceDescriptor.create("doit");
//使用map集合给doit赋予属性
Map<String,String> map = new HashMap<>();
map.put("author","bo");
map.put("createTime",System.currentTimeMillis()+"");
doit1.addConfiguration(map);
//获取创建名称空间的对象NamespaceDescriptor
NamespaceDescriptor namespaceDescriptor = doit1.build();
//创建名称空间
admin.createNamespace(namespaceDescriptor);
admin.close();
conn.close();
}
4.创建表的方法
/**
* 创建表的方法
* @throws IOException
*/
public static void createTable() throws IOException {
Connection conn = HbaseUtils.getConnection();
Admin admin = conn.getAdmin();
//获取表的构建器
TableDescriptorBuilder tb_javaBuider = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_java"));
//创建表需要列族,获取列祖的构建器
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes());
//可以使用列族构建器给列族赋予属性,Versions最大版本为3个,数据有效时间为1小时
columnFamilyDescriptorBuilder.setMaxVersions(3);
columnFamilyDescriptorBuilder.setTimeToLive(60*60);
ColumnFamilyDescriptor cf1 = columnFamilyDescriptorBuilder.build();
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder2 = ColumnFamilyDescriptorBuilder.newBuilder("cf2".getBytes());
ColumnFamilyDescriptor cf2 = columnFamilyDescriptorBuilder2.build();
//将列族对象放入list集合中
List<ColumnFamilyDescriptor> list = new ArrayList<>();
list.add(cf1);
list.add(cf2);
//再将列族构建器set给表
tb_javaBuider.setColumnFamilies(list);
TableDescriptor build = tb_javaBuider.build();
//创建表
admin.createTable(build);
admin.close();
conn.close();
}
5.创建预分region表的方法
/**
* 创建预分region表的方法
* @throws IOException
*/
public static void createRegionTable() throws IOException {
//获取连接对象
Connection connection = HbaseUtils.getConnection();
Admin admin = connection.getAdmin();
//创建一个表的构建器
TableDescriptorBuilder tb_regionBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_region"));
//创建一个装列族的集合
ArrayList<ColumnFamilyDescriptor> cf = new ArrayList<>();
//通过列祖构建器,创建两个列族
ColumnFamilyDescriptor cf1 = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes()).build();
ColumnFamilyDescriptor cf2 = ColumnFamilyDescriptorBuilder.newBuilder("cf2".getBytes()).build();
//将列族放入集合中,并给到表的构建器
cf.add(cf1);
cf.add(cf2);
tb_regionBuilder.setColumnFamilies(cf);
//将构建器转为表的描述对象
TableDescriptor build = tb_regionBuilder.build();
//创建一个二维数组,设置三个切分点
byte[][] bytes = new byte[][]{"a3".getBytes(),"a5".getBytes(),"a8".getBytes()};
admin.createTable(build,bytes);
admin.close();
connection.close();
}
6.增加列族的方法
/**
* 增加列族的方法
* @throws IOException
*/
public static void addColumnFamily() throws IOException {
//获取连接对象
Connection connection = HbaseUtils.getConnection();
Admin admin = connection.getAdmin();
//创建一个列族描述器
ColumnFamilyDescriptor cf3 = ColumnFamilyDescriptorBuilder.newBuilder("cf3".getBytes()).build();
//添加列族的方法
admin.addColumnFamilyAsync(TableName.valueOf("tb_region"),cf3);
admin.close();
connection.close();
}
7.修改列族属性的方法
/**
* 修改列族属性的方法
* @throws IOException
*/
public static void modifyColumnFamily() throws IOException {
//获取连接对象
Connection connection = HbaseUtils.getConnection();
Admin admin = connection.getAdmin();
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder("cf3".getBytes());
columnFamilyDescriptorBuilder.setMaxVersions(5);
columnFamilyDescriptorBuilder.setTimeToLive(60*60*24*7);
ColumnFamilyDescriptor cf3 = columnFamilyDescriptorBuilder.build();
//修改列族属性的方法
admin.modifyColumnFamily(TableName.valueOf("tb_region"),cf3);
}```