首页 > 大数据 > > Hadoop大数据入门(八)HBase
目录
目标
前面七篇内容,所有的操作都是针对文件,虽然是分布式的存储在HDFS里,又可以用MR或Spark这样的工具去处理,但现代的应用通常还是会需要稍微结构化的数据存储(当然,古代的应用也没有hadoop),就像基本每个应用都离不开数据库,分布式数据也一样。
我们这一篇介绍HBase,一个基于HDFS的分布式NoSQL数据库。
HBase的原理来自说谷歌的BigTable,不用去看论文,我们也能从名字看出来,这东西就是一个超级大表。
它确实是个大表的结构,可以有很多个列,而且是稀疏的,每一行说不好可以有哪些列的数据,行上没有的数据列不占用存储空间。
这样我们对于需要保存在数据库结构中的大数据,就可以保存在HBase里,它会帮我们分布式地存储在HDFS里。
Zookeeper
HBase必须要用Zookeeper来管理,这个我不想问为什么。但是HBase给了我们两种选择,一是用它自带的ZK,二是我们单独安装部署ZK让它用。
两者各有利弊,但是现实中我认为使用单独的ZK更有好处,缺点是麻烦点。
Zookeeper安装部署
我们可以到ZK官方网站去下载最新版本的ZK,我下载的是3.5.5:
wget http://archive.apache.org/dist/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz
tar -xzvf apache-zookeeper-3.5.5.tar.gz -C ~/hadoop/
mv ~/hadoop/apache-zookeeper-3.5.5 ~/hadoop/zookeeper注意,下载的是带有bin的压缩包。
修改环境配置文件~/.bashrc,让系统可以找到ZK:

使配置生效:
source ~/.bashrc
ZK的配置文件我们只修改一个。把zookeeper/conf里的zoo_sample.cfg复制一份名叫zoo.cfg并修改如下:

其中server.x是所有部署上的服务器,x是编号。后面的两个端口,第一个是用来各主节点与其他节点通信的端口,第二个是当主节点挂了的时候,需要重新“推举”一个新的主节点,就大家就会用这个端口来通信进行选举。这些端口在每台机器上可以不一样。
接下来把这个目录拷贝到所有服务器上:
scp -r ~/hadoop/zookeeper admin@bd2.sos:/home/admin/hadoop/
scp -r ~/hadoop/zookeeper admin@bd3.sos:/home/admin/hadoop/
scp -r ~/hadoop/zookeeper admin@bd4.sos:/home/admin/hadoop/
scp ~/.bashrc admin@bd2.sos:/home/admin/
scp ~/.bashrc admin@bd3.sos:/home/admin/
scp ~/.bashrc admin@bd4.sos:/home/admin/在每台机器上运行如下命令,使配置生效:
source ~/bashrc我们现在在每台服务器上都有了ZK目录,也有配置好的配置文件。但还有一个工作要做,就是让每台服务器知道自己是第几号(不明白为什么还需要这样,前面的配置文件里其实已经分配了编号)。
在每一台服务器上运行如下命令:
~/hadoop/zookeeper/bin/zkServer-initialize.sh --myid=0其中--myid=x中的x是这台机器对应的编号,需要与上面的配置文件中的server.x中的x相同。
接下来,我们启动ZK,需要在所有机器上运行启动命令,需要在所有的机器上运行:
~/hadoop/zookeeper/bin/zkServer.sh start停止ZK服务的命令,也需要在所有服务器上执行:
~/hadoop/zookeeper/bin/zkServer.sh stopHBase安装配置
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.4.10/hbase-1.4.10-bin.tar.gz
tar -zxvf hbase-1.4.10-bin.tar.gz
mv ./hbase-1.4.0-bin ~/hadoop/hbase上面路径和版本视情况而定,但注意用带bin的文件(和zookeeper累死)。我下载的是1.4.10版本,把整个hbase目录放在hadoop根目录下。
修改~/.bashrc文件,添加HBase路径:

source ~/.bashrc修改~/hadoop/hbase/conf/hbase-env.sh,查找HBASE_MANAGES_ZK,去掉前面注释,并将值改为false,意思是不使用hbase自带的zookeeper,因为咱们自己安装了自己的zookeeper。如下:
export HBASE_MANAGES_ZK=false并修改~/hadoop/hbase/conf/hbase-site.xml文件,如下:

修改~/hadoop/hbase/conf/regionservers,这个文件有点像hadoop里的workers文件,就是hbase中提供服务的节点,一般不在master上,但我把四个服务器都写在里面,也可以。
第一台机器上的hbase配置完成,我们将整个hbase目录拷贝到所有其他机器上:
scp -r ~/hadoop/hbase admin@bd2.sos:/home/admin/hadoop/
scp -r ~/hadoop/hbase admin@bd3.sos:/home/admin/hadoop/
scp -r ~/hadoop/hbase admin@bd4.sos:/home/admin/hadoop/
scp ~/.bashrc admin@bd2.sos:/home/admin/
scp ~/.bashrc admin@bd3.sos:/home/admin/
scp ~/.bashrc admin@bd4.sos:/home/admin/在每台机器上运行如下命令,使配置生效:
source ~/.bashrc在master上启动hbase,所有节点上都会自动启动:
~/hadoop/hbase/bin/start-hbase.sh
停止hbase服务,运行:
~/hadoop/hbase/bin/stop-hbase.sh
Hbase启动起来之后,可以通过网页查看其某个节点(RegionServer)的状态,比如访问:http://bd1.sos:16030

Shell访问HBase
访问Hbase有两种方法,一是通过hbase shell命令,二是通过编程。
在命令行运行命令:
hbase shell可以进入hbase shell命令行:

在这里我们可以直接访问存储在hbase数据库中的数据,想要退出这个shell,在里面执行exit命令即可。
hbase shell中的命令很容易理解,就像操作常规的数据库一样,不需要关心它们是怎么被存储在HDFS里的。比如:
list #列出所有的表
create #创建表
describe #查看表的详情
put #往表里插入数据或修改现有数据
get #查询表中的某条数据
scan #获取表中所有的数据
delete #删除表里的某条中的某些数据
deleteall #删除一个表中某一整行数据
disable #禁用一个表
drop #删除一个表,需要先禁用HBase会为每个数据(每行中的每个列的值)自动创建一个时间戳,每次添加或更新一个数据的时候,都其实会有一个新的数据产生,带着一个新的时间戳,系统会在需要的时候清理一些旧数据。





我们可以通过HDFS的网页查看HDFS中的hbase目录,已经有了数据:

Python通过Thrift访问HBase
HBase暴露了Thrift接口,我们可以通过相应包,从Python代码中访问HBase数据库。
首先我们需要在HBase服务器上开户thrift,在主服务器上运行如下命令:
hbase-daemon.sh start thrift安装需要的python包:
pip install thrift
pip install hbase-thrift编写如下Python代码,保存为hbase_test.py并运行,其中有注释说明:
#!/usr/bin/python
# _*_ coding: utf-8 _*_
# 引入库
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from hbase import Hbase
# 创建连接到HBase服务器的实例
socket = TSocket.TSocket('bd1.sos',9090)
socket.setTimeout(5000)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Hbase.Client(protocol)
# 连接到服务器
socket.open()
# 获取数据库中的所有表的名字
print(client.getTableNames())
# 为添加数据引入库,用来描述行中一个列的描述符
from hbase.ttypes import ColumnDescriptor
# 创建几个列族描述符
column_name = ColumnDescriptor(name='name')
column_price = ColumnDescriptor(name='price')
column_production_date = ColumnDescriptor(name='pd')
# 使用上面的列族描述符创建表
client.createTable('products', [column_name, column_price, column_production_date])
# 重新获取表列表、表是否激活的状态、表中列的描述符以及Regions
print(client.getTableNames())
print(client.isTableEnabled('products'))
print(client.getColumnDescriptors('products'))
print(client.getTableRegions('products'))
# 为修改数据库引入库,用来描述一个要更新的数据
from hbase.ttypes import Mutation
# 创建修改列的数据,并把它们更新到id为“00001”的行中
mutation_name = Mutation(column='sInfo:name', value='a product name')
mutation_price = Mutation(column='vals:price', value='12.5')
mutation_production_date = Mutation(column='vals:pd', value='2018-02-21')
client.mutateRow('products', '00001', [mutation_name, mutation_price, mutation_production_date])
# 获取表中指定行中的指定列,或获取整个指定行
print(client.get("products","00001","sInfo:name"))
print(client.getRow("products","00001"))
# 禁用和激活一个表
client.disableTable('products')
client.enableTable('products')
# 删除一个表,删除前需要先禁用
client.disableTable('products')
client.deleteTable('products')
将得到如下结果,为了更清晰地理解每行的功能,可以在Python解释器中一行行执行:

注意:
至此,我们有了HBase分布式部署,并可以通过hbase shell命令以及python代码访问HBase数据库,基本可以满足入门的需求。
除使用thrift库和hbase-thrift库之后,还有很多其他的封装,都是通过Thrift接口访问HBase,可以自行搜索使用,原理基本一样。
常见问题
声明
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3135274/ ,如需转载,请注明出处,否则将追究法律责任。