进入hbase shell
bin/hbase shell
Table
Columnfamily
Column01,column02
每条数据有唯一的标识符
Rowkey 主键
rowkey+columnfamily+column1+timestamp:value=>cell
插入一条数据
put 'user','100001','info:name','zhangsan'
表名、rowkey、列簇:列名、value(timestamp可以不指定)
Hbase里的存储都是字节数组
一个表里可以有很多个列簇
Hbase数据查询的三种方式:
1.依据rowkey查询,最快
get
2.范围查询
scan range 使用最多
3.全表扫描
scan
(get 'user','100001','info:name')
注: 按指定rowkey获取唯一一条记录:get方法。
按指定条件获取一批记录:scan方法。
实现条件查询功能使用的就是scan方式,scan在使用时有以下几点值的注意:
scan可以通过setCaching与setBatch方法提高速度(以空间换时间)
scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。
scan可以通过setFilter方法添加过滤器,这也是分页(性能差)、多条件查询的基础。
scan.setCacheBlocks()
Hadoop的MR运算中,Hbase可以作为输入数据源参与运算,其中作为HTable的迭代器Scan有几个使用技巧
涉及的方法如下:
public void setBatch(int batch)
public void setCaching(int caching)
public void setCacheBlocks(boolean cacheBlocks)
public void setBatch(int batch) :
为设置获取记录的列个数,默认无限制,也就是返回所有的列
public void setCaching(int caching):
每次从服务器端读取的行数,默认为配置文件中设置的值
public void setCacheBlocks(boolean cacheBlocks):
为是否缓存块,默认缓存,我们分内存,缓存和磁盘,三种方式,一般数据的读取为内存->缓存->磁盘,当MR的时候为非热点数据,因此不需要缓存
因此在MR的时候最好设置如下:
scan.setCacheBlocks(false);(读,不要缓存,设置为false)
scan.setCaching(200);//大了占内存,但是rpc少
scan.setBatch(6);//你需要的列
Hbase数据写入流程
put-->cell
0)wal( hdfs) 预写日志
1)memstore
2)storefile(hdfs)
Hbase的数据是按region划分的
当一个region越来越大就会划分为2个region
region的存储信息(startkey,endkey)
Hbase的底层的执行流程(put、get、scan)
client->zookeeper->hbase-meta->user-table->put\get\scan
Hbase的数据导入(常用)
file-》Hfile-》bulk load
Hbase的预分区,region
region划分,依赖于rowkey,要预估一些rowkey
hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']
10,20,30是rowkey
hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'
hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' }
hbase> # Optionally pre-split the table into NUMREGIONS, using
hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)
hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}
hbase> create 't1', {NAME => 'f1', DFS_REPLICATION => 1}
'db', {NAME => 't', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
IN_memory=>false in_memoru队列用于保存Hbase meta表的元数据信息,因此如果将数据量很大的表设置为true的话,可能会导致meta表缓存失效,进而对整个集群的性能产生影响,所以这个值一般都是true
RegionServer的大小一般设置大一些,10G或12G以上
Hive(impala)与Hbase集成
外部表
(场景)现在已经存在了一个Hbase表,需要对表中数据进行分析。(用hiveql)
管理表
创建表的时候,指定数据存储在hbase表中
学习笔记