Hadoop复习(3) Hbase

HBase 的特点,它适用于哪些情况,为何它能存储大数据



HBase 数据模型




HBase 系统结构包含哪些部分及主要部分的功能(理解)

HBase的服务器体系结构遵从简单的主从服务器架构,由RegionServer和HMaster服务器构成,另外ZooKeeper为HBase提供分布式协调服务,实现Hbase的高可用

Client

HMaster

ZooKeeper

RegionServer

WAL(HLog)

所有写操作都先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中

BlockCache

是一个读缓存,HBase将数据预读取到内存中,以提升读的性能.

HRegion

HRegion是一个表中的一个Region在一个HRegionServer中的表达
他的组成如下

Store

HBase 的三层寻址结构


HRegion 的缓存刷新条件


HRegionServer 故障处理方式

shell常用命令

查看服务器状态
status
查看版本
version
查看所有表
list
创建一个表 表名称+列族名称1+列族名称2...
create 'member086','member_id','address','info'
获得表的描述
describe 'member086'
添加一个列族
alter 'member086', 'id'
添加数据
在HBase shell中,我们可以通过put命令来插入数据。列簇下的列不需要提前创建,在需要时通过:来指定即可。添加数据如下:
语法: put '表名称','行键','列族:列名称','值'
put 'member086', 'debugo','id','11'
查看表数据
scan 'member086'
删除一个列族
alter 'member086', {NAME => 'member_id', METHOD => 'delete’}
删除列
通过delete命令,我们可以删除id为某个值的‘info:age’字段,接下来的get获取info:age字段的值,就会发现已经没有值了,命令如下:
delete 'member086','debugo','info:age'
删除整行的值,用deleteall命令:
deleteall 'member086','debugo'
查询表中有多少行,用count命令:
count 'member086'
获取一个id的所有数据:
get 'member086', 'Sariel'
扫描整个列簇
scan 'member086', {COLUMN => 'info'}
指定扫描其中的某个列
scan 'member086', {COLUMNS=> 'info:birthday'}

程序简单例子

修改数据

import java.io.IOException;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class modifyData {
	public static void modifyData(String tableName,String row,String column,String value) throws IOException{
		HbaseConnect.init();
		Table table=HbaseConnect.connection.getTable(TableName.valueOf(tableName));
		Put put=new Put(Bytes.toBytes(row));//Put是根据行键构造 这样就锁定该行 后续定位只需要给出列族或者列族:列名 即可
		String[] cols = column.split(":");//插入数据有两种情况
        //列族 或者 列族:列名 需要进行判断
        //addColumn3个参数(列族,列名,值)
		if(cols.length == 1){//对列族操作 列名为空 第二个参数用""表示
            put.addColumn(column.getBytes(),"".getBytes(), value.getBytes());
        }
        else{//对列族下的列名操作
            put.addColumn(cols[0].getBytes(), cols[1].getBytes(), value.getBytes());
        }
		table.put(put);//提交操作
		System.out.println("修改完毕!");
		table.close();
		HbaseConnect.close(); //关闭连接
	}
	public static void main(String[] args) throws IOException{
		modifyData.modifyData("Student", "s001", "S_Age", "18");
	}
}

删除数据

deleteRow(String tableName, String row)
删除表tableName中row指定的行的记录。
比较简单这个

import java.io.IOException;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class deleteRow {
	public static void deleteRow(String tableName, String row) throws IOException{
		HbaseConnect.init();
		Table table=HbaseConnect.connection.getTable(TableName.valueOf(tableName));
		Delete delete = new Delete(row.getBytes());
		table.delete(delete);
		System.out.println("删除完毕!");
		HbaseConnect.close(); //关闭连接
	}
	public static void main(String[] args) throws IOException{
		deleteRow.deleteRow("Student", "s002");
	}
}

遍历表

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class listTables {
	public static void listTables() throws IOException{
		HbaseConnect.init();
		List<TableDescriptor> list = HbaseConnect.admin.listTableDescriptors();//列出所有的表项
		for(TableDescriptor i:list) {
			System.out.println("表名 "+i.getTableName());
		}
		
		HbaseConnect.close(); //关闭连接
	}
	public static void main(String[] args) throws IOException{
		listTables.listTables();
	}
}

清空数据

统计行数

posted @ 2021-06-30 15:57  一个经常掉线的人  阅读(126)  评论(0)    收藏  举报