赞
踩
环境统一:
zk:
hadoop:2.7.5
HBase:2.0.0
ssh软件:Bitvise
hbase依赖于hdfs,非关系型数据库
是一种稀疏表结构(稀疏表就是空行并不占用磁盘空间)
hbase当中所有数据都是byte[]类型
一个HRegionServer = 1个HLog+很多个region
1个region=很多个store模块组成
1个store模块 = 1个memoryStore+很多storeFile
HLog是为了解决数据丢失问题,HBase在读写时,不是直接存储磁盘,中间会有停留内存的一个时间段,在内存中可能发生断电丢失等等数据丢失问题,所以设置一个HLog模块,将数据写入文件中,在通过文件写入内存,在通过内存写入磁盘.当内存到磁盘过程出现问题导致数据丢失时,可以使用HLog文件对数据重建.
注意事项:HBase是依赖于HDFS的所以在安装前一定要保证hadoop和zk启动
通过ssh上传至node01节点下/export/software
//解压
tar -zxvf hbase-2.0.0-bin.tar.gz -C /export/servers/
使用Notepad++连接node01节点进行配置文件修改
export JAVA_HOME=/export/servers/jdk1.8.0_141
export HBASE_MANAGES_ZK=false
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://node01:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 --> <property> <name>hbase.master.port</name> <value>16000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>node01:2181,node02:2181,node03:2181</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/export/servers/zookeeper-3.4.9/zkdatas</value> </property> </configuration>
node01
node02
node03
cd /export/servers/hbase-2.0.0/conf
vim backup-masters
node02
cd /export/servers/
scp -r hbase-2.0.0/ node02:$PWD
scp -r hbase-2.0.0/ node03:$PWD
因为hbase需要读取hadoop的core-site.xml以及hdfs-site.xml当中的配置文件信息,所以我们三台机器都要执行以下命令创建软连接
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/core-site.xml /export/servers/hbase-2.0.0/conf/core-site.xml
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /export/servers/hbase-2.0.0/conf/hdfs-site.xml
vim /etc/profile
export HBASE_HOME=/export/servers/hbase-2.0.0
export PATH=:$HBASE_HOME/bin:$PATH
cd /export/servers/hbase-2.0.0
bin/start-hbase.sh
浏览器页面访问地址:
http://node01:16010/master-status
rowKey:行键.每一行数据都是使用行键进行标识的
columnFamily:列族,列族下面可以有多列
column:列的概念,每一个列都必须归属于某一个列族
timestamp:时间戳,每条数据都会有时间戳的概念
versionNum:版本号,每条数据都会有版本号,每次数据变化,版本号都会进行更新
创建一张HBase表最少需要两个条件:表名+列族名
注意:rowkey是我们在插入数据的时候自己指定的,列名 也是在我们插入数据的时候动态指定的,时间戳是插入数据的时候,系统自动帮我们生成的,versionNum是系统自动维护的
cd /export/servers/hbase-2.0.0
bin/hbase shell
list
创建user表,包含info、data两个列族
create 'user', 'info', 'data'
向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
scan "user"
get 'user', 'rk0001'
get 'user', 'rk0001', 'info'
get 'user', 'rk0001', 'info:name', 'info:age'
get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"} //ValueFilter值过滤器,过滤出二进制(binary)结果值等于的张三
获取user表中row key为rk0001,列标示符中含有a的信息
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} //QualifierFilter列过滤器,过滤出列名包含a的
查询user表中的所有信息
scan 'user'
查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
将user表的info列族版本号改为5
alter 'user', NAME => 'info', VERSIONS => 5
删除user表row key为rk0001,列标示符为info:name的数据
delete 'user', 'rk0001', 'info:name'
例如:显示服务器状态
hbase(main):058:0> status ‘node01’
显示HBase当前用户,例如:
hbase> whoami
显示当前所有的表
统计指定表的记录数,例如:
hbase> count ‘user’
展示表结构信息
检查表是否存在,适用于表量特别多的情况
检查表是否启用或禁用
该命令可以改变表和列族的模式,例如:
为当前表增加列族:
hbase> alter ‘user’, NAME => ‘CF2’, VERSIONS => 2
为当前表删除列族:
hbase(main):002:0> alter ‘user’, ‘delete’ => ‘CF2’
禁用一张表/启用一张表
删除一张表,记得在删除表之前必须先禁用
禁用表-删除表-创建表 得到一个空白的表,也叫清空表操作
通过java程序实现对HBase数据库当中数据增删改差操作
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <!-- <verbal>true</verbal>--> </configuration> </plugin> </plugins> </build>
package cn.it.hbase.demo; 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.junit.Test; import java.io.IOException; public class HBaseOpaerte { /** * 创建habase表myuser,来有两个列族 */ @Test public void createTable() throws IOException { //1.设置conf Configuration conf = HBaseConfiguration.create(); //2.指定hbase的zk连接地址 conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181"); //3.连接hbase集群 Connection connection = ConnectionFactory.createConnection(conf); //4.获取管理员对象 Admin admin = connection.getAdmin(); //5.通过管理员对象创建表 HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("myuser")); //5.1添加列族 HColumnDescriptor f1 = new HColumnDescriptor("f1"); HColumnDescriptor f2 = new HColumnDescriptor("f2"); //5.2将两个列族设置到hTableDescriptor里面去 hTableDescriptor.addFamily(f1); hTableDescriptor.addFamily(f2); //5.3创建表 admin.createTable(hTableDescriptor); admin.close(); connection.close(); } }
/** * 向表中添加数据 */ @Test public void addData() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181"); //获取连接 Connection connection = ConnectionFactory.createConnection(configuration); //获取表对象 Table myuser = connection.getTable(TableName.valueOf("myuser")); //添加数据 Put put = new Put("0001".getBytes()); put.addColumn("f1".getBytes(),"id".getBytes(), Bytes.toBytes(1)); put.addColumn("f1".getBytes(),"name".getBytes(), Bytes.toBytes("张三")); put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(18)); put.addColumn("f2".getBytes(),"addres".getBytes(), Bytes.toBytes("地球人")); put.addColumn("f2".getBytes(),"phone".getBytes(), Bytes.toBytes("12132432")); myuser.put(put); myuser.close(); }
在做查询之前先添加一批数据到表中,方便后续操作的演示
@Test public void insertBatchData() throws IOException { //获取连接 Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181"); Connection connection = ConnectionFactory.createConnection(configuration); //获取表 Table myuser = connection.getTable(TableName.valueOf("myuser")); //创建put对象,并指定rowkey Put put = new Put("0002".getBytes()); put.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(1)); put.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("曹操")); put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(30)); put.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("沛国谯县")); put.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("16888888888")); put.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("helloworld")); Put put2 = new Put("0003".getBytes()); put2.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(2)); put2.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("刘备")); put2.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(32)); put2.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put2.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("幽州涿郡涿县")); put2.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("17888888888")); put2.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("talk is cheap , show me the code")); Put put3 = new Put("0004".getBytes()); put3.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(3)); put3.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("孙权")); put3.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(35)); put3.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put3.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("下邳")); put3.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("12888888888")); put3.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("what are you 弄啥嘞!")); Put put4 = new Put("0005".getBytes()); put4.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(4)); put4.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("诸葛亮")); put4.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28)); put4.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put4.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("四川隆中")); put4.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("14888888888")); put4.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("出师表你背了嘛")); Put put5 = new Put("0005".getBytes()); put5.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5)); put5.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("司马懿")); put5.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(27)); put5.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put5.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("哪里人有待考究")); put5.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15888888888")); put5.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("跟诸葛亮死掐")); Put put6 = new Put("0006".getBytes()); put6.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5)); put6.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("xiaobubu—吕布")); put6.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28)); put6.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1")); put6.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("内蒙人")); put6.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15788888888")); put6.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("貂蝉去哪了")); List<Put> listPut = new ArrayList<Put>(); listPut.add(put); listPut.add(put2); listPut.add(put3); listPut.add(put4); listPut.add(put5); listPut.add(put6); myuser.put(listPut); myuser.close(); }
/** * 查询rowkey为003的人,所有列 */ @Test public void getData() throws IOException { //获取连接 configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); connection = ConnectionFactory.createConnection(configuration); //获取表 table = connection.getTable(TableName.valueOf("myuser")); Get get = new Get("0003".getBytes()); //限制查询范围,只查询f1列族, // get.addFamily("f1".getBytes()); //限制查询范围,只查询f1列族下的id列 // get.addColumn("f1".getBytes(),"id".getBytes()); //Result是一个对象,封装了所有的结果数据 Result result = table.get(get); //获取003的所以cell值 List<Cell> cells = result.listCells(); for (Cell cell : cells) { //获取列族名称 String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); //获取列名称 String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); if (familyName.equals("f1") && columnNmae.equals("age") || columnNmae.equals("id")) { int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value); } else { String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value); } } table.close(); }
/** * 安装rowkey进行范围扫描 * 扫描rowkey0004到0006的所以值 */ @Test public void scanRange() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("myuser")); Scan scan = new Scan(); //设置起始和结束的rowkey scan.setStartRow("0004".getBytes()); //这里把范围注释掉运行就是全表扫描 scan.setStopRow("0006".getBytes()); //返回多条数据都封装在ResultScanner中了 ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { List<Cell> cells = result.listCells(); for (Cell cell : cells) { String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){ int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); }else { String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); } } } }
/** * 使用rowFilter查询比0003小的所以的数据 */ @Test public void rowFileter() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("myuser")); Scan scan = new Scan(); //*****核心点****** //添加一个比较过滤器 //通过RowFilter过滤rowKey中比0003小的rowkey中所有值出来 RowFilter rowFilter = new RowFilter(CompareOperator.LESS, new BinaryComparator(Bytes.toBytes("0003"))); scan.setFilter(rowFilter); //列族过滤器 //查询比f2列族小的所有列族里面的数据 FamilyFilter f2 = new FamilyFilter(CompareOperator.LESS, new SubstringComparator("f2")); scan.setFilter(f2); //列过滤器 //只查询name列的值 QualifierFilter name = new QualifierFilter(CompareOperator.EQUAL, new SubstringComparator("name")); scan.setFilter(name); //值过滤器 //查询所有列当中包含8的数据 ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("8")); scan.setFilter(valueFilter); //*****核心点****** //返回的数据都封装在ResultScanner中,我们迭代遍历获取内容 ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { List<Cell> cells = result.listCells(); for (Cell cell : cells) { String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){ int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); }else { String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); } } } }
/** * 使用rowFilter查询比0003小的所以的数据 */ @Test public void rowFileter() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("myuser")); Scan scan = new Scan(); //*****核心点****** //添加一个专用过滤器 //单列值过滤器 //查询name值为 刘备 的数据 SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, "刘备".getBytes()); scan.setFilter(singleColumnValueFilter); //前缀过滤器 //查询以00开头的所有前缀的rowkey PrefixFilter prefixFilter = new PrefixFilter("00".getBytes()); scan.setFilter(prefixFilter); //多过滤器综合查询FilterList() //在上述两个过滤器实现完成的基础上,我们要使一个过滤器,拥有即是name为刘备,又rowkey是00开头的 FilterList filterList = new FilterList(singleColumnValueFilter, prefixFilter); scan.setFilter(filterList); //*****核心点****** //返回的数据都封装在ResultScanner中,我们迭代遍历获取内容 ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { List<Cell> cells = result.listCells(); for (Cell cell : cells) { String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){ int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); }else { String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value); } } } }
/** * 实现hbase的分页的功能 */ @Test public void habasePage() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("myuser")); int pageNum = 1; // int pageSize = 2; if(pageNum == 1){ Scan scan = new Scan(); //如果是查询第一页数据,就按照空来进行扫描 scan.withStartRow("".getBytes()); PageFilter pageFilter = new PageFilter(pageSize); scan.setFilter(pageFilter); //传入设置好的scan,对表进行扫描,返回的ResultScanner包含所扫描的数据 ResultScanner scanner = table.getScanner(scan); //迭代遍历得到数据 for (Result result : scanner) { byte[] row = result.getRow(); System.out.println(Bytes.toString(row)); } } }
/**
* 根据rowkey删除某一条数据
* @throws IOException
*/
@Test
public void deleteData() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
Delete delete = new Delete("0007".getBytes());
table.delete(delete);
}
/** * 删除表 * @throws IOException */ @Test public void deletTable() throws IOException { Configuration configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("myuser")); //获取管理员权限 Admin admin = connection.getAdmin(); //禁用表 admin.disableTable(TableName.valueOf("myuser")); //删除表 admin.deleteTable(TableName.valueOf("myuser")); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。