我的废话:
本文提供代码示例,但是不讲述mapreduce对hbase代码层面的细节,主要讲述我片面的理解和体会。
最近看见medialets(ref)在网站架构中提到对mapreduce使用的经验分享,采用hdfs作为mapreduce分布式计算的基础环境,基于python的mapreduce框架计算具体的内容,将计算的结果写入mongodb中存储,对外宣称每秒1可以处理百万级的业务事件,可见mapreduce的运用场景在越来越多的丰富起来,说明除了google和yahoo这样的超大型互联网公司以外,更多的中小门户都对mapreduce和hadoop开始产生兴趣,使用hadoop的mapreduce分布式计算的场景将和我们越来越近。
hadoop map/reduce的框架的确简单易懂,基于他开发的应用程序能够运行在上千个机器组成的大型集群上,或者说mapreduce是一种“蛮力”计算,在一定程度上机器数量越多,得到的效果越显著,而且mapreduce提供了一种可靠容错的方式可并行处理上t级别的数据集。
在现实场景中执行一个map/reduce作业(job)会把input的数据分为多个数据块(就像下面图中左边的黄色小块),mappertask以分布式并行的方式处理这些输入的数据。mapreduce框架会对map的输出先排序, 再map把计算结果输入给reduce最终对计算结果合并输出。
集群环境中的mapreduce计算节点失效转发、 分布式存储,工作调度,容错处理,网络通信,负载均衡 等问题不用开发者去考虑,mapreduce框架和mapreduce运行环境早就为此做出的考虑,如下图所示 在集群环境中有一个master负责调度构成一个作业的所有任务,大量的任务存在master的task queue里面,将这些任务分配在不同的slave上,master监控它们的执行 如果任务执行失败,由master指派slave(work)重新执行任务,如图所示:
通常作业的输入和输出都会被存储在文件系统hdfs中,也就是说,通常mapreduce框架和分布式文件系统是运行在一组相同的节点上的,允许在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。mapreduce框架由一个单独的jobtracker(master)和很多个tasktracker(slave)集群节点一个共同组成。
在mapreduce客户端的代码需要指明输入/输出的位置(文件路径/db/nosql),客户端再加上作业的参数,就构成了作业配置(job configuration),客户端代码需要定义map和reduce方法通过实现合适的抽象类,并在实现的方法中编写你的业务逻辑,在客户端程序中还要定义你的map/reduce输入和输出的类型,当hadoop的 job client提交作业(jar包/class/可执行程序等)和配置信息给jobtracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。至于客户端job提交后的工作流程就是hadoop的事情了,分为4个过程,输入| 切分、排序、洗牌,合并 | 输出 ,输出的结果是有序的,因为mapreduce框架是天然排序的。如图所示:
mapreduce把数据集的操作分散到网络节点上,每个节点会周期性的把执行状态报告回,当某个节点连接或者计算超时达到一定次数,主节点记录下这个节点状态为死亡状态,并且分配给这个节点的任务发到别的节点上运行,例如apache的hive就是一个mapreduce框架的实现,hive可以将sql语句转换为 mapreduce任务把执行的sql分散到每台机器上运行,最后返回计算结果。
我写了一个代码示例,这个示例通过mapreduce框架从文件夹中读取数据,进过格式化、对内容的加工,再写入hbase的的程序。当输入后根据输入的条件和状态产生多个mapper(maptask)处理输入的内容,mapper先是从目录中读取所有文件信息,然后加工进行格式化,这一切都处理完成之后,将计算的结果交给reducer去执行,reducer根据客户端定义的输入类型做出对应的操作,将最终的结果存入hbase中。
示例例说明:
有一个 input 的输入目录,里面有3个文件 1.txt/2.txt/3.txt,需要在hbase中建立一张 tab1表,f1 是列名称,然后运行代码示例,最后在hbase查看到3个txt中的数据全部写入hbase中。运行的过程中可以在eclipse的控制台上看见,先读取/格式化数据,最后写入hbase中的效果,如图所示:
reduce的计算结果,如图:
代码示例下载地址:http://javabloger-mini-books.googlecode.com/files/txt-to-hbase.rar
通过这个例子可以假定一种场景,例如百度文库,每时每刻都有成千上万的人向百度的服务器上传文件,需要做到在最短的时间内对不同格式的文档进行处理、格式化,最终保存起来。前端服务器拿到用户上传的文档后,就像这个例子中x:\input下的3个文件,对于百度文库的运行场景来说也许是3w个,将大量的文档全部扔给mapreduce,mapreduce把需要解析、排版、格式化的文档交给每个分布的hadoop节点,将计算压力分布在多个cpu上进行计算,因为多人力量大的原因很快将能把3w个文档处理完毕,并且保存数据库/nosql,用户可以立刻在线阅读到刚刚上传的文档。
在离线的场景中通过mapreduce写入hbase还可以采用另外一种方式,先将文档扔给mapreduce,然后通过hfileoutputformat输出hbase的数据文件,最后通过hbase 工具将数据文件导入到hbase中,对于海量数据的迁移可以考虑这样的方式,在这种方案的基础上hbase官方提供了importtsv 工具 可以参考hbase的官方文档(ref)。
我的废话:
最近有一个项目需要对 国内最大的网络设备供应商 提供方案实施,该项目主要针对android平台上的联系人功能进行扩展,比如2个客户端都安装这个联系人软件可以发送免费短信,类似现在的飞信、kiki,该产品还会向中国以外的市场推广,一旦二期上线用户的数量级将达到上千万,很可能产生大量的离线消息,打算采用hbase对用户的离线消息进行存储,在这点上不折不扣的向facebook学习了一把。
相关文章:
hbase入门6 -白话mysql(rdbms)与hbase之间
lily-建立在hbase上的分布式搜索
mysql向hive/hbase的迁移工具
hbase入门5(集群) -压力分载与失效转发
hive入门3–hive与hbase的整合
hbase入门篇4
hbase入门篇3
hbase入门篇2-java操作hbase例子
hbase入门篇
基于hbase存储的分布式消息(im)系统-jabase
hbase入门7 -安全&权限
–end–
原文地址:mapreduce操作hbase, 感谢原作者分享。
