首页 > 范文大全 > 正文

Hadoop整合Cassandra处理海量数据

开篇:润墨网以专业的文秘视角,为您筛选了一篇Hadoop整合Cassandra处理海量数据范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:hadoop作为开源组织Apache的一个分布式计算开源框架,可高效的对海量数据进行运算和处理,可以应对互联网上数以千万计的并发处理和访问,但其不支持数据的实时读写和修改。Cassandra是一款面向列的功能强大的Key-Value分布式数据库系统,具有良好的实时读写性能和可扩展性,但缺乏对海量数据进行分析运算的能力。将Hadoop与Cassandra结合起来,取长补短,就能为云计算模型的实施提供一个高效的切实可行的方案。该文首先阐述了Hadoop整合cassandra处理海量数据的必要性,然后提出了具体的整合方案和实现,最后总结了Hadoop整合Cassandra所遇到的主要问题。

关键词:键值;云计算;集群

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)07-1491-03

在当今这个信息爆炸的时代,互联网上的数据访问量正以几何级数的速度增长,提高对海量数据的访问和处理的需求变得日益迫切。“云计算”技术的出现使得快捷高效完成TB乃至PB级的数据挖掘成为可能。Google公司以Map/Reduce为基础,结合GFS、Bigtable已经成为全球互联网搜索引擎的翘楚,而Google取得成功的关键恰恰是因为其是最早也是最成功的“云计算”理念的实践者,但Google公司出于技术保护并没有开放其云计算模型的实现细节。

Hadoop作为Apache组织中一个专注于DFS和Map/Reduce的开源项目,完成了对Google的MapReduce编程模型、GFS分布式文件系统等云计算模型核心技术的开源实现,使得全球数以万计的开发者和众多实力雄厚的软件厂商开启了基于Hadoop研发“云计算”模型和应用的技术浪潮。

1 Hadoop整合Cassandra的必要性

1.1 Hadoop的特性

Hadoop是Apache开源组织的一个能够对行量数据进行分布式处理的软件框架,源于Lucene和Nutch两个开源项目,其核心技术是Map/Reduce和HDFS,分别是对Google的MapReduce和GFS的开源实现。基于Hadoop可以轻松的编写可处理海量数据的分布式并行程序,并将其运行于由成百上千个节点组成的大规模计算机集群上。

Hadoop的主要特性包括:

1)Hadoop的Map/Reduce能够运行在由数量庞大的商用服务器组成的大型集群上,可对TB级数据以可靠容错的方式进行复杂分析运算和并行处理。

2)Hadoop的分布式文件系统HDFS是一个具有高度容错性能的系统,它不但具有良好的错误检测功能还可以快速自动的进行数据恢复。HDFS被设计可以存取TB级的数据,适合部署在由大量廉价计算机所组成的大规模集群上。

Hadoop的主要缺点是其虽然拥有自己的分布式文件系统HDFS,但HDFS的实时读写性能较差,在并发性和可扩展性方面也较为欠缺,这就使得长于运算能力的Hadoop迫切的需要找到一个能够很好的支持并发处理并且拥有良好的实时存取能力和可扩展性的数据存储系统。

1.2 Cassandra的特性

Cassandra最初是由Facebook开发的一套开源的分布式键值数据库系统,它同时具备了Google BigTable的数据模型和Amazon Dynamo的完全分布式架构,具有良好的可扩展性,目前被很多大型的Web2.0网站所使用,是一种流行的分布式结构化数据存储方案。

Cassandra的主要特性包括:

(1)数据具备最终一致性,集群整体的可用性高。

(2)分层数据压缩,能够有效地减少数据体积,同时也能减少磁盘I/O。

(3)高可用、可扩展,无中心节点设计使得单点故障不影响集群服务,集群性能可线性扩展。

Cassandra的主要缺点是其虽然支持Map/Reduce计算,但自身并没有包含Map/Reduce功能,因此也就不具备自己对数据进行复杂分析运算的能力,需要借助于其他分布式计算工具才可以。

1.3 Hadoop与Cassandra取长补短

Cassandra是一个功能非常强大的海量数据存储系统,但它的劣势是缺乏对海量数据进行分析的能力,而Hadoop虽然提供了海量存储的能力,但是数据存储的特点是一次写入、多次读取,不支持数据的修改,因此无法实现实时读写。所以,可以将Cassandra存储的能力与Hadoop Map/Reduce计算的能力进行整合。Cassandra提供底层的存储,支持数据的实时读写,Hadoop提供批量计算的能力,将Cassandra中的数据批量加载到mapper和reducer中进行计算,得出最终的结果。

2 Hadoop整合Cassandra实施方案

Hadoop整合Cassandra就是两者互相取长补短的过程,即将Hadoop Map/Reduce的计算能力和Cassandra的存储能力进行结合。具体实施方案可以概括为,先将待处理的海量非结构化数据通过Hadoop Map/Reduce导入到Key-Value数据库Cassandra中,以实现数据的实时存取,解决Hadoop的HDFS存储能力欠缺的问题;然后,当需要对海量非结构化数据进行数据分析时再将Cassandra中存储的数据作为输入通过Hadoop Map/Reduce进行计算得出结果。这样一来既发挥了Hadoop与Cassandra各自的优势,又摒弃了二者的不足,从而相得益彰。

2.1使用Map/Reduce将Hadoop海量数据导入Cassandra中

通过Map/Reduce程序,可以将Hadoop分布式文件系统中的海量文件批量导入Cassandra中以实现实时存取。例如某通信系统需要记录每个客户的通话时长,所以客户的通话时长(以秒为单位)数据实时写入Cassandra系统中,并且数据分析人员可以在任意时刻启动Map/Reduce分析程序,从Cassandra中读取客户的通话时长数据进行统计分析。

通信系统按照客户某天某一小时划分,客户通信记录文件CallRecord.txt文件格式如下:

18023509018 - 800

数据文件CallRecord.txt的每一行中,“”符号前是客户使用的手机号,“”符号后是客户使用该手机号的通话时长。存储呼叫者通话时长的ColumnFamily可以采用Standard类型,Column排序规则为TimeUUIDType,Row的key为呼叫者的手机号码,Column的值为通话时长。

Cassandra默认的ColumnFamily在Cassandra/conf/schema.example.txt文件中定义,也可自定义ColumnFamily即在Cassandra/conf目录下新建schema.txt,内容如下:

create keyspace MyKeyspace1

with replication_factor = 1 …

2.1.1 编写Map/Reduce程序

根据需求,在map过程中需要拆分CallRecord.txt文件中的数据,提取出呼叫者的手机号码和对应通话时长。在map完成之后,关闭Thrift客户端,释放占用的资源。以下是MapReduce程序CallRecord.java的代码组成:

1)编写mapper函数

在mapper中,需要先初始化Thrift客户端,设置使用的Keyspace,以将数据写入Cassandra服务器中,实现逻辑如下:

tr.open();

cassandraClient.setKeyspace(“MyKeyspace1”);

初始化Thrift客户端后,在mapper函数中拆分输入数据,找出呼叫者手机号码和对应通话时长,构建需要插入Cassandra的Column,实现逻辑如下:

cassandraClient.insert(

ByteBuffer.wrap(mobileNum.getBytes(“utf-8”)),cp,c,ConsistencyLevel.ONE);

在mapper函数执行完毕后,还需要将Thrift客户端关闭,释放占用资源。

super.close();

本程序只需编写mapper函数即可,所以在Map/ Reduce程序的运行设置中将Reduce的个数设置为0,这样就不会执行Reduce流程了。

conf.setNumReduceTasks(0);

2.1.2 打包运行Map/Reduce程序

将CallRecord程序代码打成JAR包,名为CallRecord.jar,入口类为CallRecord,然后就可以对以上这个Map/Reduce程序进行测试了。

2.2 将Cassandra中的数据作为Map/Reduce输入

当需要对海量非结构化数据进行数据分析计算时,可以使用Map/Reduce程序将Cassandra中存储的某个Keyspace下的Column中的所有数据作为Map/Reduce的数据输入Hadoop,然后由Hadoop得出运算结果。以下是MapReduce程序CallCount.java的代码组成:

2.2.1 编写Map/Reduce程序

1)编写mapper函数

mapper函数中输入的数据为Row的Key,以及该Key对应的所有Column。在通话时长的统计中,只需要关注每一个Column的Value即可。

2.2.2打包运行Map/Reduce程序

将CallRecord程序代码打成JAR包,名为CallCount.jar,入口类为CallCount,然后就可以对以上这个Map/Reduce程序进行测试了

3 整合Hadoop与Cassandra所遇到的主要问题

3.1 数据传输速率降低造成网络阻塞

当数据达到海量级别的时候,应用请求的运算离它操作的数据越近效率就越高。因为这样能降低网络阻塞的影响,提高数据的传输速率和吞吐率。将运算移动到数据附近,比将数据移动到应用所在更好。整合Hadoop与Cassandra虽然解决了数据实时存取与分布式运算分析的问题,但在二者之间的数据相互传输势必会降低整体运行的速率。

3.2 Hadoop与Cassandra版本兼容性问题

Hadoop与Cassandra的整合也会遇到各自不同的版本之间的兼容性问题。例如:Cassandra 0.6.X默认只能与Hadoop0.20.X进行整合,与Hadoop0.19.X整合就要修改Cassandra的源代码支持才可以。

4 结束语

“云计算”时代的到来将势必改变互联网的服务运营模式,甚至是对整个IT领域的发展产生广泛深远的影响。在云计算技术浪潮席卷全球的今天,无论对于微软、谷歌之类的IT巨头还是广大的中小软件企业,这都是一个拓宽自身发展空间的绝佳机会。Hadoop作为当今分布式计算领域最为成功的开源框架,与可靠性和可扩展性俱佳的Cassandra键值数据库相结合,发挥各自在分析计算与海量存取方面的优势,将为在开源领域部署云计算应用开创一种全新的切实有效的技术模式。

参考文献:

[1] 邓倩妮,陈全.云计算及其关键技术[J].高性能计算与发展应用,2009,1(26):2-6.

[2] 苏翔宇. Key-Value数据库及其应用研究[J].电脑知识与技术,2012.

[3] 刘鹏.实战Hadoop:开启通向云计算的捷径[M].北京:电子工业出版社,2011:240-269.

[4] 郭鹏.Cassandra实战[M].北京:机械工业出版社, 2011:123-145.