最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

Brisk 之 CassandraFS

  • 2011-11-14
  • 本文字数:4983 字

    阅读完需:约 16 分钟

背景介绍

HDFS

HDFS 全称是 Hadoop Distributed System。HDFS 是为以流的方式存取大文件而设计的。适用于几百 MB,GB 以及 TB,并写一次读多次的场合。

构成 HDFS 主要是 Namenode(master)和一系列的 Datanode(workers)。Namenode 负责管理 HDFS 的目录树和相关的文件元数据,Datanode 则是存取文件实际内容的节点,Datanodes 会定时地将 block 的列表汇报给 Namenode。

如果 Namenode 出现了故障,整个 HDFS 集群将不可用,除非 Namenode 机器重启,并且需要等待一定时间的回复初始化之后,才能正常提供服务。除此之外,Namenode 还存在内存的瓶颈,当整个 HDFS 集群当中文件的数据达到一定的上限之后,Namenode 将出现一系列与内存相关的问题。

Map Reduce

MapReduce 是 Hadoop 中处理海量计算的编程模型。在这种编程模型下,用户通过定义一个 map 函数和一个 reduce 函数来解决问题。构成 Map Reduce 只要是 JobTracker(master)和一系列的 TaskTraker(workers)。

JobTracker 负责管理,分配和监控所有的计算任务,TaskTraker 则是实际执行任务的节点,TaskTraker 会将任务的执行情况都汇报给 JobTracker。

如果 JobTracker 出现了故障,集群中所有正在执行的计算任务都会失败,并且在重启 JobTracker 之前,无法在提交任何计算任务。

Hive

Hive 是基于 Hadoop 的一种数据查询工具,它可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,能够将 SQL 语句转换为 MapReduce 任务进行运行。

Cassandra

Cassandra 是一款面向列的 NoSQL 数据库,和 Google 的 BitTable 数据库属于同一类。此数据库比一个类似 Dynamo 的 Key Value 数据库功能更多,但相比面向文档的数据库(例如 MongoDB),它所支持的查询类型要少。

Cassandra 结合了 Dynamo 的 Key Value 与 Bigtable 的面向列的特点:

  • 模式灵活:不需要象数据库一样数据使用预先设计的模式,增加或者删除字段非常方便(on the fly)。
  • 支持范围查询:可以对任意 Key 进行范围查询。
  • 支持二级索引查询:可以对任意列(Column)的值进行查询。
  • 支持 Map Reduce 计算:可以对 Cassandra 中的数据批量进行复杂的分析计算。
  • 数据具备最终一致性,集群整体的可用性非常高。
  • 高可用,可扩展:单点故障不影响集群服务,集群的性能可线性扩展。
  • 数据可靠性高:一旦数据写入成功,数据就已经在机器的磁盘中完成了存储,不容易丢失。

Brisk

Brisk 是由 DataStax 开发的一款基于 Apache Cassandra 的开源产品,它提供了 HadoopMapReduce,HDFS 和 Hive 所包含的相关功能。Brisk 中包含了一个与 HDFS 接口兼容的 CassandraFS 。 与 HDFS 相比,CassandraFS 没有单点故障,整个文件系统所能承载的文件上限也不会受机器内存上限的影响。

用户如果希望使用 Brisk 来替代整个 Hadoop 系统,整个系统的部署图如下:

整个系统只需要三类角色即可:

  • Cassandra
  • TaskTracker
  • JobTracker

其中 Cassandra Node 负责实时数据读写和海量文件的存储(HDFS),TaskTracker 和 JobTracker 负责海量计算(MapReduce)。

每个模块的功能图示如下:

Brisk 单机部署

环境配置

下载 brisk-1.0~beta2-bin.tar.gz,jdk6 并解压。

配置环境变量

复制代码
export JAVA_HOME=/home/aaron/jdk1.6.0_25
export BRISK_HOME=/home/aaron/brisk-1.0~beta2
export PATH=$JAVA_HOME/bin::$BRISK_HOME/bin:$PATH

修改 Cassandra 中数据存放的目录配置参数文件:$BRISK_HOME /resources/cassandra/conf/cassandra.yaml

复制代码
# directories where Cassandra should store data on disk.
data_file_directories:
- /var/lib/cassandra/data
# commit log
commitlog_directory: /var/lib/cassandra/commitlog
# saved caches
saved_caches_directory: /var/lib/cassandra/saved_caches

将上面的路径修改为合适的路径,如:

复制代码
# directories where Cassandra should store data on disk.
data_file_directories:
- /home/aaron/brisk-1.0~beta2/resources/cassandra/data
# commit log
commitlog_directory: /home/aaron/brisk-1.0~beta2/resources/cassandra/commitlog
# saved caches
saved_caches_directory: /home/aaron/brisk-1.0~beta2/resources/cassandra/saved_caches

修改 Cassandra 中日志存放的目录配置参数文件:$BRISK_HOME/resources/cassandra/conf/log4j-server.properties

复制代码
# Edit the next line to point to your logs directory

log4j.appender.R.File=/var/log/cassandra/system.log

将上面的路径修改为合适的路径,如:

复制代码
# Edit the next line to point to your logs directory
log4j.appender.R.File=/home/aaron/brisk-1.0~beta2/resources/cassandra/system.log

安装 JNA(可选)

下载 jna.jar,并放到 $BRISK_HOME/resources/cassandra/lib 目录中。

修改 /etc/security/limits.conf,加入如下内容:

复制代码
$USER soft memlockunlimited
$USER hard memlock unlimited

其中 $USER 为实际运行 Brisk 的用户名称。

启动 Brisk

在命令行中执行如下命令即可:

复制代码
briskcassandra -t

使用 CassandraFS

CassandraFS 的使用与 HDFS 一致,唯一的区别在于命令行多了一个 brisk 的前缀。

如创建一个文件夹 /test。

在 HDFS 中的命令为:

复制代码
hadoopfs –mkdir /test
<p> 在 CassandraFS 中执行的命令为:</p><p>briskhadoopfs –mkdir /test</p>

Brisk 集群部署

本文将配置 3 台服务器进行说明示例:

  • 192.168.104.139
  • 192.168.104.142
  • 192.168.104.143

环境配置

每台服务器在单机部署的基础之上,还需要修改 Cassandra 的配置文件 resources/cassandra/conf/cassandra.yaml

复制代码
cluster_name: 'BriskTest'
initial_token:
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.104.139,192.168.104.142,192.168.104.143"
#每台服务器需要填写实际的 ip 地址
listen_address: 192.168.104.139

启动 Brisk

在每台服务器的命令行中执行如下命令即可:

复制代码
briskcassandra–t

在启动之后,可以通过下面的命令查看到集群的状态,如果所有的服务器节点都加入到环中,并且状态为 Up,说明所有的服务器都正常启动了:

复制代码
aaron@t01:~/brisk-1.0~beta2/resources/cassandra$ sh bin/nodetool -h 192.168.104.139 -p 7199 ring
Address DC Rack Status State Load Owns Token
98783511047116141127937631965326696126
192.168.104.142 Brisk rack1 Up Normal 76.4 KB 80.25% 65174827350587778232091121501149362614
192.168.104.139 Brisk rack1 Up Normal 66.2 KB 13.78% 88615937102692658579489875256308528421
192.168.104.143 Brisk rack1 Up Normal 66.2 KB 5.98% 98783511047116141127937631965326696126

CassandraFS 工作原理

CassandraFS 的实现非常精简巧妙,是基于 Cassandra0.8.1 和 Hadoop 0.20.203 的实现,并在此之上做了简单的扩展实现的。。

Cassandra 改动

为了让 Cassandra 能够支持文件存储的功能,Brisk 在 thrift 接口文件($BRISK_HOME/interface/brisk.thrift)中定义了支持类似 HDFS 中分块存储文件的基本功能接口:

复制代码
LocalOrRemoteBlockget_cfs_sblock(
1:required string caller_host_name,
2:required binary block_id,
3:required binary sblock_id,
4:i32 offset=0,
5:required StorageTypestorageType)
throws (
1:InvalidRequestException ire,
2:UnavailableException ue,
3:TimedOutException te,
4:NotFoundException nfe)

为了能够实现这个接口,Brisk 又修改 Cassandra 的启动脚本($BRISK_HOME/resources/cassandra/bin/Cassandra)逻辑:

将默认的启动主类:

复制代码
classname="org.apache.cassandra.thrift.CassandraDaemon"

修改为:

复制代码
classname="com.datastax.brisk.BriskDaemon"

新的启动主类 com.datastax.brisk.BriskDaemon 在实现原有接口(cassandra.thrift)的基础之上,而外实现了 brisk.thrift 中定义的 get_cfs_sblock 接口。

Cassadnra 中定义了新的 keyspace 存储文件的元数据信息和数据块信息:

复制代码
Keyspace: cfs:
Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy
Durable Writes: true
Options: [Brisk:1, Cassandra:0]

其中存储文件的元数据信息 ColumnFamily 的定义如下:

复制代码
ColumnFamily: inode
"Stores file meta data"
Key Validation Class: org.apache.cassandra.db.marshal.BytesType
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Columns sorted by: org.apache.cassandra.db.marshal.BytesType
Row cache size / save period in seconds: 0.0/0
Key cache size / save period in seconds: 1000000.0/14400
Memtable thresholds: 0.103125/128/1 (millions of ops/MB/minutes)
GC grace seconds: 60
Compaction min/max thresholds: 4/32
Read repair chance: 1.0
Replicate on write: false
Built indexes: [inode.parent_path, inode.path, inode.sentinel]
Column Metadata:
Column Name: parent_path (706172656e745f70617468)
Validation Class: org.apache.cassandra.db.marshal.BytesType
Index Name: parent_path
Index Type: KEYS
Column Name: path (70617468)
Validation Class: org.apache.cassandra.db.marshal.BytesType
Index Name: path
Index Type: KEYS
Column Name: sentinel (73656e74696e656c)
Validation Class: org.apache.cassandra.db.marshal.BytesType
Index Name: sentinel
Index Type: KEYS

其中存储文件的数据块信息 ColumnFamily 的定义如下:

复制代码
ColumnFamily: sblocks
"Stores blocks of information associated with a inode"
Key Validation Class: org.apache.cassandra.db.marshal.BytesType
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Columns sorted by: org.apache.cassandra.db.marshal.BytesType
Row cache size / save period in seconds: 0.0/0
Key cache size / save period in seconds: 1000000.0/14400
Memtable thresholds: 0.103125/128/1 (millions of ops/MB/minutes)
GC grace seconds: 60
Compaction min/max thresholds: 16/64
Read repair chance: 1.0
Replicate on write: false
Built indexes: []

Hadoop 改动

在 Hadoop 的默认配置(core-default.xml)中,定义了 hdfs 文件类型的实现:

复制代码
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>

为了能够提供 Cassandra 特有的文件系统实现,Brisk 将 hadoop 默认的 hdfs 文件类型修改为了 cfs 文件类型,其在 core-site.xml 文件中的配置重置了默认配置:

复制代码
<property>
<name>fs.cfs.impl</name>
<value>org.apache.cassandra.hadoop.fs.CassandraFileSystem</value>
</property>
<property>
<name>fs.cfs-archive.impl</name>
<value>org.apache.cassandra.hadoop.fs.CassandraFileSystem</value>
</property>

其中 org.apache.cassandra.hadoop.fs.CassandraFileSystem 与 HDFS 中默认的实现 org.apache.hadoop.hdfs.DistributedFileSystem 一样,都继承于 Hadoop 通用的文件接口基类 org.apache.hadoop.fs.FileSystem,所有能够保证接口的兼容性。

此外,Brisk 还修改了 HDFS 中默认使用的文件类型:

复制代码
<property>
<name>fs.default.name</name>
<value>cfs:///</value>
</property>

所以在当我们在 Brisk 环境中调用 HDFS 的操作时,都将定向到 cfs 的实现,如:

复制代码
briskhadoopfs -ls /test

将相应地转化为:

复制代码
briskhadoopfs -ls cfs:///test

org.apache.cassandra.hadoop.fs.CassandraFileSystem 中所有文件的操作都是通过调用 Brisk 中提供的 get_cfs_sblock 接口服务来实现读写操作的,通过整合这些模块,从而完成了利用 Cassandra 替换 HDFS 的需求。

不过目前 CassandraFS 实现和 HDFS 的实现还是有一些区别的,比如不支持权限,不支持追加写入等等。

关于作者

郭鹏,《Cassandra 实战》作者,爱好 NoSQL 以及 Hadoop 相关的开源产品。


感谢张凯峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2011-11-14 00:003220

评论

发布
暂无评论
发现更多内容

Libra白皮书解读

程序那些事

区块链 facebook 数字货币 libra

由一次管理后台定时推送功能引发的对RabbitMQ延迟队列的思考(一)

LSJ

Java RabbitMQ 延迟队列

LeetCode 756. Pyramid Transition Matrix

liu_liu

LeetCode

架构师训练营第一周作业

Benjamin

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-动态测试

编程道与术

Java 编程 TDD 单元测试 JUnit

Zookeeper-Access Control List(ACL)

CoderLi

Java zookeeper 源码分析 后端

大中台模式下如何构建复杂业务核心状态机组件

古月木易

Kafka零数据丢失的配置方案

奈学教育

kafka

做产品少走弯路:上帝视角(2)

我是IT民工

产品 方法 路径 知识体系

小师妹学JavaIO之:NIO中那些奇怪的Buffer

程序那些事

io nio Java 25 周年 小师妹 buffer

白话说流——什么是流,从批认识流(二)

KAMI

大数据 flink 流计算

你不能不掌握的软技能——业务语言

KAMI

方法论 开发 沟通 软技能

k8s 上运行我们的 springboot 服务之——自动化测试

柠檬

maven DevOps Unit Test

[翻译]The Go Blog《Go maps in action》

卓丁

hashmap map 哈希表 Go 语言

ARTS WEEK3

紫枫

ARTS 打卡计划

《Golang工具go doc使用透析》

卓丁

godoc go doc 源码阅读 Go 语言

Libra教程之:Libra协议的关键概念

程序那些事

区块链 libra blockchain 协议

读《你的灯还亮着吗》

liu_liu

读书感悟

[转载]Go 和 Java的15个主要差异

卓丁

Java Go 语言

公司治理的两个关键要素:存在的基石 + 成长的飞轮

霍太稳@极客邦科技

发展 公司管理 增长

Zookeeper 序列化

CoderLi

Java zookeeper 源码分析 后端

互金总结系列(1)--开篇

互金从业者X

SpringMVC中Http请求方式转换(post转换为put/delete等方式)

知春秋

springmvc post post到put方式请求 post到delete方式请求

食堂就餐卡系统架构设计文档

dony.zhang

拙见/ 什么是自驱力?

ZoomQuiet大妈

自我提升 大妈 是也乎 IMHO 蟒营®

如何用日记提升写作能力?

石云升

学习 方法 写作

游戏夜读 | 如何面对前景渺茫?

game1night

如何基于 OAM 编写一个扩展 Trait?

钱王骞

云原生 k8s OAM

大中台模式下如何构建复杂业务核心状态机组件

奈学教育

中台

算法基础:排序算法看这一篇就够了

公众号:好奇心森林

排序算法

[架构师训练营] Week01 - 食堂就餐卡系统设计

谭方敏

学习

Brisk之CassandraFS_架构_郭鹏_InfoQ精选文章