1. 实训目的
• 了解HBase的相关知识;
• 熟悉HBase相关指令以及HBase过滤器的使用;
• 掌握HBase数据导入与备份方法的使用以及性能优化的实现;
• 具有实现冠字号查询的能力。
2. 实训内容
- 启动Hadoop和HBase服务
# 启动hadoop
cd /usr/local/hadoop
sbin/start-dfs.sh
# 启动yarn
sbin/start-yarn.sh
# 启动hbase
start-hbase.sh
hbase-daemon.sh start thrift
这里使用三台机器的集群模式
# 进入hbase shell
hbase shell
# 创建数据表'records'
create 'records','info'
- 切换到命令窗口,将冠字号存储数据文件上传到 HDFS的根目录下
#上传HDFS
hadoop fs -put in_out_details.txt /
hadoop fs -ls /
# 导入数据
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,info:exist,info:time,info:bank,info:uid records /in_out_details.txt
# 查看是否导入成功
scan 'records'
3. 创建Python文件并编写代码
#创建.py文件
vim Records.py
在编辑器中写入如下代码
import prompt_toolkit # 导入命令提示工具,用于简单交互
import happybase # 用于连接hbase数据库
connection=happybase.Connection('192.168.127.102',9090)#使用自己的地址和端口号
connection.open() #连接HBase服务
table = connection.table(b'records') #连接records数据表
type=prompt_toolkit.prompt('方式,0表示取钱,1表示存钱>')
def getMoney():
num=prompt_toolkit.prompt('输入取钱张数>')
# 定义过滤器
filter = "ValueFilter(=,'binary:1')" #为1表示可以取钱,在银行钱库
# 查询数据
records=table.scan(filter=filter,limit = int(num))
# 遍历数据
for key, data in records:
try:
# 将info:exist值修改为0
table.put(key, {
b'info:exist': b'0'})
print (key,"取钱成功")
except:
print (key,"取钱失败")
getMoney()#
# 当输出的操作为0时表示取钱操作
if type=='0':
# 调用getMoney函数
getMoney()
def putMoney():
# 输入冠字号
number = prompt_toolkit.prompt('冠字号>')
# 定义过滤器
filter = "RowFilter( =,'binary:"+number+"')"
#获取数据
records =table.scan(filter=filter)
count=0
DoesItExist=0
#遍历数据
for key, data in records:
# 获取info:exist的值
DoesItExist=int(data[b'info:exist'])
count += 1
#判断info:exist的值是否为0
if DoesItExist == 0:
try:
#如果等于0,则将info:exist的值修改为1
table.put(key,{
b'info:exist':b'1'})
print ("存钱成功")
except:
print ("存钱失败")
getMoney()
#假币判断,如果count=0,则说明数据库中不存在该冠字号
#如果DoesItExist=1,则说明数据库中存在该冠字号,但其状态为存储状态
if count == 0 or DoesItExist == 1:
print ("这张是假币,请重新输入!")
putMoney()
if type=='1':
# 调用putMoney函数
putMoney()
运行代码
python3 Records.py
- 取钱操作 0
- 存钱操作需要输入冠字号,之后通过该冠字号查看数据,代码如下所示。
验证该冠字号在数据库中是否存在,如果不存在则说明是假币,如果存在,则获取info:exist列的值并判断是否为0,为0说明这个钱曾经被取出,现在可以存储,如果不为0,说明这个钱存储在银行,也就是说是假币。代码如下所示。
实训小结
建议使用python3运行py文件
推荐python3安装教程:https://blog.csdn.net/lian740930980/article/details/109738141
-
centos7默认没有pip3,可能会报错,根据报错信息安装pip3即可
-
运行py文件会报如下错误:happybase ,prompt_toolkit没安装,安装即可
解决报错 https://blog.csdn.net/only_LWL/article/details/107013077
#happybase安装失败,可运行如下代码
yum install python3-devel
- 有些同学可能在Ubuntu,Centos里面无法运行py,还有一个解决方法就是在Windows里面运行,前提是必需两者连接起来,比如我使用XShell连接
- 然后使用windows自带的python3运行 如下:
- 也可使用pycharm,必需开启 模拟输出控制台中的终端 (默认是关闭的),并且安装第三方库也方便
- 运行如下:
注意自己的ip地址和端口号!!!
注意自己的ip地址和端口号!!!
注意自己的ip地址和端口号!!!
总结:
代码缩进必须注意,否则容易出错
hadoop,hbase,先启动Hadoop,如有zookeeper先启动zookeeper,再启动hadoop,然后hbase,关闭则相反
注意自己的 IP地址和端口号