Cassandra使用pycassa批量导入数据
本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务。这是我第一次接触KV系统,原来只是走马观花似的看过KV啊,NoSQL啊。但是实际上没有实际的使用经验。经过两天的学习和接手,终于搞明白了在生产环境中的使用方式。在此简要的笔记一下。本文主要包括的内容有:
Cassandra的简介,
Cassandra的相关CLI
Cassandra的Python API,并且给出一个批量导入数据的例子。
1. Cassandra简介
Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能 是比较简单的事情,只管在群集里面添加节点就可以了。
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比 Dynomite(分布式的Key-Value存 储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库 的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。
和其他数据库比较,有几个突出特点:
- 模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部 署上。
- 真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
- 多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。
一些使Cassandra提高竞争力的其他功能:
- 范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。
- 列表数据结构 :在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。
- 分布式写操作 :可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。
2. 基础命令
连接
./cassandra-cli-h 10.224.52.73 -port 9160
集群式自动负载的,因此连接任意一个节点即可。
Check schema
show schema;
在创建了schema或者列族后,可以使用时命令确认是否成功
在运行改命令前,需要使用命令use keyspace_name; 否则会遇到以下错误:
Not authorized to a working keyspace
list
list column_family_name;
可以显示列族的前100列。
3. 批量导入
实验数据来自搜狗实验室的中文词语搭配库,http://www.sogou.com/labs/dl/r.html。
数据格式如下:
词语1_词语2 \t 两个词共同出现的次数
在这里并不讨论该数据的具体意义,只是以这个数据为起点来说明如何向应用方提供服务。
部分实际数据:
都要_打牌>--4
等候_一次>--26
本刊_重要>--3 关系_全方位>14 加热_迅速>--107
设计列族名为 test_only, cli 如下:
create column family test_only
with column_type = 'Standard'
andcomparator = 'UTF8Type'
anddefault_validation_class = 'BytesType'
andkey_validation_class = 'UTF8Type'
andread_repair_chance = 0.1
anddclocal_read_repair_chance = 0.0
andgc_grace = 864000
andmin_compaction_threshold = 4
andmax_compaction_threshold = 32
andreplicate_on_write = true
andcompaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'
andcaching = 'KEYS_ONLY'
and column_metadata = [
{column_name : 'count',
validation_class : UTF8Type}]
andcompression_options = {'sstable_compression' :'org.apache.cassandra.io.compress.SnappyCompressor'};
连接到Cassandra:pycassa.ConnectionPool(‘keyspace_name’, server_list)
具体到我们的例子就是:
con = pycassa.ConnectionPool('History',server_list=["server1:9160", "server2:9160","server3:9160"])
获取列族:
cf = pycassa.ColumnFamily(con, cfName)
插入一条数据:
cf.insert('row_key', {'col_name': 'col_val'})
批量插入:
cf.batch_insert({'row1': {'name1': 'val1', 'name2': 'val2'}, 'row2': {'foo': 'bar'}})
获取一条数据:
cf.get(‘row_key’)
获取某一列的值:
cf.get(‘row_key’)[‘column_name’]
下面是具体的代码实现:
import pycassa
import time
batch_size = 100
def pycassa_connect(): #start = time.time()
return pycassa.ConnectionPool('History', server_list=["192.168.1.20:9160"])
#end = time.time()
#print "Mola init time: ", (end - start) def batch_insert(file_path, cf):
global batch_size
f = open(file_path, "r")
count=0
error_count = 0
kvmap = {}
for line in f:--
list = line.split("\t")
if len(list) != 2 :
print "skip error data"
continue
column = {}
column['count'] = list[1].replace('\n', '')
try:
kvmap[list[0].decode('gb2312').encode('utf-8')] = column-
if len(kvmap) % batch_size == 0:
cf.batch_insert(kvmap)
kvmap.clear()
count = count + 1
except Exception, ex:
print "found execption"
print ex
error_count = error_count + 1
f.close()
if len(kvmap) > 0 :
cf.batch_insert(kvmap)
----
for key in kvmap:
print "key is %s, value is %s"%(key, kvmap[key])-
print "total insert data is %d, error is %d"%(count, error_count)
如何测试数据是正确的?
def test_after_insert(file_path, cf):
f = open(file_path, "r")
error_count=0
print "Test started"
for line in f:--
list = line.split("\t")
if len(list) != 2 :
print "skip error data"
continue
count = list[1].replace('\n', '')
if cf.get(list[0].decode('gb2312').encode('utf-8'))['count'] != count:
print "Key %s doesn't match value %s"%(list[0].decode('gb2312').encode('utf-8'), count)
error_count = error_count + 1
print "Test completed, found %d error(s)."%error_count
f.close()
Cassandra使用pycassa批量导入数据的更多相关文章
- csv文件批量导入数据到sqlite。
csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {}) # bs_switch 为from表单file字段的namedata =[i.split( ...
- 使用python向Redis批量导入数据
1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler): def connect(self) ...
- Redis批量导入数据的方法
有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...
- 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库
将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...
- 批量导入数据到mssql数据库的
概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...
- asp.net线程批量导入数据时通过ajax获取执行状态
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入sessi ...
- ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据
ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- asp.net 线程批量导入数据,ajax获取执行状态
最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...
- 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法
问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql 回车后,系统提示 MySQL server has g ...
随机推荐
- 腾讯笔试题:小Q硬币组合
腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...
- SpringMVC 处理映射
一.Spring MVC控制器名称处理映射 以下示例展示如何利用Spring MVC 框架使用控制器名称处理程序映射. ControllerClassNameHandlerMapping类是基于约定的 ...
- Delphi7通过SendMessage来实现默认打印机的切换
具体代码 procedure SetDefaultPrinter(NewDefPrinter: string); var ResStr: array[0..255] of Char; begin St ...
- rasa_core:基于机器学习的对话引擎
用机器学习管理你的对话,让它提升每一个对话.Rasa Core引导对话,考虑对话的历史和外部环境. 而不是成千上万的规则,Rasa 从真正的对话中挑选模式. 现在是扔掉你的状态机的时候了! Manag ...
- python3全栈开发-补充UDP的套接字、操作系统、并发的理论基础
一.基于UDP的套接字 udp套接字简单示例 import socket ip_port=('1.1.1.1',8181) BUFSIZE=1024 udp_server_client=socket. ...
- 360面试-C++后端(实习)
在线远程视频面试 一面: 自我介绍. 知道哪几种排序算法,各算法的时间复杂度. 解决hash冲突的几种方式. 有哪些方法清除cache中旧的数据.不太清楚,我扯到了操作系统中缺页中断的页面置换原理上, ...
- gulp将多张小图自动合成雪碧图
最近一直在做移动端的改版项目,做之前老大就跟我说了好几次,说这次改版一定要用雪碧图减少一个页面的图片的请求次数,能加快页面的加载速度就一定要加快,我说可以.因为之前的项目开发时间过短,也没有时间去慢慢 ...
- 项目中BigDecimal与Double使用场景
金额要用BigDecimal 金额计算不能用doube!!!! 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别.先看一个小例子: 请看题: 示例1 问, ...
- nodeppt的使用教程
为什么选择nodeppt 这可能是迄今为止最好的网页版演示库 基于GFM的markdown语法编写 支持html混排,再复杂的demo也可以做! 支持多个皮肤:colors-moon-blue-dar ...
- JS中的DOM— —节点以及操作
DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...