前置条件,必须学会hadoop和hive
Hbase描述
hbase是以hdfs为数据存储的,一种分布式,可扩展的nosql数据库
1.海量数据存储,表格可以容纳百亿行*百万列的数据
2.列式存储,动态的增加和删除列
3.准实时查询(毫秒内)
4.多版本,每一列的数据都有多个版本
5.高可靠性,支持多个master,当主master挂掉过后,其他备master变成主master
安装hbase
前提是hadoop和zookeeper都启动了
192.168.10.102 = hadoop102
192.168.10.103 = hadoop103
192.168.10.104 = hadoop104
102,103,104,一共3台机器
下面的配置,3台机器都要配置
下载hbase,解压到/opt/module目录下
https://archive.apache.org/dist/hbase/2.4.11/hbase-2.4.11-bin.tar.gz
cd /opt/module
mv hbase-2.4.11 hbase
配置环境信息
vi /etc/profile
export HBASE=/opt/module/hbase
export PATH=$PATH:$HBASE/bin
使得环境变量生效
source /etc/profile
修改hbase的环境信息,不使用hbase内部的zookeeper
jdk设置为自己的jdk路径
cd /opt/module/hbase/conf
vi hbase-env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/opt/module/jdk1.8.0_231
修改hbase-site.xml
cd /opt/module/hbase/conf
vi hbase-site.xml
<!-- hbase在hdfs上数据位置 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/hbase</value>
</property>
<!-- 搭建hbase分布式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zookeeper的主机 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property><property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
修改regionservers
cd /opt/module/hbase/conf
vi regionservers
hadoop102
hadoop103
hadoop104
在102机器上启动hbase
cd /opt/module/hbase/bin
./start-hbase.sh
访问下面的地址
http://hadoop102:16010/
hdfs下就会显示对应的目录的信息
jps进程下 102机器会显示HMaster和HRegionServer,其他机器只显示HRegionServer
shell命令
cd /opt/module/hbase/bin
hbase shell
创建命名空间
create_namespace 'aaa'
显示所有命名空间
list_namespace
创建表格student,后面2个参数是列族
create 'student','info','msg'
查看所有表格
list
也可以在hbase的控制台看到
修改表格 ,往student追加数据列族
alter 'student', { NAME => 'pwd', VERSIONS => 2 }
删除列族
alter 'student', 'delete' => 'pwd'
删除表格,需要2步,先进行标记,在删除
disable 'student'
drop 'student'
往表格的列族添加数据
student是表格
1003是行号,随便定义
info:age,info是列族,age随便定义列名
22 是age的值
put 'student','1003','info:age','22'
获取数据 表格,行号
get 'student','1003'
获取表格所有内容
scan 'student'
删除列的数据
delete 'student','1001','info:name'
删除这个表格的一行的所有数据
deleteall 'student','1002'
api
创建maven,注意:不是springboot
引入pom
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.11</version> </dependency>
获取连接
package com.example.demo7;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.http.config.ConnectionConfig;
import java.io.IOException;
class Solution {
public static Connection connection=null;
static {
//创建连接
try {
connection= ConnectionFactory.createConnection();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void close(){
if(connection!=null){
//关闭连接
try {
connection.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) throws IOException {
//获取连接
System.out.println(connection);
//关闭连接
close();
}
}
创建命名空间
package com.example.demo7;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import java.io.IOException;
public class Ddl {
public static Connection connection= Solution.connection;
/**
* 创建命名空间
* @param name
*/
public static void createNamespace(String name) throws IOException {
Admin admin=connection.getAdmin();
NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(name);
try {
admin.createNamespace(namespaceDescriptor.build());
} catch (IOException e) {
System.out.println("命名空间已存在");
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
createNamespace("bbb");
System.out.println("============");
Solution.close();
}
}
创建表格
package com.example.demo7;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Ddl {
public static Connection connection= Solution.connection;
/**
* 创建命名空间
* @param name
*/
public static void createNamespace(String namespace) throws IOException {
Admin admin=connection.getAdmin();
NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
try {
admin.createNamespace(namespaceDescriptor.build());
} catch (IOException e) {
System.out.println("命名空间已存在");
e.printStackTrace();
}
//关闭连接
admin.close();
}
/**
* 判断表格是否存在
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @throws IOException
*/
public static boolean tableExists(String namespace,String tableName) throws IOException {
Admin admin=connection.getAdmin();
boolean flag=false;
try {
flag=admin.tableExists(TableName.valueOf(namespace,tableName));
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
admin.close();
return flag;
}
/**
* 创建表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @param columnFamily 列族
* @throws IOException
*/
public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
Admin admin=connection.getAdmin();
//创建表格
TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
for (String o : columnFamily) {
//设置列族
ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
//设置列族的最大版本为3
c.setMaxVersions(3);
tableDescriptorBuilder.setColumnFamily(c.build());
}
admin.createTable(tableDescriptorBuilder.build());
//关闭连接
admin.close();
}
public static void main(String[] args) throws IOException {
//创建bbb命名空间下的 user表格
createTable("bbb","user","info","msg");
//判断表格是否存在
boolean aa=tableExists("bbb","user");
System.out.println(aa);
Solution.close();
}
}
修改表格
package com.example.demo7;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Ddl {
public static Connection connection= Solution.connection;
/**
* 创建命名空间
* @param name
*/
public static void createNamespace(String namespace) throws IOException {
Admin admin=connection.getAdmin();
NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
try {
admin.createNamespace(namespaceDescriptor.build());
} catch (IOException e) {
System.out.println("命名空间已存在");
e.printStackTrace();
}
//关闭连接
admin.close();
}
/**
* 判断表格是否存在
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @throws IOException
*/
public static boolean tableExists(String namespace,String tableName) throws IOException {
Admin admin=connection.getAdmin();
boolean flag=false;
try {
flag=admin.tableExists(TableName.valueOf(namespace,tableName));
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
admin.close();
return flag;
}
/**
* 创建表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @param columnFamily 列族
* @throws IOException
*/
public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
Admin admin=connection.getAdmin();
//创建表格
TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
for (String o : columnFamily) {
//设置列族
ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
//设置列族的最大版本为3
c.setMaxVersions(3);
tableDescriptorBuilder.setColumnFamily(c.build());
}
admin.createTable(tableDescriptorBuilder.build());
//关闭连接
admin.close();
}
/**
* 修改表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @param columnFamily 列族
* @param version 版本号
* @throws IOException
*/
public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
Admin admin=connection.getAdmin();
//获取表格
TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(descriptor);
//获取列族
ColumnFamilyDescriptor columnFamilyDescriptor=descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder=ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyDescriptor);
//修改版本号
columnFamilyDescriptorBuilder.setMaxVersions(version);
//对列族进行修改
tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
//对表格进行修改
admin.modifyTable(tableDescriptorBuilder.build());
admin.close();
}
public static void main(String[] args) throws IOException {
//修改ccc命名空间下的 user表格 的info列族 的版本号为4
modifyTable("ccc","user","info",4);
//关闭连接
Solution.close();
}
}
删除表格
package com.example.demo7;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Ddl {
public static Connection connection= Solution.connection;
/**
* 创建命名空间
* @param name
*/
public static void createNamespace(String namespace) throws IOException {
Admin admin=connection.getAdmin();
NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
try {
admin.createNamespace(namespaceDescriptor.build());
} catch (IOException e) {
System.out.println("命名空间已存在");
e.printStackTrace();
}
//关闭连接
admin.close();
}
/**
* 判断表格是否存在
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @throws IOException
*/
public static boolean tableExists(String namespace,String tableName) throws IOException {
Admin admin=connection.getAdmin();
boolean flag=false;
try {
flag=admin.tableExists(TableName.valueOf(namespace,tableName));
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
admin.close();
return flag;
}
/**
* 创建表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @param columnFamily 列族
* @throws IOException
*/
public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
Admin admin=connection.getAdmin();
//创建表格
TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
for (String o : columnFamily) {
//设置列族
ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
//设置列族的最大版本为3
c.setMaxVersions(3);
tableDescriptorBuilder.setColumnFamily(c.build());
}
admin.createTable(tableDescriptorBuilder.build());
//关闭连接
admin.close();
}
/**
* 修改表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @param columnFamily 列族
* @param version 版本号
* @throws IOException
*/
public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
Admin admin=connection.getAdmin();
//获取表格
TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(descriptor);
//获取列族
ColumnFamilyDescriptor columnFamilyDescriptor=descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder=ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyDescriptor);
//修改版本号
columnFamilyDescriptorBuilder.setMaxVersions(version);
//对列族进行修改
tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
//对表格进行修改
admin.modifyTable(tableDescriptorBuilder.build());
admin.close();
}
/**
* 删除表格
* @param namespace 命名空间 如果不传 就是默认的命名空间
* @param tableName 表格
* @throws IOException
*/
public static void deleteTable(String namespace,String tableName) throws IOException {
Admin admin=connection.getAdmin();
TableName tableName1=TableName.valueOf(namespace,tableName);
//先标记为不可用
admin.disableTable(tableName1);
//在删除表格
admin.deleteTable(tableName1);
admin.close();
}
public static void main(String[] args) throws IOException {
//删除表格
deleteTable("ccc","user");
//关闭连接
Solution.close();
}
}
添加表格内容
package com.example.demo7;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//添加表格内容
put("ccc","user","100","info","age","777");
Solution.close();
}
}
获取表格内容
package com.example.demo7;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
/**
* 获取内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @throws IOException
*/
public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Get g=new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
//读取所有的版本
g.readAllVersions();
//获取内容
Result result = table.get(g);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String v=new String(CellUtil.cloneValue(cell));
System.out.println(v);
}
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//获取表格内容
get("ccc","user","100","info","age");
Solution.close();
}
}
获取多行数据
package com.example.demo7;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
/**
* 获取内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @throws IOException
*/
public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Get g=new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
//读取所有的版本
g.readAllVersions();
//获取内容
Result result = table.get(g);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String v=new String(CellUtil.cloneValue(cell));
System.out.println(v);
}
//关闭表格
table.close();
}
/**
* 获取多行内容
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @throws IOException
*/
public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//获取表格内容
scan("ccc","user","100","102");
Solution.close();
}
}
过滤列的数据,只显示对应的列的数据
package com.example.demo7;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.FileFilter;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
/**
* 获取内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @throws IOException
*/
public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Get g=new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
//读取所有的版本
g.readAllVersions();
//获取内容
Result result = table.get(g);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String v=new String(CellUtil.cloneValue(cell));
System.out.println(v);
}
//关闭表格
table.close();
}
/**
* 获取多行内容
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @throws IOException
*/
public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 过滤列的数据
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
//添加过滤条件
FilterList filterList=new FilterList();
//查询等于值的数据
ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
Bytes.toBytes(qualifier),
//等于
CompareOperator.EQUAL
,Bytes.toBytes(value));
filterList.addFilter(columnValueFilter);
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//获取表格内容
filterScan("ccc","user","100","102","info","age","888");
Solution.close();
}
}
过滤数据,并显示整行数据
package com.example.demo7;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.FileFilter;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
/**
* 获取内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @throws IOException
*/
public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Get g=new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
//读取所有的版本
g.readAllVersions();
//获取内容
Result result = table.get(g);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String v=new String(CellUtil.cloneValue(cell));
System.out.println(v);
}
//关闭表格
table.close();
}
/**
* 获取多行内容
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @throws IOException
*/
public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 过滤列的数据
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
//添加过滤条件
FilterList filterList=new FilterList();
//查询等于值的数据
ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
Bytes.toBytes(qualifier),
//等于
CompareOperator.EQUAL
,Bytes.toBytes(value));
filterList.addFilter(columnValueFilter);
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 过滤数据,并显示整行数据
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void singleFilter(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
//添加过滤条件
FilterList filterList=new FilterList();
//查询等于值的数据
SingleColumnValueFilter columnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(family),
Bytes.toBytes(qualifier),
//等于
CompareOperator.EQUAL
,Bytes.toBytes(value));
filterList.addFilter(columnValueFilter);
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a+" ");
}
System.out.println();
}
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//获取表格内容 虽然查询的是age,但是也会把这一行的name也显示
singleFilter("ccc","user","100","102","info","age","999");
Solution.close();
}
}
删除数据
package com.example.demo7;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.FileFilter;
import java.io.IOException;
public class Dml {
public static Connection connection=Solution.connection;
/**
* 添加内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Put put=new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
//添加内容
table.put(put);
//关闭表格
table.close();
}
/**
* 获取内容
* @param namespace 命名空间
* @param tableName 表格
* @param rowKey 行号
* @param family 列族
* @param qualifier 列名
* @throws IOException
*/
public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Get g=new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
//读取所有的版本
g.readAllVersions();
//获取内容
Result result = table.get(g);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String v=new String(CellUtil.cloneValue(cell));
System.out.println(v);
}
//关闭表格
table.close();
}
/**
* 获取多行内容
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @throws IOException
*/
public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 过滤列的数据
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
//添加过滤条件
FilterList filterList=new FilterList();
//查询等于值的数据
ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
Bytes.toBytes(qualifier),
//等于
CompareOperator.EQUAL
,Bytes.toBytes(value));
filterList.addFilter(columnValueFilter);
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 过滤数据,并显示整行数据
* @param namespace 命名空间
* @param tableName 表格
* @param startRow 开始行
* @param stopRow 结束行 不包含这一行
* @param family 列族
* @param qualifier 列名
* @param value 值
* @throws IOException
*/
public static void singleFilter(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Scan scan=new Scan();
//开始行
scan.withStartRow(Bytes.toBytes(startRow));
//结束行 不包含这一行
scan.withStopRow(Bytes.toBytes(stopRow));
//添加过滤条件
FilterList filterList=new FilterList();
//查询等于值的数据
SingleColumnValueFilter columnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(family),
Bytes.toBytes(qualifier),
//等于
CompareOperator.EQUAL
,Bytes.toBytes(value));
filterList.addFilter(columnValueFilter);
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String a=new String(CellUtil.cloneValue(cell));
String b=new String(CellUtil.cloneFamily(cell));
String c=new String(CellUtil.cloneQualifier(cell));
String d=new String(CellUtil.cloneRow(cell));
System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a+" ");
}
System.out.println();
}
//关闭表格
table.close();
}
/**
* 删除数据
* @param namespace 命名空间
* @param tableName 表格
* @param family 列族
* @param qualifier 列名
* @param rowKey 行
* @throws IOException
*/
public static void delete(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
//获取表格
Table table=connection.getTable(TableName.valueOf(namespace,tableName));
Delete del=new Delete(Bytes.toBytes(rowKey));
//删除所有版本的数据
del.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier));
table.delete(del);
//关闭表格
table.close();
}
public static void main(String[] args) throws IOException {
//删除表格数据
delete("ccc","user","100","info","name");
Solution.close();
}
}
phoenix
安装部署
解压到102的/opt/module目录下
cd /opt/module
wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/phoenix-5.1.2/phoenix-hbase-2.4.0-5.1.2-bin.tar.gz --no-check-certificate
tar -zxvf phoenix-hbase-2.4.0-5.1.2-bin.tar.gz
mv phoenix-hbase-2.4.0-5.1.2-bin phoenix
把jar包拷贝到3台服务器上
cd /opt/module/phoenix
cp phoenix-server-hbase-2.4.0-5.1.2.jar /opt/module/hbase/lib/
在102机器上配置环境变量
vi /etc/profile
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PHOENIX_HOME/bin:$PATH
使得环境变量生效
source /etc/profile
在102机器 重启hbase
cd /opt/module/hbase/bin
./stop-hbase.sh
./start-hbase.sh
连接phoenix
cd /opt/module/phoenix/bin
./sqlline.py hadoop102,hadoop103,hadoop104:2181
!tables是查看所有表的意思
基础命令
创建表,指定单个列作为rowKey,就是id
create table student(
id varchar primary key,
name varchar,
age bigint,
addr varchar
);
表名会自动转换成大写,如果要小写展示,那么创建表的时候需在表名加双引号,例如:"student"
hbase默认的命名空间下,也显示了student表
指定多个列当做rowKey
就是把id和name当做联合主键
create table student1(
id varchar not null,
name varchar not null,
age bigint,
addr varchar
constraint my_pk primary key (id,name)
);
插入数据
upsert into student values('1001','zhangsan',10,'aaaaa');
视图映射
在hbase创建表格,phoenix创建视图,就能看到hbase插入的数据了
在hbase创建表格
create 'test','info1','info2'
添加数据
put 'test','1001','info1:name','zhangsan'
put 'test','1001','info2:address','aaaaa'
在phoenix创建视图映射
create view "test"
(
id varchar primary key,
"info1"."name" varchar,
"info2"."address" varchar
);
删除视图,但是不会删除hbase的数据
drop view "test";
表映射
在phoenix创建表
不使用字段优化 必须设置column_encoded_bytes=0;
create table "test"
(
id varchar primary key,
"info1"."name" varchar,
"info2"."address" varchar
)column_encoded_bytes=0;
删除表 会把hbase的数据也删除掉
drop table "test"
集成hive
在hive-site.xml追加zookeeper配置
cd /opt/module/hive/conf
vi hive-site.xml
<!-- 指定zookeeper的主机和端口号--> <property> <name>hive.zookeeper.quorum</name> <value>hadoop102,hadoop103,hadoop104</value> </property> <property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property>
在hive中创建表aaa
CREATE TABLE aaa(
empno int,
ename string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "
:key,
info:ename
")
TBLPROPERTIES ("hbase.table.name" = "aaa");
在hive添加数据
insert into aaa values('1','zhangsan');
在hbase查看aaa的数据
关联hbase已经存在的表aaa
在hive创建外部表bbb
CREATE EXTERNAL TABLE bbb(
empno int,
ename string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "
:key,
info:ename
")
TBLPROPERTIES ("hbase.table.name" = "aaa");
在Hive查询的时候,就可以拿到hbase的所有数据了