HBase冠字号查询系统(实训报告)

1. 实训目的

• 了解HBase的相关知识;
• 熟悉HBase相关指令以及HBase过滤器的使用;
• 掌握HBase数据导入与备份方法的使用以及性能优化的实现;
• 具有实现冠字号查询的能力。

2. 实训内容

  1. 启动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'

在这里插入图片描述

  1. 切换到命令窗口,将冠字号存储数据文件上传到 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

  1. centos7默认没有pip3,可能会报错,根据报错信息安装pip3即可

  2. 运行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地址和端口号

猜你喜欢

转载自blog.csdn.net/weixin_51309151/article/details/126741811