NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:003222

评论

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

一文告诉你为什么时序场景下 TDengine 数据订阅比 Kafka 好

TDengine

时序数据库 #TDengine

High-performance 4-core processor-IPQ9554-IPQ8072-more advanced Wi-Fi 6E technology

wifi6-yiyi

IPQ8072 ipq9554 4-core

fastposter 新版本 v2.17.0 强势发布!让海报开发更简单

物有本末

图片处理 海报生成器 海报生成 海报小程序

2023年8款最佳云数据库综合比较

Geek_cbbf33

3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT

华为云开发者联盟

鸿蒙 物联网 华为云 华为云开发者联盟 企业号9月PK榜

区块链去中化钱包开发方案,交易所钱包和元宇宙软件开发

V\TG【ch3nguang】

面对IT部门和业务部门跨网文件交换的不同需求,怎样才能兼顾呢?

镭速

跨网文件交换

FIL NEW算力挖矿系统开发

l8l259l3365

基于异常上线场景的实时拦截与问题分发策略

百度Geek说

大数据 实时计算 企业号9月PK榜 反混淆

强大但并非万能,智能客服之挑战

百度开发者中心

智能客服 #人工智能 千帆大模型平台

详述 IntelliJ IDEA 中自动生成 serialVersionUID 的方法

南屿

IntelliJ IDEA IntelliJ IDEA 2023破解 Serializable

区块链数字货币交易所开发方案,去中化交易平台搭建

V\TG【ch3nguang】

OpenHarmony Meetup常州站招募令

OpenHarmony开发者

OpenHarmony

软通咨询杨念农:咨询2.0是企业数字化转型的大脑

软通咨询

数字化转型 #人工智能 管理咨询 数字化转型咨询

专业级PDF编辑和管理 Acrobat Pro DC 2023 for Mac

胖墩儿不胖y

Mac软件 pdf编辑器 编辑pdf pdf工具

市面上支持信创的堡垒机哪家好?为什么?

行云管家

网络安全 信创 数据安全 堡垒机

专业开发区块链DAPP去中心化系统模式开发系统定制

V\TG【ch3nguang】

文心一言 VS 讯飞星火 VS chatgpt (96)-- 算法导论9.3 1题

福大大架构师每日一题

福大大架构师每日一题

Markdown文本编辑器Typora Mac使用教程

南屿

Typora Markdown 编辑器

什么是高匿代理,与普匿和透明代理的区别是什么?它有什么作用?

巨量HTTP

代理IP http代理

数字货币swap交易所逻辑系统开发分析方案

西安链酷科技

交易所开发 DAPP智能合约交易系统开发

百度智能云引领建设智能云标准生态,第十二届云计算标准和应用大会成功召开

Baidu AICLOUD

智能云 大模型 AI 原生云

未来AI领域的颠覆性力量

百度开发者中心

自然语言 #人工智能 文心一言

Tugraph Analytics图计算快速上手之紧密中心度算法

TuGraphAnalytics

cc 图计算 紧密中心度

CodeArts Check代码检查服务用户声音反馈集锦(3)

华为云PaaS服务小智

云计算 代码质量 华为云 代码检查

优化Java代码效率和算法设计,提升性能

互联网工科生

Java 并发编程 性能测试 数据结构和算法

行云管家支持信创吗?是真的吗?

行云管家

信创 国产化 行云管家

万能音视频转换器 Permute 3 for mac免激活中文版

mac大玩家j

Mac软件 音频格式转换器 音频转换

termius使用ssh教程 【XShell的神器Termius】

南屿

SSH Termius

HarmonyOS Codelab样例—弹窗基本使用

HarmonyOS开发者

HarmonyOS

数字化转型与架构-架构设计篇|什么是架构风格和架构模式?

数字随行

数字化转型

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