。我正在尝试使用pycassa加速插入Cassandra。 我听说使用多线程并打开多个连接可以加快速度。我正在以json格式插入一大堆推文。 我的代码在这里工作了一段时间,然后线程开始抛出异常并且它停止,似乎我拥有的线程越多它停止工作的速度越快......我猜测问题是与cassandra的连接,某些东西到做连接池。有任何想法吗?
编辑:所有线程抛出“Thread-3线程中的异常(很可能在解释器关闭期间引发):”
import time
import pycassa
from pycassa.pool import ConnectionPool
from pycassa.columnfamily import ColumnFamily
from datetime import datetime
import json
import threadpool
pool = threadpool.ThreadPool(4)
kspool = ConnectionPool('TweetsKS',use_threadlocal = True)
def process_tasks(lines):
#let threadpool format your requests into a list
requests = threadpool.makeRequests(insert_into_cfs, lines)
#insert the requests into the threadpool
for req in requests:
pool.putRequest(req)
def read(file):
bench = open("bench.txt", "w")
bench.write(str(datetime.now())+"\n")
"""read data from json and insert into keyspace"""
json_data=open(file)
lines = []
for line in json_data:
lines.append(line)
process_tasks(lines)
def insert_into_cfs(line):
user_tweet_cf = pycassa.ColumnFamily(kspool, 'UserTweet')
user_name_cf = pycassa.ColumnFamily(kspool, 'UserName')
tweet_cf = pycassa.ColumnFamily(kspool, 'Tweet')
user_follower_cf = pycassa.ColumnFamily(kspool, 'UserFollower')
tweet_data = json.loads(line)
"""Format the tweet time as an epoch seconds int value"""
tweet_time = time.strptime(tweet_data['created_at'],"%a, %d %b %Y %H:%M:%S +0000")
tweet_time = int(time.mktime(tweet_time))
new_user_tweet(user_tweet_cf,tweet_data['from_user_id'],tweet_time,tweet_data['id'])
new_user_name(user_name_cf,tweet_data['from_user_id'],tweet_data['from_user_name'])
new_tweet(tweet_cf,tweet_data['id'],tweet_data['text'],tweet_data['to_user_id'])
if tweet_data['to_user_id'] != 0:
new_user_follower(user_follower_cf,tweet_data['from_user_id'],tweet_data['to_user_id'])
"""4 functions below carry out the inserts into specific column families"""
def new_user_tweet(user_tweet_cf,from_user_id,tweet_time,id):
user_tweet_cf.insert(from_user_id,{(tweet_time): id})
def new_user_name(user_name_cf,from_user_id,user_name):
user_name_cf.insert(from_user_id,{'username': user_name})
def new_tweet(tweet_cf,id,text,to_user_id):
tweet_cf.insert(id,{
'text': text
,'to_user_id': to_user_id
})
def new_user_follower(user_follower_cf,from_user_id,to_user_id):
user_follower_cf.insert(from_user_id,{to_user_id: 0})
if __name__ == '__main__':
read('tweets.json')
答案 0 :(得分:1)
好的,这里的问题是我使用了threadpool。 我需要在pool.putRequest(req)之后的pool.wait(在循环之外) 我的主要线程是在其他人之前完成,他们不是守护进程。
使用2个线程,我的Cassandra插入速度大约快两倍......但是猜猜是什么!?它仍然比MySQL慢! 有6个线程,它大致相同...我想更需要修补!