cassandra笔记

简介
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.







你可能感兴趣的:(大数据)