简介:
WIKI :
https://zh.wikipedia.org/wiki/Cassandra
Apache Cassandra
是一套开源分布式
NoSQL
数据库系统。它最初由
Facebook
开发,用于储存收件箱等简单格式数据,集
Google
BigTable
的数据模型与
Amazon
Dynamo
的完全分布式架构于一身。Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的
可扩展性
和性能,被
Digg
、
Twitter
、
Hulu
、
Netflix
等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。
数据模型
:
Cassandra使用了
Google
设计的
BigTable
的数据模型,与面向行(row)的传统的
关系型数据库
或
键值存储
的key-value数据库不同,Cassandra使用的是
宽列存储模型
(Wide Column Stores),每行数据由row key唯一标识之后,可以有最多20亿个列,每个列由一个column key标识,每个column key下对应若干value。这种模型可以理解为是一个二维的key-value存储,即整个数据模型被定义成一个类似map>的类型。
目前新版本的Cassandra采用与SQL语言类似的CQL语言
[6]
来实现数据模型的定义和数据的读写。其中BigTable中的列族(Column Family)在Cassandra中被称作类似关系型数据库中的称呼——表(table),而Cassandra/BigTable中的row key和column key并称为主键(primary key)。
存储模型:
与BigTable和其模仿者
HBase
不同,Cassandra的数据并不存储在分布式文件系统如
GFS
或
HDFS
中,而是直接存于本地。与BigTable一样,Cassandra也是日志型数据库,即把新写入的数据存储在内存的Memtable中并通过磁盘中的CommitLog来做持久化,内存填满后将数据按照key的顺序写进一个只读文件SSTable中,每次读取数据时将所有SSTable和内存中的数据进行查找和合并
[8]
[9]
。这种系统的特点是写入比读取更快
[10]
,因为写入一条数据是顺序计入commit log中,不需要随机读取磁盘以及搜索。
与Apache HBase比较
HBase
是Apache Hadoop项目的一个子项目,是
Google
BigTable的一个克隆,与Cassandra一样,它们都使用了BigTable的列族式的数据模型,但是:
- Cassandra只有一种节点,而HBase有多种不同角色,除了处理读写请求的region server之外,其架构在一套完整的HDFS分布式文件系统之上,并需要ZooKeeper来同步集群状态,部署上Cassandra更简单。
- Cassandra的数据一致性策略是可配置的,可选择是强一致性还是性能更高的最终一致性;而HBase总是强一致性的。
- Cassandra通过一致性哈希来决定一行数据存储在哪些节点,靠概率上的平均来实现负载均衡;而HBase每段数据(region)只有一个节点负责处理,由master来动态分配一个region是否大到需要拆分成两个,同时会将过热的节点上的一些region动态的分配给负载较低的节点,因此实现动态的负载均衡。
- 因为每个region同时只能有一个节点处理,一旦这个节点无响应,在系统将这个节点的所有region转移到其他节点之前这些数据便无法读写,加上master也只有一个节点,备用master的恢复也需要时间,因此HBase在一定程度上有单点问题;而Cassandra无单点问题。
- Cassandra的读写性能优于HBase。
Getting Started
http://wiki.apache.org/cassandra/GettingStarted
Spark-cassandra-connector:
https://github.com/datastax/spark-cassandra-connector
数据类型
Cassandra在CQL语言层面支持多种数据类型。
CQL类型 |
对应Java类型 |
描述 |
ascii |
String |
ascii字符串 |
bigint |
long |
64位整数 |
blob |
ByteBuffer/byte[] |
二进制数组 |
boolean |
boolean |
布林 |
counter |
long |
计数器,支持原子性的增减,不支持直接赋值 |
decimal |
BigDecimal |
高精度小数 |
double |
double |
64位浮点数 |
float |
float |
32位浮点数 |
inet |
InetAddress |
ipv4或ipv6协议的ip地址 |
int |
int |
32位整数 |
list |
List |
有序的列表 |
map |
Map |
键值对 |
set |
Set |
集合 |
text |
String |
utf-8编码的字符串 |
timestamp |
Date |
日期 |
uuid |
UUID |
UUID类型 |
timeuuid |
UUID |
时间相关的UUID |
varchar |
string |
text的别名 |
varint |
BigInteger |
高精度整型 |
安装及配置
下载压缩文件,解压.
添加加用户名和密码
http://zhaoyanblog.com/archives/307.html
(1)修改
cassandra.yaml
文件 ,
把默认的authenticator: AllowAllAuthenticator运行所有人登录设置为用密码登录:
authenticator: PasswordAuthenticator
(2)启动cassandra server,
在bin
目录下执行:
./cqlsh -ucassandra -pcassandra
使用默认账户登录cassandra
,创建用户:
CREATE
USER
test
WITH
PASSWORD
'test123'
SUPERUSER ;
(3)删除默认帐号:
Drop user cassandra
使用新用户登录:
./bin/cqlsh -u test -p test123 192.168.177.79 9042
启动cassandra: bin/cassandra -f
进入cassandra shell: ./bin/cqlsh -u test -p test123 192.168.177.79 9042
加用户名和密码:
http://zhaoyanblog.com/archives/307.html
进入cassandra shell: ./bin/cqlsh -u test -p test123
配置远程连接
连接地址:192.168.177.79 9042
修改
cassandra.yaml
文件:
listen_address: 192.168.177.80
rpc_address: 192.168.177.80
多节点集群
参考:
http://www.oschina.net/question/82993_63619
修改
cassandra.yaml
文件(注意:后要加一个空格):
listen_address: localhost --> 本机ip
rpc_address: localhost -- > 本机ip
seeds: 监听节点ip(默认127.0.0.1为单节点),seeds作为连接点,当一个新的节点加入到集群中的时候,他联系seeds得到其他节点的一些基础信息。作为种子的节点必须是所有的节点都可以通过路由连接到的。注:在多节点的集群中,最好拥有多个seeds。
删除节点:
查询nodeid:
./nodetool status
删除:
./nodetool removenode
删除节点后可能会出现用户丢失的情况,如报用户名和密码不对的错误。这时候需要新建用户。
CQL:
http://cassandra.apache.org/doc/cql3/CQL-3.0.html
First, create a keyspace -- a namespace of tables.
>
CREATE KEYSPACE
test WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
> use mykeyspace;
>
CREATE TABLE
test.users ( userId bigint primary key, userScore
map
);
>
CREATE TABLE
test.wanxiang_als(userId bigint primary key,userScore
list
);
>
select
* from test.users;
>
truncate
test.users;
>
desc
tables; //查看哪些表
>
CREATE
INDEX
ON users (lname);
./bin/nodetool status
查看节点状态:
$ ./bin/nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 192.168.177.77 149.12 MB 256 ? 91089f9c-8147-4ed5-a1e9-88e7e40ff74b rack1
UN 192.168.177.78 252.09 MB 256 ? 95a79eb1-93c6-4670-9604-abebc618682b rack1
UN 192.168.177.79 2.35 MB 256 ? 1576ab25-f330-45a8-bff8-d6fc979bd960 rack1
//UN的状态表示UpNormal
Spark-cassandra-connector:
https://github.com/datastax/spark-cassandra-connector
问题:cassandra连接不上
解决:cassandra客户端连接使用的是python编写,使用了python的版本2.7.12,而cassandra兼容最高python版本为2.7.5
问题:
rdd.saveToCassandra在local模式下能运行,yarn-client模式下报错:
Method not found (guava内的包)
原因:
Cassandra-connector使用guava16.0.1版本,spark-submit提交jar包的时候提交到yarn-client上,hadoop同样依赖guava jar包版本为guava11,调用cassandra-connector时首先使用的是hadoop环境变量中的guava,引用了高版本提供而低版本guava没有提供的method。
解决:
(1)将依赖的包通过maven打到一个jar包中,可以将spark等不需要的包scope设置为provided。
(2)Spark-submit的时候指定jar包classpath优先顺序:
spark.driver.
userClassPathFirst
配置参见:
https://spark.apache.org/docs/latest/configuration.html
问题:Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReplayer$CommitLogReplayException: Could not read commit log descriptor in file ./bin/../data/commitlog/CommitLog-6-1471848948206.log
解决:删除 data/conmitLog/*.log
问题:Exiting due to error while processing commit log during initialization.java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
解决:
http://stackoverflow.com/questions/32817427/cassandra-error-in-initializing-system-sstable-activity
http://stackoverflow.com/questions/25664128/cassandra-java-lang-outofmemoryerror-java-heap-space%5D
最终发现原因: logs/debug.log。no space on device.