东莞数据线厂家东莞网站建设,投资者互动平台官网,微信扫描 WordPress,成都flash互动网站开发从hadoop框架与MapReduce模式中谈海量数据处理前言几周前#xff0c;当我最初听到#xff0c;以致后来初次接触Hadoop与MapReduce这两个东西#xff0c;我便稍显兴奋#xff0c;认为它们非常是神奇#xff0c;而神奇的东西常能勾起我的兴趣#xff0c;在看过介绍它们的文… 从hadoop框架与MapReduce模式中谈海量数据处理前言 几周前当我最初听到以致后来初次接触Hadoop与MapReduce这两个东西我便稍显兴奋认为它们非常是神奇而神奇的东西常能勾起我的兴趣在看过介绍它们的文章或论文之后认为Hadoop是一项富有趣味和挑战性的技术且它还牵扯到了一个我更加感兴趣的话题海量数据处理。 由此近期凡是空暇时便在看“Hadoop”“MapReduce”“海量数据处理”这方面的论文。但在看论文的过程中总认为那些论文都是浅尝辄止经常看的非常只是瘾总是一个东西刚要讲到紧要处它便结束了让我好生“愤懑”。 虽然我对这个Hadoop与MapReduce知之甚浅但我还是想记录自己的学习过程说不定关于这个东西的学习能督促我终于写成和“经典算法研究系列”一般的一系列文章。 Ok闲话少说。本文从最主要的mapreduce模式Hadoop框架開始谈起然后由各自的架构引申开来谈到海量数据处理最后谈谈淘宝的海量数据产品技术架构以为了兼备浅出与深入之效终于希望得到读者的喜欢与支持。谢谢。 因为本人是初次接触这两个东西文章有不论什么问题欢迎不吝指正。Ok咱们開始吧。第一部分、mapreduce模式与hadoop框架深入浅出架构扼要 想读懂此文读者必须先要明白以下几点以作为阅读兴许内容的基础知识储备Mapreduce是一种模式。Hadoop是一种框架。Hadoop是一个实现了mapreduce模式的开源的分布式并行编程框架。 所以你如今知道了什么是mapreduce什么是hadoop以及这两者之间最简单的联系而本文的主旨即是一句话概括在hadoop的框架上採取mapreduce的模式处理海量数据。以下咱们能够依次深入学习和了解mapreduce和hadoop这两个东西了。Mapreduce模式 前面说了mapreduce是一种模式一种什么模式呢?一种云计算的核心计算模式一种分布式运算技术也是简化的分布式编程模式它主要用于解决这个问题的程序开发模型也是开发人员拆解问题的方法。 Ok光说不上图没用。例如以下图所看到的mapreduce模式的主要思想是将自己主动切割要执行的问题比如程序拆解成map映射和reduce化简的方式流程图例如以下图1所看到的 在数据被切割后通过Map 函数的程序将数据映射成不同的区块分配给计算机机群处理达到分布式运算的效果在通过Reduce 函数的程序将结果汇整从而输出开发人员须要的结果。 MapReduce 借鉴了函数式程序设计语言的设计思想其软件实现是指定一个Map 函数把键值对(key/value)映射成新的键值对(key/value)形成一系列中间结果形式的key/value 对然后把它们传给Reduce(规约)函数把具有同样中间形式key 的value 合并在一起。Map 和Reduce 函数具有一定的关联性。函数描写叙述如表1 所看到的 MapReduce致力于解决大规模数据处理的问题因此在设计之初就考虑了数据的局部性原理利用局部性原理将整个问题分而治之。MapReduce集群由普通PC机构成为无共享式架构。在处理之前将数据集分布至各个节点。处理时每个节点就近读取本地存储的数据处理map将处理后的数据进行合并combine、排序shuffle and sort后再分发至reduce节点避免了大量数据的传输提高了处理效率。无共享式架构的还有一个优点是配合复制replication策略集群能够具有良好的容错性一部分节点的down机对集群的正常工作不会造成影响。 ok你能够再简单看看下副图整幅图是有关hadoop的作业调优參数及原理图的左边是MapTask执行示意图右边是ReduceTask执行示意图 如上图所看到的当中map阶段当map task開始运算并产生中间数据后并不是直接而简单的写入磁盘它首先利用内存buffer来对已经产生的buffer进行缓存并在内存buffer中进行一些预排序来优化整个map的性能。而上图右边的reduce阶段则经历了三个阶段分别Copy-Sort-reduce。我们能明显的看出当中的Sort是採用的归并排序即merge sort。 了解了什么是mapreduce接下来咱们能够来了解实现了mapreduce模式的开源框架—hadoop。Hadoop框架 前面说了hadoop是一个框架一个什么样的框架呢?Hadoop 是一个实现了MapReduce 计算模型的开源分布式并行编程框架程序猿能够借助Hadoop 编敲代码将所编写的程序执行于计算机机群上从而实现对海量数据的处理。 此外Hadoop 还提供一个分布式文件系统(HDFS及分布式数据库HBase用来将数据存储或部署到各个计算节点上。所以你能够大致认为HadoopHDFS文件系统数据存储技术相关HBase数据库MapReduce数据处理。Hadoop 框架如图2 所看到的 借助Hadoop 框架及云计算核心技术MapReduce 来实现数据的计算和存储而且将HDFS 分布式文件系统和HBase 分布式数据库非常好的融入到云计算框架中从而实现云计算的分布式、并行计算和存储而且得以实现非常好的处理大规模数据的能力。Hadoop的组成部分 我们已经知道Hadoop是Google的MapReduce一个Java实现。MapReduce是一种简化的分布式编程模式让程序自己主动分布到一个由普通机器组成的超大集群上并发执行。Hadoop主要由HDFS、MapReduce和HBase等组成。详细的hadoop的组成例如以下图 由上图我们能够看到 1、 Hadoop HDFS是Google GFS存储系统的开源实现主要应用场景是作为并行计算环境MapReduce的基础组件同一时候也是BigTable如HBase、HyperTable的底层分布式文件系统。HDFS採用master/slave架构。一个HDFS集群是有由一个Namenode和一定数目的Datanode组成。Namenode是一个中心server负责管理文件系统的namespace和client对文件的訪问。Datanode在集群中通常是一个节点一个负责管理节点上它们附带的存储。在内部一个文件事实上分成一个或多个block这些block存储在Datanode集合里。例如以下图所看到的HDFS体系结构图 2、 Hadoop MapReduce是一个使用简易的软件框架基于它写出来的应用程序能够执行在由上千个商用机器组成的大型集群上并以一种可靠容错的方式并行处理上TB级别的数据集。 一个MapReduce作业job一般会把输入的数据集切分为若干独立的数据块由 Map任务task以全然并行的方式处理它们。框架会对Map的输出先进行排序然后把结果输入给Reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控以及又一次执行已经失败的任务。例如以下图所看到的Hadoop MapReduce处理流程图 3、 Hive是基于Hadoop的一个数据仓库工具处理能力强而且成本低廉。主要特点存储方式是将结构化的数据文件映射为一张数据库表。提供类SQL语言实现完整的SQL查询功能。能够将SQL语句转换为MapReduce任务执行十分适合数据仓库的统计分析。不足之处採用行存储的方式SequenceFile来存储和读取数据。效率低当要读取数据表某一列数据时须要先取出全部数据然后再提取出某一列的数据效率非常低。同一时候它还占用较多的磁盘空间。因为以上的不足有人查礼博士介绍了一种将分布式数据处理系统中以记录为单位的存储结构变为以列为单位的存储结构进而降低磁盘訪问数量提高查询处理性能。这样因为同样属性值具有同样数据类型和相近的数据特性以属性值为单位进行压缩存储的压缩比更高能节省很多其它的存储空间。例如以下图所看到的行列存储的比較图4、 HBase HBase是一个分布式的、面向列的开源数据库它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库。还有一个不同的是HBase基于列的而不是基于行的模式。HBase使用和 BigTable非常同样的数据模型。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和随意数量的列一个或多个列组成一个ColumnFamily一个Fmaily下的列位于一个HFile中易于缓存数据。表是疏松的存储的因此用户能够给行定义各种不同的列。在HBase中数据按主键排序同一时候表按主键划分为多个HRegion例如以下图所看到的HBase数据表结构图 Ok行文至此看似洋洋洒洒近千里但若给读者造成阅读上的负担则不是我本意。接下来的内容我不会再引用诸多繁杂的专业术语以给读者心里上造成不良影响。 我再给出一副图算是对上文所说的hadoop框架及其组成部分做个总结例如以下图所看到的便是hadoop的内部结构我们能够看到海量的数据交给hadoop处理后在hadoop的内部中正如上文所述hadoop提供一个分布式文件系统HDFS及分布式数据库Hbase用来存储或部署到各个计算点上终于在内部採取mapreduce的模式对其数据进行处理然后输出处理结果第二部分、淘宝海量数据产品技术架构解读—学习海量数据处理经验 在上面的本文的第一部分中我们已经对mapreduce模式及hadoop框架有了一个深入而全面的了解。只是假设一个东西或者一个概念不放到实际应用中去那么你对这个理念永远仅仅是停留在理论之内无法向实践迈进。 Ok接下来本文的第二部分咱们以淘宝的数据魔方技术架构为依托通过介绍淘宝的海量数据产品技术架构来进一步学习和了解海量数据处理的经验。淘宝海量数据产品技术架构 例如以下图2-1所看到的即是淘宝的海量数据产品技术架构咱们以下要针对这个架构来一一剖析与解读。 相信看过本博客内其它文章的细心读者定会发现图2-1最初见于本博客内的此篇文章从几幅架构图中偷得半点海量数据处理经验之上同一时候此图2-1最初发表于《程序猿》8月刊作者朋春。 在此之前有一点必须说明的是本文以下的内容大都是參考自朋春先生的这篇文章淘宝数据魔方技术架构解析所写我个人所作的工作是对这篇文章的一种解读与关键技术和内容的抽取以为读者更好的理解淘宝的海量数据产品技术架构。与此同一时候还能展示我自己读此篇的思路与感悟顺带学习何乐而不为呢?。 Ok只是与本博客内之前的那篇文章几幅架构图中偷得半点海量数据处理经验不同本文接下来要详细阐述这个架构。我也做了不少准备工作如把这图2-1打印了下来经常琢磨 图2-1 淘宝海量数据产品技术架构 好的如上图所看到的我们能够看到淘宝的海量数据产品技术架构分为以下五个层次从上至下来看它们各自是数据源计算层存储层查询层和产品层。我们来一一了解这五层数据来源层。存放着淘宝各店的交易数据。在数据源层产生的数据通过DataXDbSync和Timetunel准实时的传输到以下第2点所述的“云梯”。计算层。在这个计算层内淘宝採用的是hadoop集群这个集群我们暂且称之为云梯是计算层的主要组成部分。在云梯上系统每天会对数据产品进行不同的mapreduce计算。存储层。在这一层淘宝採用了两个东西一个使MyFox一个是Prom。MyFox是基于MySQL的分布式关系型数据库的集群Prom是基于hadoop Hbase技术 的读者可别忘了在上文第一部分中咱们介绍到了这个hadoop的组成部分之中的一个Hbase—在hadoop之内的一个分布式的开源数据库的一个NoSQL的存储集群。查询层。在这一层中有一个叫做glider的东西这个glider是以HTTP协议对外提供restful方式的接口。数据产品通过一个唯一的URL来获取到它想要的数据。同一时候数据查询即是通过MyFox来查询的。下文将详细介绍MyFox的数据查询过程。 产品层。简单理解不作过多介绍。 接下来咱们重点来了解第三层-存储层中的MyFox与Prom然后会稍带分析下glide的技术架构最后再了解下缓存。文章即宣告结束。 我们知道关系型数据库在我们如今的工业生产中有着广泛的引用它包含OracleMySQL、DB2、Sybase和SQL Server等等。MyFOX 淘宝选择了MySQL的MyISAM引擎作为底层的数据存储引擎。且为了应对海量数据他们设计了分布式MySQL集群的查询代理层-MyFOX。例如以下图所看到的是MySQL的数据查询过程 图2-2 MyFOX的数据查询过程 在MyFOX的每个节点中存放着热节点和冷节点两种节点数据。顾名思义热节点存放着最新的被訪问频率较高的数据冷节点存放着相对而来比較旧的訪问频率比較低的数据。而为了存储这两种节点数据出于硬件条件和存储成本的考虑你当然会考虑选择两种不同的硬盘来存储这两种訪问频率不同的节点数据。例如以下图所看到的 图2-3 MyFOX节点结构 “热节点”选择每分钟15000转的SAS硬盘依照一个节点两台机器来计算单位数据的存储成本约为4.5W/TB。相相应地“冷数据”我们选择了每分钟7500转的SATA硬盘单碟上能够存放很多其它的数据存储成本约为1.6W/TB。Prom出于文章篇幅的考虑本文接下来不再过多阐述这个Prom了。如以下两幅图所看到的他们分别表示的是Prom的存储结构以及Prom查询过程 图2-4 Prom的存储结构 图2-5 Prom查询过程glide的技术架构 图2-6 glider的技术架构 在这一层-查询层中淘宝主要是基于用中间层隔离前后端的理念而考虑。Glider这个中间层负责各个异构表之间的数据JOIN和UNION等计算而且负责隔离前端产品和后端存储提供统一的数据查询服务。缓存 除了起到隔离前后端以及异构“表”之间的数据整合的作用之外glider的另外一个不容忽视的作用便是缓存管理。我们有一点须了解在特定的时间段内我们认为数据产品中的数据是仅仅读的这是利用缓存来提高性能的理论基础。在上文图2-6中我们看到glider中存在两层缓存各自是基于各个异构“表”datasource的二级缓存和整合之后基于独立请求的一级缓存。除此之外各个异构“表”内部可能还存在自己的缓存机制。 图2-7 缓存控制体系 图2-7向我们展示了数据魔方在缓存控制方面的设计思路。用户的请求中一定是带了缓存控制的“命令”的这包含URL中的query string和HTTP头中的“If-None-Match”信息。而且这个缓存控制“命令”一定会经过层层传递终于传递究竟层存储的异构“表”模块。 缓存系统往往有两个问题须要面对和考虑缓存穿透与失效时的雪崩效应。缓存穿透是指查询一个一定不存在的数据因为缓存是不命中时被动写的而且出于容错考虑假设从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询失去了缓存的意义。至于怎样有效地解决缓存穿透问题最常见的则是採用布隆过滤器这个东西在我的此篇文章中有介绍将全部可能存在的数据哈希到一个足够大的bitmap中一个一定不存在的数据会被这个bitmap拦截掉从而避免了对底层存储系统的查询压力。 而在数据魔方里淘宝採用了一个更为简单粗暴的方法假设一个查询返回的数据为空无论是数据不存在还是系统故障我们仍然把这个空结果进行缓存但它的过期时间会非常短最长不超过五分钟。 2、缓存失效时的雪崩效应虽然对底层系统的冲击非常可怕。但遗憾的是这个问题眼下并没有非常完美的解决方式。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程进程写从而避免失效时大量的并发请求落究竟层存储系统上。 在数据魔方中淘宝设计的缓存过期机制理论上能够将各个client的数据失效时间均匀地分布在时间轴上一定程度上能够避免缓存同一时候失效带来的雪崩效应。本文參考基于云计算的海量数据存储模型侯建等。基于hadoop的海量日志数据处理王小森基于hadoop的大规模数据处理系统王丽兵。淘宝数据魔方技术架构解析朋春。Hadoop作业调优參数整理及原理guili。读者点评xdylxdylWe want to count all the books in the library. You count up shelf #1, I count up shelf #2. Thats map. The more people we get, the faster it goes. Now we get together and add our individual counts. Thats reduce。数据魔方里的缓存穿透,架构,空数据缓存这些和Hadoop一点关系都么有假设是想讲一个Hadoop的详细应用的话,数据魔方这部分事实上没讲清楚的。感觉你是把两个东西混在一起了。只是这两个都是挺有价值的东西,或者说数据魔方的架构比Hadoop可能更重要一些,基本上大的互联网公司都会选择这么做。Null对象的缓存保留五分钟未必会有好的结果吧,假设Null对象不是特别大,数据的更新和插入不多也能够考虑实时维护。Hadoop本身非常笨重不知道在数据魔方里是否是在扮演着实时数据处理的角色?还是仅仅是在做线下的数据分析的结语写文章是一种学习的过程。尊重他人劳动成果转载请注明出处。谢谢。July、2011/8/20。完。