原博文出自于:  http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/    感谢!

R利剑NoSQL系列文章 之 Cassandra

R利剑NoSQL系列文章,主要介绍通过R语言连接使用nosql数据库。涉及的NoSQL产品,包括Redis,MongoDBHBaseHiveCassandra, Neo4j。希望通过我的介绍让广大的R语言爱好者,有更多的开发选择,做出更多地激动人心的应用。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明:
http://blog.fens.me/nosql-r-cassandra/

第三篇 R利剑Cassandra,分为7个章节。

  1. Cassandra介绍
  2. Cassandra安装
  3. RCassandra安装
  4. RCassandra函数库
  5. RCassandra基本使用操作
  6. RCassandra使用案例
  7. Cassandra的没落

每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。

1. Cassandra介绍

Apache Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩放性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。

Cassandra 的名称来源于希腊神话,是特洛伊的一位悲剧性的女先知的名字,因此项目的Logo是一只放光的眼睛。

Cassandra的数据会写入多个节点,来保证数据的可靠性,在一致性、可用性和网络分区耐受能力(CAP)的折衷问题上,Cassandra比较灵活,用户在读取时可以指定要求所有副本一致(高一致性)、读到一个副本即可(高可用性)或是通过选举来确认多数副本一致即可(折衷)。这样,Cassandra可以适用于有节点、网络失效,以及多数据中心的场景。

Cassandra介绍摘自:维基百科(http://zh.wikipedia.org/wiki/Cassandra)

2. Cassandra安装

文字说明部分:
首先环境准备,这里我选择了Linux Ubuntu操作系统12.04的64位服务器版本,大家可以根据自己的使用习惯选择顺手的Linux。

JDK使用SUN官方版本JDK 1.6.0_29,请不要用Linux自带的openjdk。

手动下载并安装Cassandra。

Cassandra配置,需要提前初始化几个目录。

  • data_file_directories:为数据文件目录
  • commitlog_directory:为日志文件目录
  • saved_caches_directory:为缓存文件目录

下面将介绍单节点的安装,集群安装请参考:Cassandra单集群实验2个节点

代码部分:
单节点安装:系统环境 Linux Ubuntu 12.04 LTS 64bit server


~ uname -a
Linux u1 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux ~ cat /etc/issue
Ubuntu 12.04.2 LTS \n \l

JDK环境:SUN官方JDK 1.6.0_29


~ java -version java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)

下载Cassandra并解压


~ wget http://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/1.2.5/apache-cassandra-1.2.5-bin.tar.gz ~ tar xvf apache-cassandra-1.2.5-bin.tar.gz
~ mv apache-cassandra-1.2.5-bin cassandra125
~ mv cassandra125 /home/conan/toolkit/ ~ pwd
/home/conan/toolkit ~ ls -l
drwxrwxr-x 9 conan conan 4096 Jun 1 06:10 cassandra125/
drwxr-xr-x 10 conan conan 4096 Apr 23 14:36 jdk16

初始化cassandra


~ cd /home/conan/toolkit/cassandra125 #配置Cassandra数据文件目录
~ vi conf/cassandra.yaml data_file_directories:
- /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

目录的介绍:
data_file_directories:为数据文件目录
commitlog_directory:为日志文件目录
saved_caches_directory:为缓存文件目录

确认操作系统中,这几个目录已被创建。
同时确认/var/log/cassandra/目录,对于cassandra是可写的。


~ sudo mkdir -p /var/lib/cassandra/data
~ sudo mkdir -p /var/lib/cassandra/saved_caches
~ sudo mkdir -p /var/lib/cassandra/commitlog
~ sudo mkdir -p /var/log/cassandra/ ~ sudo chown -R conan:conan /var/lib/cassandra
~ sudo chown -R conan:conan /var/log/cassandra/ ~ ll /var/lib/cassandra
drwxr-xr-x 2 conan conan 4096 Jun 1 06:21 commitlog/
drwxr-xr-x 2 conan conan 4096 Jun 1 06:21 data/
drwxr-xr-x 2 conan conan 4096 Jun 1 06:21 saved_caches/

设置环境变量


~ sudo vi /etc/environment
CASSANDRA_HOME=/home/conan/toolkit/cassandra125 #让变量生效
~ . /etc/environment #查看环境变量
~ export |grep /home/conan/toolkit/cassandra125
declare -x CASSANDRA_HOME="/home/conan/toolkit/cassandra125"
declare -x OLDPWD="/home/conan/toolkit/cassandra125"
declare -x PWD="/home/conan/toolkit/cassandra125/bin"

启动cassandra


~ bin/cassandra -f
#注:-f参数是绑定到console,不加-f则是后台启动。 ~ jps
19971 CassandraDaemon
20440 Jps

打开客户端


~ bin/cassandra-cli Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.2.5 Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit. [default@unknown]

单节的cassandra,我们已经成功能安装好了。

Cassandra的集群安装请参考:Cassandra单集群实验2个节点

3. RCassandra安装

文字说明部分:
R语言的版本请使用2.15.3,下面介绍如何安装R。

首先,增加一个软件源deb http://mirror.bjtu.edu.cn/cran/bin/linux/ubuntu precise/。
更新及指定安装2.15.3-1precise0precise1版本。

启动R程序,安装RCassandra包。

代码部分
测试环境R语言的版本是:2.15.3

安装R语言


~ sudo vi /etc/apt/sources.list
deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirror.bjtu.edu.cn/cran/bin/linux/ubuntu precise/

更新apt-get源


~ sudo apt-get update #声明安装2.15.3的版本
~ sudo apt-get install r-base-core=2.15.3-1precise0precise1 #启动R
~ R
R version 2.15.3 (2013-03-01) -- "Security Blanket"
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details. Natural language support but running in an English locale R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

安装RCassandra


> install.packages('RCassandra')
> library(RCassandra)

4. RCassandra函数库

文字说明部分
列出有的RCassandra支持的函数,只有17个。记得rredis有100个函数,rmongodb有153个函数。相比之下RCassandra太轻量了。

但是这17个函数,并没有覆盖Cassandra的所有操作,就连一些的基本的操作都没有函数支持,要在命令行处理。不知道是什么原因?!希望RCassandra能继续发展,完善没有实现的功能函数。

不支持的常用操作:
创建keyspaces,删除keyspaces
创建列族,删除列族
删除一行
删除一行的某列数据

下面列出了这17个函数,并与Cassandra的命令做了对比说明。

代码部分
共有17个函数


RC.close RC.insert
RC.cluster.name RC.login
RC.connect RC.mget.range
RC.consistency RC.mutate
RC.describe.keyspace RC.read.table
RC.describe.keyspaces RC.use
RC.get RC.version
RC.get.range RC.write.table
RC.get.range.slices

Cassandra和RCassandra的基本操作对比:


#连接到集群
Cassandra: connect 192.168.1.200/9160;
RCassandra: conn<-RC.connect(host="192.168.1.200",port=9160) #查看当前集群名字
Cassandra: show cluster name;
RCassandra: RC.cluster.name(conn) #列出当前集群所有keyspaces
Cassandra: show keyspaces;
RCassandra: RC.describe.keyspaces(conn) #查看DEMO的keyspace
Cassandra: show schema DEMO;
RCassandra: RC.describe.keyspace(conn,'DEMO') #选择DEMO的keyspace
Cassandra: use DEMO;
RCassandra: RC.use(conn,'DEMO') #设置一致性级别
Cassandra: consistencylevel as ONE;
RCassandra: RC.consistency(conn,level="one") #插入数据
Cassandra:set Users[1][name] = scott;
RCassandra:RC.insert(conn,'Users','1', 'name', 'scott') #插入数据框
Cassandra:NA
RCassandra:RC.write.table(conn, "Users", df) #读取列族所有数据
Cassandra: list Users;
RCassandra: RC.read.table(conn,"Users") #读取数据
Cassandra: get Users[1]['name'];
RCassandra:RC.get(conn,'Users','1', c('name')) #退出连接
Cassandra: exit; quit;
RCassandra: RC.close(conn)

5. RCassandra基本使用操作

文字说明部分
介绍RCassandra的基本函数操作,以iris的数据集为例,介绍了如何利用RCassandra操作Cassandra数据库。

代码部分


#安装RCassandra
install.packages('RCassandra') #加载RCassandra类库
library(RCassandra) #建立服务器连接
conn<-RC.connect(host="192.168.1.200") #当前集群的名字(2个节点集群的名字)
RC.cluster.name(conn)
[1] "case1" #当前协议的版本
RC.version(conn)
[1] "19.36.0" #列出所有keyspaces配置信息
RC.describe.keyspaces(conn) #列出叫的DEMO的keyspaces配置信息
RC.describe.keyspace(conn, "DEMO") #RCassandra是不能创建的列族的,提前通过Cassandra命令创建一个列族
#[default@DEMO] create column family iris; #插入iris数据
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa #iris是一个data.frame
RC.write.table(conn, "iris", iris) attr(,"class")
[1] "CassandraConnection" #查看第1行,Sepal.Length列和Species的值
RC.get(conn, "iris", "1", c("Sepal.Length", "Species"))
key value ts
1 Sepal.Length 5.1 1.372881e+15
2 Species setosa 1.372881e+15
#注:ts是时间戳 #查看第1行
RC.get.range(conn, "iris", "1")
key value ts
1 Petal.Length 1.4 1.372881e+15
2 Petal.Width 0.2 1.372881e+15
3 Sepal.Length 5.1 1.372881e+15
4 Sepal.Width 3.5 1.372881e+15
5 Species setosa 1.372881e+15 #查看
r <- RC.get.range.slices(conn, "iris")
class(r)
[1] "list" r[[1]]
key value ts
1 Petal.Length 1.7 1.372881e+15
2 Petal.Width 0.4 1.372881e+15
3 Sepal.Length 5.4 1.372881e+15
4 Sepal.Width 3.9 1.372881e+15
5 Species setosa 1.372881e+15 rk <- RC.get.range.slices(conn, "iris", limit=0)
y <- RC.read.table(conn, "iris")
y <- y[order(as.integer(row.names(y))),] head(y)
Petal.Length Petal.Width Sepal.Length Sepal.Width Species
1 1.4 0.2 5.1 3.5 setosa
2 1.4 0.2 4.9 3.0 setosa
3 1.3 0.2 4.7 3.2 setosa
4 1.5 0.2 4.6 3.1 setosa
5 1.4 0.2 5.0 3.6 setosa
6

不支持的常用操作

  • 创建keyspaces,删除keyspaces
  • 创建列族,删除列族
  • 删除一行
  • 删除一行的某列数据

6. RCassandra使用案例

文字说明部分
通过一个业务需求的例子,加深我们对RCassandra的认识。下面是一个非常简单的业务场景。

业务需求:
1. 创建一个Users列族,包含name,password两列
2. 在已经数据的情况下,有动态增加一个新列age

代码部分
在Cassandra命令行,创建列族Users


[default@DEMO] create column family Users
... with key_validation_class = 'UTF8Type'
... and comparator = 'UTF8Type'
... and default_validation_class = 'UTF8Type'; 89a2fb75-f7d0-399e-b017-30a974b19f4a

RCassandra插入数据,包含name,password两列


> df<-data.frame(name=c('a1','a2'),password=c('a1','a2')) > print(df)
name password
1 a1 a1
2 a2 a2 #插入数据
> RC.write.table(conn, "Users", df)
attr(,"class")
[1] "CassandraConnection" #查看数据
> RC.read.table(conn,"Users")
name password
2 a2 a2
1 a1 a1 #新插入: 一行KEY=1234,并增加age列
> RC.insert(conn,'Users','1234', 'name', 'scott')
> RC.insert(conn,'Users','1234', 'password', 'tiger')
> RC.insert(conn,'Users','1234', 'age', '20') #查看数据
> RC.read.table(conn,"Users")
age name password
1234 20 scott tiger
2 NA a2 a2
1 NA a1 a1 #修改: KEY=1的行中,name=a11, age=12
> RC.insert(conn,'Users','1', 'name', 'a11')
> RC.insert(conn,'Users','1', 'age', '12') #查看数据
> RC.read.table(conn,"Users")
age name password
1234 20 scott tiger
2 NA a2 a2
1 12 a11 a1

7. Cassandra的没落

越来越多的基于cassandra构建的应用,开始向hbase迁移。

Cassandra的没落,在技术上可能存在的一些原因:

1. 读的性能太慢

无中心的设计,造成读数据时通过逆熵做计算,性能损耗很大,甚至会严重影响服务器运作。

2. 数据同步太慢(最终一致性延迟可能非常大)

由于无中心设计,要靠各节点传递信息。相互发通知告知状态,如果副本集有多份,其中又出现节点有宕机的情况,那么做到数据的一致性,延迟可能非常大,效率也很低的。

3. 用插入和更新代替查询,缺乏灵活性,所有查询都要求提前定义好。

与大多数数据库为读优化不同,Cassandra的写性能理论上是高于读性能的,因此非常适合流式的数据存储,尤其是写负载高于读负载的。与HBase比起来,它的随机访问性能要高很多,但不是很擅长区间扫描,因此可以作为HBase的即时查询缓存,由HBase进行批量的大数据处理,由Cassandra提供随机查询的接口

4. 不支持直接接入hadoop,不能实现MapReduce。

现在大数据的代名词就是hadoop,做为海量数据的框架不支持hadoop及MapReduce,就将被取代。除非Cassandra能够给出其他的定位,或者海量数据解决方案。DataStax公司,正在用Cassandra重够HDFS的文件系统,不知道是否可以成功。

让我期待Cassandra未来的发展吧!

转载请注明:
http://blog.fens.me/nosql-r-cassandra/

转】R利剑NoSQL系列文章 之 Cassandra的更多相关文章

  1. 转】R利剑NoSQL系列文章 之 Hive

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! Posted: Jul 27, 2013 Ta ...

  2. R学习笔记 ---- 系列文章

    R实战 开篇:介绍R的使用 R学习笔记 第五篇:字符串操作 R学习笔记 第六篇:数据变换和清理 R学习笔记 第四篇:函数,分支和循环 R学习笔记 第三篇:数据框 R学习笔记 第二篇:矩阵.数组和列表 ...

  3. R的极客理想系列文章--转载

    http://blog.fens.me/series-r/ R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在 ...

  4. 开源软件:NoSql数据库 - 图数据库 Cassandra

    转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...

  5. Redis 学习笔记系列文章之 Redis 的安装与配置 (一)

    1. 介绍 Redis is an open source (BSD licensed), in-memory data structure store, used as database, cach ...

  6. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)

    统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...

  7. [你必须知道的NOSQL系列]专题二:Redis快速入门

    一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...

  8. WPF自定义控件与样式(15)-终结篇 & 系列文章索引 & 源码共享

    系列文章目录  WPF自定义控件与样式(1)-矢量字体图标(iconfont) WPF自定义控件与样式(2)-自定义按钮FButton WPF自定义控件与样式(3)-TextBox & Ric ...

  9. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...

随机推荐

  1. OpenLayers3基础教程——OL3基本概念

    从本节開始,我会陆陆续续的更新有关OL3的相关文章--OpenLayers3基础教程,欢迎大家关注我的博客,同一时候也希望我的博客可以给大家带来一点帮助. 概述: OpenLayers 3对OpenL ...

  2. 自己定义控件 播放GIF动画

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  3. android 浮动窗体学习笔记及个人理解(仿360手机助手)

    很感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序执行界面例如以下图: 1.程序入口界面 2.小浮动窗体 ...

  4. web 开发之js---ajax 中的两种返回状态 xmlhttp.status和 xmlhttp.readyState

    (1)xmlhttp.status xmlHttp.status的值(HTTP状态表)0**:未被始化 1**:请求收到,继续处理 2**:操作成功收到,分析.接受 3**:完成此请求必须进一步处理 ...

  5. 在webkit中如何避免触发layout(重排)

    很多web开发者都已经意识到,在脚本执行中,DOM操作的用时可能比js本身执行时间要长很多,其中潜在的消耗基本上是由于触发了layout(即重排reflow:由DOM树构建为Render渲染树的过程) ...

  6. EJB学习笔记六(EJB中的拦截器)

     1.前言 听到拦截器,预计都不陌生,尤其是在Servlet规范中,充分应用了拦截器的概念.EJB3也提供了拦截器的支持,本质上是轻量级的AOP实现.拦截器能够将多个业务方法中的通用逻辑从业务方法中抽 ...

  7. Codeforces Little Dima and Equation 数学题解

    B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes input s ...

  8. slf4j的总结

    参考文章 log4j2使用总结 slf4j介绍以及实现原理窥探 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 slf4j(全称是Simple Loging Facade For Jav ...

  9. Statement 与 PreparedStatement 区别

    Statement由方法createStatement()创建,该对象用于发送简单的SQL语句 PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个 ...

  10. publish and submit

    http://blog.csdn.net/w_jewelry/article/details/8123639 1.Gerrit里点击“publish and submit”提示如下:Your chan ...