ITPub博客

首页 > 大数据 > > Hadoop大数据入门(八)HBase

Hadoop大数据入门(八)HBase

作者:浪花小雨滴 时间:2020-05-12 15:31:47 0 删除 编辑

目录

  1. 序言
  2. 理论基础
  3. 生态介绍
  4. 安装和配置
  5. 多节点部署
  6. 交互
  7. Spark
  8. 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 stop

HBase安装配置

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

在这里我们可以直接访问存储在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解释器中一行行执行:

注意:

  • 在定义表结构的时候,使用ColumnDescriptor创建的是列族,列族中可以存放任意列,但列不需要提交定义。比如sInfo是列族,sInfo中的name是列名。
  • 上面只是最简单的操作示范,更多详细信息还是要看官方文档。

至此,我们有了HBase分布式部署,并可以通过hbase shell命令以及python代码访问HBase数据库,基本可以满足入门的需求。

除使用thrift库和hbase-thrift库之后,还有很多其他的封装,都是通过Thrift接口访问HBase,可以自行搜索使用,原理基本一样。


常见问题

  • 网络问题:会造成服务启动出错,或看不到所有节点等,检查服务器之间的网络连接以及防火墙设置。目录是彼此之间可以免密码ssh登录。
  • 系统配置问题:会造成系统找不到某些东西,可能是java,可能是hadoop的某个组件。检查如~/.bashrc配置文件,并确保已经使用source使其生效。
  • hadoop组件配置问题:会造成服务启动失败,或操作失败等,重新检查相关配置文件。
  • 启动问题:某些组件有依赖关系,比如HBase需要HDFS和ZK,启动顺序要注意。如果实在不行,可以尝试重启所有的服务器,然后:
    • 1. 从主服务器启动hadoop,这会启动所有NameNode和DataNode。
    • 2. 从主服务器启动ZK,到所有其他服务器启动ZK。
    • 3. 从主服务器启动HBase,这会启动所有其他节点。
  • 其他问题:有时候会很诡异,特别是第一次尝试折腾,真的没辙了可以全部重来,折腾得多了,问题就少了,可能并不知道为什么……

声明

  1. 目录中的文章在陆续更新中,如果无法访问,请耐心等待。
  2. 本人是个实用主义者,有时候为了方便理解和记忆,并不一定完全严谨,欢迎交流。
  3. 文章中用到的一些图片是借来的,如有版权问题,请及时与我联系更换。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3135274/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PostGreSQL学习笔记
下一篇: HBase中的角色
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40075