Hadoop学习笔记:
数据库
本地模式:本地模式是Hadoop默认的模式,只有Hadoop被配置成以非分布式模式运行的一个独立Java进程。默认模式下全部3个XML文件均为空,此时,Hadoop会彻底运行在本地。它只负责存储,没有计算功能。服务器
伪分布式模式:伪分布式模式是在一台机器上模拟分布式部署,方便学习和调试。使用多个守护线程模拟分布的伪分布运行模式,此时每一个Hadoop守护进程都做为一个独立的Java进程运行。网络
集群模式:真正多台机器来搭建分布式集群。数据结构
Hadoop集群是在同一地点用网络互连的一组通用机器。数据存储和处理都发生在这个机器“云“中。不一样的用户能够从独立的客户端提交计算“做业“到Hadoop,这些客户端能够是远离Hadoop集群的我的台式机。架构
注:虽非绝对必要,但一般在一个Hadoop集群中的机器都是相对同构的X86 Linux服务器。并且它们几乎老是位于同一个数据中心,并一般在同一组机架里。app
节点: H1、H2、H3、H4 … …分布式
节点H1、H4、H7的机架名对应为:/D1/R1、/D1/R2、/D2/R3 … …函数
机架:R1、R2、R3 … …oop
数据中心:D1、D2性能
这些拓扑结构的特色是:
在主节点上运行NameNode和JobTracker的守护进程,并使用独立的节点运行SecondaryNameNode以防主节点失效。在小型集群中,SecondaryNameNode(SNN)也能够驻留在某一个从节点上,而在大型集群中,连NameNode和JobTracker都会分别驻留在两台机器上。每一个从节点均驻留一个DataNode和TaskTracker,从而在存储数据的同一个节点上执行任务。
首先定义一些术语:
MapReduce做业(job)是客户端须要执行的一个工做单元。它包括输入数据、MapReduce程序和配置信息。Hadoop将做业分红若干个小任务(task)来执行,其中包括两类任务:map任务和reduce任务。
有两类节点控制着做业执行过程:
Jobtracker经过调度tasktracker上运行的任务,来协调全部运行在系统上的做业。
Tasktracker在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项做业任务的总体进度状况,若是其中一个任务失败,jobtracker能够在另一个tasktracker节点上从新调度该任务。
Hadoop将MapReduce的输入数据划分红等长的小数据块,成为输入分片(input spit)或简称分片,Hadoop为每一个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。
拥有许多分片,意味着处理每一个分片所须要的时间少于处理整个输入数据所花的时间。所以,若是咱们并行处理每一个分片,且每一个分片数据比较小,那么整个处理过程将得到更好的负载平衡。由于一台较快的计算机可以处理的数据分片比一台较慢的计算机更多,且成必定的比例。即便使用相同的机器,处理失败的做业或其余同时运行的做业也可以实现负载平衡,而且若是分片被切分得更细,负载平衡的质量会更好。
另外一方面,若是分片切分得过小,那么管理分片的总时间和构建map任务的总时间将决定着做业的整个执行时间。对于大多数做业来讲,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64MB,不过能够针对集群调整这个默认值,在新建全部文件或新建每一个文件时具体指定便可。
由于它是确保能够存储在单个节点上的最大输入块的大小。若是分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,所以分片中的部分数据须要经过网络传输到map任务节点。与使用本地数据运行整个map任务相比,这种方法显然效率更低。
Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,能够得到最佳性能。这就是所谓的数据本地化优化(data locality optimization)。
MapReduce程序经过操做键/值对来处理数据,通常形式为
map: (k1, v1) -> list(k2, v2)
reduce:(k2, list(v2)) -> lsit(k3, v3)
这些问题的答案来自磁盘的另外一个发展趋势:
寻址时间的提升远远慢于传输速率的提升。寻址是将磁头移动到特定磁盘位置进行读写操做的过程。它是致使磁盘操做延迟的主要缘由,而传输速率取决于磁盘的带宽。
若是数据的访问模式中包含大量的磁盘寻址,那么读取大量数据集所花的时间势必会更长(相较于流式数据读取模式),流式读取主要取决于传输速率。另外一方面,若是数据库系统只更新一小部分记录,那么传统的B树更有优点(关系型数据库中使用的一种数据结构,受限于寻址的比例)。但数据库更新大部分数据时,B树的效率比MapReduce低得多,由于须要使用“排序/合并”来重建数据库。
在许多状况下,能够将MapReduce视为关系型数据库管理系统的补充。两个系统之间的差别以下图所示。
MapReduce比较适合以批处理的方式处理须要分析整个数据集的问题。RDBMS适用于“点查询”和更新,数据集被索引后,数据库系统可以提供低延迟的数据检索和快速的少许数据更新。MapReduce适合一次写入、屡次读取数据的应用,而关系型数据库更适合持续更新的数据集。
Map任务将其输出写入本地硬盘,而非HDFS。
由于map的输出是中间结果:该中间结果由reduce任务处理后才产生最终输出结果,并且一旦做业完成,map的输出结果能够被删除。所以,若是把它存储在HDFS中并实现备份,不免有些小题大作。若是该节点上运行的map任务在将map中间结果传送给reduce任务以前失败,Hadoop将在另外一个节点上从新运行这个map任务以再次构建map中间结果。
在仅有一个reduce任务的状况下,输入一般来自于全部mapper的输出。所以,排过序的map输出需经过网络传输发送到运行reduce任务的节点。数据在reduce端合并,而后由用户定义的reduce函数处理。
若是是多个reduce任务的状况,mapper的输出也要通过一系列的分区操做,将一部分mapper合并,而后分别输入到不一样的reducer中。
Reducer经过HTTP方式获得输出文件的分区。由于Map的输出结果是存放在本地的。
Reduce的输出一般存储在HDFS中以实现可靠存储。
对于每一个reduce输出的HDFS块,第一个复本存储在本地节点上,其余复本存储在其余机架节点中。
所以,reduce的输出写入HDFS确实须要占用网络带宽,但这与正常的HDFS流水线写入的消耗同样。
HDFS流水线写入:
client把数据Block只传给一个DataNode,这个DataNode收到Block以后,传给下一个DataNode,依次类推,...,最后一个DataNode就不须要下传数据Block了。
Map的做用是过滤一些原始数据
Reduce则是处理这些数据,获得咱们想要的结果
HDFS、NDFS、GFS
Map任务的数量由输入分片的的个数决定。
Hadoop将MapReduce的输入数据划分为等长的小数据块,称为输入分片(input split)或简称分片。
Hadoop为每一个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条数据。
Reduce任务的数量不禁输入数据的大小决定,而是特别指定的。
真实应用中,做业都把它设置成一个较大的数字,不然因为全部的中间数据都会放到一个reducer任务中,从而致使做业效率较低。
注意:在本地做业运行器上运行时,只支持0个或1个reducer。
Reduce最优个数与集群中可用的reducer任务槽数相关。总槽数由集群中节点数与每一个节点的任务槽数相乘获得。该值由mapred.tasktracker.reduce.task.maximum属性的值决定。
若有多个reduce任务,则每一个map任务都会对其输出进行分区(partition),即为每一个reduce任务建一个分区。每一个分区有许多键(及其对应值),但每一个键对应的键/值对记录都在同一个分区中。分区由用户定义的分区函数控制,但一般用默认的分区器(partitioner,有时也称“分区函数“)经过哈希函数来分区,这种方法和高效。
虚线框表示节点,虚线箭头表示节点内部的数据传输,而实线箭头表示节点之间的数据传输。
每一个TaskTracker能够生成多个JVM(JAVA虚拟机)来进行并行地处理许多map或reduce任务。
一个tasktracker可以同时运行最多多少个map任务:由mapred.tasktracker.map.tasks.maximum属性控制,默认值是2个任务。相应的,一个tasktracker可以同时运行的最多reduce任务数由mapred.tasktracker.reduce.task.maximum属性控制,默认也是2。详见《Hadoop权威指南》第二版P269页。
在一个tasktracker上可以同时运行的任务数取决于一台机器有多少个处理器。因为MapReduce做业一般是I/O-bound,所以将任务数设定为超出处理器数也有必定道理,可以得到更好的利用率。
至于到底须要运行多少个任务,则依赖于相关做业的CPU使用状况。
但经验法则是任务数(包括map和reduce任务)与处理器数的比值最好在1和2之间。
1、其中一个职责是持续不断地与JobTracker通讯。
JobTracker做为主节点,监测MapReduce做业的整个执行过程,同时,TaskTracker管理各个任务在每一个从节点上的执行状况。每一个TaskTracker负责执行由JobTracker分配的单项任务。虽然每一个从节点上仅有一个TaskTracker,但每一个TaskTracker能够生成多个JVM(JAVA虚拟机)来进行并行地处理许多map或reduce任务。
TakTracker的一个职责是持续不断地与JobTracker通讯。若是JobTracker在指定时间内没有收到来自TaskTracker的“心跳“,它会假定TaskTracker已经崩溃,进而从新提交相应的任务到集群中的其余任务节点。
节点间通讯的惟一时间是在“洗牌“(shuffle)阶段。这个通讯约束对可扩展性有很大的帮助。
集群上的可用带宽限制了MapReduce做业的数量,所以最重要的一点是尽可能避免map任务和reduce任务之间的数据传输。Hadoop容许用户针对map任务的输出指定一个合并函数(combiner,就像mapper和reducer同样),合并函数的输出做为reduce函数的输入。因为合并函数是一个优化方案,因此Hadoop没法肯定针对map任务输出中任一条记录须要调用多少次合并函数。换言之,无论调用多少次合并函数,reducer的输出结果都应一致。
由于每一个reduce任务的输入都来自许多map任务。调整混洗参数对做业总执行时间会有很是大的影响。
用于文件分区的工做线程的数量由任务的tasker.http.threads属性控制,此设置针对tasktracker,而不是针对每一个map任务槽。默认是40,在运行大型做业的大型集群上,此值能够根据须要而增长。
MapReduce彷佛采用的是一种蛮力方法。每一个查询须要处理整个数据集——或至少数据集的很大一部分。不过,这也正是它的能力。MapReduce是一个批量查询处理器,而且它可以在合理的时间范围内处理针对整个数据集的即时查询。
它操做的数据集是结构化数据。
结构化数据它是具备既定格式的实体化数据,诸如XML文档或知足特定预约义格式的数据表。
MapReduce对于结构化或半结构化数据很是有效,由于在处理数据时才对数据进行解释。换句话说:MapReduce输入的键和值并非数据固有的属性,而是由分析数据的人员来选择。
半结构化数据
一些常见的半结构化数据比较松散,虽然可能有格式,但常常被忽略,因此它只能用做对数据的通常指导。例如,一张电子表格,其结构由其单元格组成的网格,可是每一个单元格自身可保存任何形式的数据。
非结构数据
没有什么特别的内部结构,例如纯文本或图像数据。
我认为,节点即指机器。守护进程例如NameNode、DataNode、JobTracker、TaskTracker、SecondaryNameNode等都驻留在节点中。即,存放守护进程的地方。