hbase 试用记录

1.hbase的安装使用现成的docker镜像安装在远程服务器上,此处推荐一个大神的docker仓库,下面的GitHub仓库里面有各种大数据组件的dockerfile,拉取代码库后再到docker store 查看对应的镜像就可以启动各种大数据组件了。GitHub链接:https://github.com/HariSekhon/Dockerfiles
下面拉取hbase :docker pull harisekhon/hbase-dev镜像,然后下载对应的Dockerfile后进入dockerfile所在目录使用docker-compose up启动容器就可以使用了。

1.1启动发现报错 util.NativeCodeLoader: Unable to load native-hadoop library for your platform,一种方式是编译安装lib,另一种是指定或者忽略这个报错
---------------
Add below lines to hadoop-env.sh, it will fix
export HADOOP_HOME_WARN_SUPPRESS=1
export HADOOP_ROOT_LOGGER="WARN,DRFA"
---------------
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"
source ~/.bashrc

---------

2.hbase shell命令行简单使用,
使用./hbase shell进入命令行界面,然后使用输入:

------------------------------------------------------
查看版本信息,如果启动成功的话会显示hbase的版本信息:version 
列出HBase的所有表: list
验证表是否存在:exists 'demo2'
启用表 enable 'demo2'
验证表是否已启用:is_enabled 'demo2'
验证表是否被禁用 is_disabled 'demo2'
禁用表  disable "demo2"
查看表属性  desc 'demo2'
改变表: alter 'demo2' ......
从HBase中删除表:drop 'demo2'
创建带列族的表:create "demo2",{NAME=>"user_info_2",VERSIONS=>1},这个花括号里面的NAME必须是大写的,不然会报错。
建表语句可以查看 help "create"
创建分区表 create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']  
或者 create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' }
删除表要先禁用表:disable 'demo2',然后再drop 'demo2',命令行中的操作,表名和列名等都要使用引号括起来,不然会认为是系统命令。
创建命名空间(数据库), create_namespace 'db01',然后在命名空间中创建表 create "db01:table01",{NAME=>'address'},创建结果如下所示:
hbase(main):033:0> list
TABLE
db01:table01
project_info
2 row(s)
Took 0.0318 seconds
=> ["db01:table01", "project_info"]
-------------

给表插入数据, put 'db01:table01' ,'row01','address:province','yunnan' 命令中可以看出,put table,rowkey,columnfamily:column,value
查询数据  get 'db01:table01' ,'row01','address:province' 相比于插入 数据,就是把命令改为get 然后不需要指定值只需要指定查询那些列就行
查询全表,scan 'db01:table01',这个命令太凶残了,需要限制范围, scan 'db01:table01', {COLUMNS =>  'address:province' , LIMIT => 20}
scan 'db01:table01', { LIMIT => 20} ,这个可以加各种限制条件,比如{STARTROW => 'row2', ENDROW => 'row2'}
查询表中总记录条数 count 'db01:table01',
删除表中一行数据,deleteall  'db01:table01','row01',
删除一行中的一列数据,delete  'db01:table01','row01','address:city'
查看表中有多少行记录 count 'demo2'
禁用,删除和重新创建一个指定的表 truncate 'demo2'
------
hbase(main):051:0> put 'db01:table01' ,'row01','address:province','yunnan'
Took 0.0047 seconds
hbase(main):052:0>  put 'db01:table01' ,'row01','address:city','kunming'
Took 0.0078 seconds
hbase(main):053:0> get  'db01:table01' ,'row01'
COLUMN                          CELL
 address:city                   timestamp=1543680691932, value=kunming
 address:province               timestamp=1543680680608, value=yunnan
1 row(s)
Took 0.0399 seconds
hbase(main):054:0>
hbase(main):054:0> delete  'db01:table01','row01','address:city'
Took 0.0110 seconds
hbase(main):055:0>
-------------
查看表空间列表
hbase(main):062:0> list_namespace
NAMESPACE
db01
db02
default
hbase
4 row(s)
Took 0.0735 seconds
----------
describe_namespace 'db01' 查看表空间信息
drop_namespace 'db02' 删除表空间
---------------下面尝试使用用户权限控制,以下操作需要修改配置,默认是没有启用的---------------
<property>
     <name>hbase.security.authorization</name>
     <value>true</value>
</property>
<property>
     <name>hbase.coprocessor.master.classes</name>
     <value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
     <name>hbase.coprocessor.region.classes</name>
     <value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController</value>
</property>

------------------------
创建用户
grant userXXX RWCA;
删除用户revoke 'Tutorialspoint'
查看用户权限:user_permission ‘tablename’
hbase(main):073:0> grant 'user01','RWCA','db01:table01'

ERROR: DISABLED: Security features are not availableFor usage try 'help "grant"'
-------------------Python 代码--------------

#encoding=utf8

from thrift.transport import TSocket,TTransport
from thrift.protocol import TBinaryProtocol
from hbase import Hbase
from hbase.ttypes import ColumnDescriptor
from hbase.ttypes import Mutation,BatchMutation
from hbase.ttypes import Mutation

# thrift默认端口是9090
socket = TSocket.TSocket('192.168.99.100',9090)
socket.setTimeout(8000)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Hbase.Client(protocol)
socket.open()

tables = client.getTableNames()
print(tables) #['db01:table01', 'demo2', 'project_info']
client.getTableRegions('db01:table01')


# print(client.getTableNames())
column_data = client.get('db01:table01','row01','address:province')#获取具体行具体列的信息
print(type(column_data))
print(column_data[0].value)
print(column_data) #[TCell(timestamp=1543680680608L, value='yunnan')]

row_data = client.getRow('db01:table01','row01') #获取一行的全部信息
#获取多条数据
scanid = client.scannerOpen('tablepy','row01',['addr_info'])#如果列不存在会怎么样?NoSuchColumnFamilyException: Column family addre_info does not exist in region tablepy
# while(True):
#     result = client.scannerGet(scanid)
#     print(result)
#     if not result:
#         break


rows_data = client.scannerGetList(scanid,20)
for data in rows_data:
    print(data)
client.scannerClose(scanid)

print(row_data) #[TRowResult(columns={'address:province': TCell(timestamp=1543680680608L, value='yunnan')}, row='row01')]
column01 = ColumnDescriptor(name='user_info') # ColumnDescriptor(bloomFilterType='NONE', bloomFilterNbHashes=0, name='user_info', maxVersions=3, blockCacheEnabled=False, inMemory=False, timeToLive=-1, bloomFilterVectorSize=0, compression='NONE')
column02 = ColumnDescriptor('addr_info')
#hbase好像不支持使用Python创建预分区表
# client.createTable('tablepy',[column01,column02])
# print(client)
region_info = client.getTableRegions('tablepy')#查看表分区
table_info = client.getColumnDescriptors('tablepy')#查看表结构
print(region_info) # [TRegionInfo(startKey='', endKey='', version=1, id=1543752131747L, name='tablepy,,1543752131747.ccfa71e67b9732adb575129bf9e560eb.')]
print(table_info) # {'addr_info:': ColumnDescriptor(bloomFilterType='NONE', bloomFilterNbHashes=0, name='addr_info:', maxVersions=3, blockCacheEnabled=False, inMemory=False, timeToLive=2147483647, bloomFilterVectorSize=0, compression='NONE'), 'user_info:': ColumnDescriptor(bloomFilterType='NONE', bloomFilterNbHashes=0, name='user_info:', maxVersions=3, blockCacheEnabled=False, inMemory=False, timeToLive=2147483647, bloomFilterVectorSize=0, compression='NONE')}
#插入数据
mutation = Mutation(column='user_info:province',value='350000')
batchs = BatchMutation('row02',[mutation])
insert_resut = client.getRow('tablepy','row01')
#插入多条数据
# client.mutateRow('tablepy','row01',[mutation])
client.mutateRows('tablepy',[batchs]) #这个方法与上面mutateRow的区别在于,mutateRows可以一次插入多条记录,而mutateRow只能插入单条数据
print(insert_resut) # [TRowResult(columns={'user_info:province': TCell(timestamp=1543752270954L, value='350000')}, row='row01')]
client.deleteAll('tablepy','row01','addr_info') #删除指定指定行指定列的数据
client.deleteAllRow('tablepy','row01') #删除指定行的全部数据


socket.close() #用完要记得关闭


------------------java代码测试,未完待续-------------

测试代码时会遇上需要Hadoop Home的情况,需要下载安装Hadoop在Windows下的工具https://blog.csdn.net/lanwenbing/article/details/40783335

之后报找不到文件错误,手动配置文件位置

System.setProperty("hadoop.home.dir", "D:\\program\\hadoop-common-2.2.0-bin");

java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

再之后遇到连不上hbase master的问题通过将容器id添加到Windows的hosts文件就能连接上了


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值