读取TXT文件写入数据到Hbase

hbase 同时被 2 个专栏收录
6 篇文章 0 订阅
4 篇文章 0 订阅

背景:
接到需求,需要每天把大概一亿条的数据导入到Hbase里,对标同事的mongoDB(大概半个小时内导完)
环境配置:
Python:3.7.4
Hbase:2.2.3
数据格式:
一天一个压缩包(ZIP),然后里面都是很多个TXT文件,分隔符是 “|” ,每个TXT文件大概是9000条数据这样。

我尝试使用了两种方法:

尝试一:shell命令导入(也可以写成脚本)

我直接上命令好了,这个百度就有:

./hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator='|' -Dimporttsv.columns=HBASE_ROW_KEY,PLA_INFO,DATE_TIME,KKJ,KKW,SPEED,SPEED_EX,ALTITUDE,STATUS,COLOUR,MILEAGE,WAY testtable /home/data/demo_data1.txt

这里我拿了一点数据来测试,可以导入。速度没测,因为我马上就弃用了。
遇到问题:
我百度的时候看到这样写,ROW_KEY是有序的数字id,我这里变成了我第一个字段。。无语,而且ROWKEY也许需要自定义,shell怎么搞不是很想研究,写代码不香吗,所以弃用了(这个个人喜好吧,我觉得shell其实也挺方便的)。


尝试二:Python Happybase

嗯,这名字真有趣。
HappybasePython通过Thrift访问HBase的库,方便快捷。
因为Hbase是用Java写的,原生地提供了Java接口,对非Java程序员,如果用的是其他的语言,则需要开启连接原生地提供的thrift接口服务器。而happybase默认是使用9090端口,所以在确保zookeeperHbase已经开启了之后,需要先使用以下命令开启。

nohup hbase thrift start-port:9090 &

代码:

import happybase
import re
import time
import os

connection = happybase.Connection('192.168.0.111')
table = connection.table('test')

def read_file():
    start = time.time()
    # path = 'F:\\20200302\\'
    path = 'F:\hbase\demo_data\\'
    pathDir = os.listdir(path)
    # print(pathDir)
    x = 0
    # 批量插入数据
    for filename in pathDir:
        print(filename)
        file = open(path+filename, "r", encoding='utf8')
        print(file)
        content = file.read()
        # print(content)
        if content:
            line_list = re.split("[\n]", content)
            # print(line_list)
            for line in line_list:
                value_list = re.split("[|]", line)
                # print(value_list)
                if len(value_list) > 1:
                    insertData(value_list)
                    x+=1
                    print("插入了",x,"条数据")
    end = time.time()
    print("花了", end-start,"秒")

def insertData(list):
    current_time = str(time.time())
    print(current_time)
    print(list)
    # b = table.batch(batch_size=1000)
    # 这里使用了batch的方法批量插入数据,如果把这个去掉直接put也行,详细代码百度一下就有
    with table.batch() as b:
        b.put(current_time,{
                            'car_info: PLA_INFO':list[0],
                            'car_info: DATE_TIME':list[1],
                            'car_info: KKJ': list[2],
                            'car_info: KKW': list[3],
                            'car_info: SPEED': list[4],
                            'car_info: SPEED_EX': list[5],
                            'car_info: ALTITUDE': list[6],
                            'car_info: STATUS': list[7],
                            'car_info: COLOUR': list[8],
                            'car_info: MILEAGE': list[9],
                            'car_info: WAY': list[10]
                          })
	# 查看表
    # for key,value in table.scan():
    #     print(key,value)

def main():
    read_file()
    connection.close()

if __name__ == '__main__':
    main()

可以写进去,使用的感觉就是不快。。。一亿条数据全写进去估计要花几个小时,比起mongodb来说太慢了,我自己感觉的原因有这几个:
1、最主要的原因还是读取ZIP包花了不少的时间(这个应该可以优化,但是我没想到办法)
2、然后插入的方法,batch插入的方法没写对(不清楚,有这个感觉),因为我使用batch的方法和直接put相比,速度是没变化的。
happybase在想优化的方法的时候,我在想不如试试用spark读取这些TXT文件(因为spark是可以快速读取的),所以我就开始试着用spark+hbase,然后开始遇到一堆问题。

由于内容太多,所以我分开文章发好了,本来写在一篇里的。

  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值