背景:
接到需求,需要每天把大概一亿条的数据导入到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
嗯,这名字真有趣。
Happybase
是Python
通过Thrift
访问HBase
的库,方便快捷。
因为Hbase
是用Java
写的,原生地提供了Java
接口,对非Java
程序员,如果用的是其他的语言,则需要开启连接原生地提供的thrift接口服务器。而happybase
默认是使用9090
端口,所以在确保zookeeper
和Hbase
已经开启了之后,需要先使用以下命令开启。
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
,然后开始遇到一堆问题。
由于内容太多,所以我分开文章发好了,本来写在一篇里的。