大数据框架实例(Hadoop 原理总结)
- 简介
Hadoop是一个开发和运行处理大规模数据的软件平台,实现了在大量的廉
价计算机组成的集群中对海量数据进行分布式计算。
大概工作流程如下图:
Hadoop框架中最核心的设计是HDFS(文件系统)和MapReduce(编程模型,大数据并行运算)。
二、HDFS(文件系统)
1、HDFS简介
HDFS即Hadoop Distributed File System:分布式文件存储系统,为海量的数据提供了存储,HDFS:其实就是个文件系统,和fastDFS类似,像百度云,阿里云等就是个文件存储系统,当然一般如果仅仅是为了用来存储文件的话直接fastDFS这个就已经够了,HDFS目的不单单是用来存储文件这么简单,它还涉及分布式计算等。
2、HDFS结构
HDFS 由一个管理结点 ( NameNode )和N个数据结点 ( DataNode )组成,
NameNode
NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间。
NameNode基于内存存储,存储的是一些文件的详细信息,比如文件名、文件大小、创建时间、文件位置等。NameNode 也是整个 HDFS 的核心,它通过维护一些数据结构,记录了每一个文件被切割成了多少个 Block,这些 Block 可以从哪些 DataNode 中获得,各个 DataNode 的状态等重要信息。
Datanode
DataNode:Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。
Datanode是文件的数据信息,也就是文件本身,不过是分割后的小文件。每个结点均是一台普通的计算机。在使用上同我们熟悉的单机上的文件系统非常类似,一样可以建目录,创建,复制,删除文件,查看文件内容等。但其底层实现上是把文件切割成 Block,然后这些 Block 分散地存储于不同的 DataNode 上,每个 Block 还可以复制数份存储于不同的 DataNode 上,达到容错容灾之目的。
- 工作流程
(1)HDFS读文件的流程:
客户端client使用open函数打开文件;
DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息;
对于每一个数据块,元数据节点返回保存数据块的数据节点的地址;
DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据;
客户端调用FSDataInputStream的read函数开始读取数据;
FSDataInputStream连接保存此文件第一个数据块的最近的数据节点;
Data从数据节点读到客户端;
当此数据块读取完毕时,FSDataInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点;
当客户端读取数据完毕时,调用FSDataInputStream的close函数;
在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
(2)HDFS写文件的流程:
客户端client调用create函数创建文件;
DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件;
元数据节点首先确定文件是否存在,并且客户端是否有创建文件的权限,然后创建新文件;
DistributedFileSystem返回FSDataOutputStream给客户端用于写数据;
客户端开始写入数据,FSDataOutputStream将数据分成块,写入data queue;
Data queue由DataStreamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块),分配的数据节点放在一个pipeline里;
DataStreamer将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点;
FSDataOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功;
如果数据节点在写入的过程中失败,则进行以下几个操作:一是关闭pipeline并将ack queue中的数据块放入data queue的开始;二是当前数据块在已写入的数据节点中被元数据节点赋予新的标示,错误节点重启后察觉其数据块过时而被删除;三是失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点;四是元数据节点被通知此数据块的复制块数不足,从而再创建第三份备份;
当客户端结束写入数据,则调用close函数将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功,最后通知元数据节点写入完毕。
- 优点
适合大文件的存储,并且由备份策略,有比较好的容错和恢复机制,支持流式数据访问,一次写入,多次读取最高效。HDFS是一个高度容错性的系统,适合部署在廉价的机器上,能够提供高吞吐量的数据访问,适用于那些有着超大数据集的应用程序;
- 缺点
不适合大量小文件的存储。
不适合并发写入,不支持文件的随机修改(只能后续添加)。
不适合随机读等低延时的访问方式。
三、MapReduce(编程模型,大数据并行运算)。
1、MapReduce简介
MapReduce是一套可以从海量的数据中提取数据最后返回结果集的编程模型。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
MapReduce由JobTracker和TaskTracker构成,JobTracker 对应于 NameNode,TaskTracker 对应于 DataNode。
2、MapReduce结构
MapReduce由JobTracker和TaskTracker构成,JobTracker 对应于 NameNode,TaskTracker 对应于 DataNode。
(1)JobTracker
Hadoop 中有一个作为主控的 JobTracker,用于调度和管理其它的 TaskTracker, JobTracker 可以运行于集群中任一台计算机上。TaskTracker 负责执行任务,必须运行于 DataNode 上,即 DataNode 既是数据存储结点,也是计算结点。 JobTracker 将 Map 任务和 Reduce 任务分发给空闲的 TaskTracker, 让这些任务并行运行,并负责监控任务的运行情况。如果某一个 TaskTracker 出故障了,JobTracker 会将其负责的任务转交给另一个空闲的 TaskTracker 重新运行。
首先用户程序(JobClient)提交了一个job,job的信息会发送到JobTracker,JobTracker是Map-reduce框架的中心,会先将任务拆分成多个map任务(也就是子任务),分发给map层的各个datanode,等计算完成以后,结果会被发送到 reduce层的各个datanode进行合并同时他还需要与集群中的机器定时通信heartbeat(也就是心跳协议),需要管理哪些程序应该跑在哪些机器上,需要管理所有job失败、重启等操作。
jobTracker后台程序用来连接应用程序与Hadoop。由JobTracker决定哪个文件将被处理,每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上
(2). TaskTracker
TaskTracker是Map-Reduce集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况。
TaskTracker同时监视当前机器的tasks运行状况。TaskTracker需要把执行状态和任务进度通过heartbeat发送给JobTracker,JobTracker会搜集这些信息以给新提交的job分配运行在哪些机器上。
3、工作流程
1.在客户端启动一个作业。
2.向JobTracker请求一个Job ID。
3.将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map任务等信息。
4.JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度(这里是不是很像微机中的进程调度呢,呵呵),当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。
5.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。
4、优点
1,开发简单:用户不用考虑进程间的通信和套接字编程
2,可扩展性强:当集群资源不能满足计算需求时,可以增加节点的方式达到线性扩展集群的目的。
3,容错性强:对于节点故障导致失败的作业,MapReduce计算框架会自动将作业安排到健康的节点进行,直到任务完成。
5、缺点
1,执行速度慢:普通的MapReduce作业几分钟完成,数据量大的可能几个小时甚至一天的时间。
2,MapReduce过于低层化:一个简单的查询,需要写Map和reduce函数,复杂且耗费时间,建议使用hive数据库进行处理。
3,不是所有的算法都用MapReduce实现:例如机器学习的模型训练,有赖于状态共享和参数间的依赖,需要维护和更新。
四、应用场景
在生产实践应用中,Hadoop非常适合应用于大数据存储和大数据的分析应用,适合服务于几千台到几万台大的服务器的集群运行,支持PB级别的存储容量。
五、Hadoop的开源组件
Hadoop家族还包含各种开源组件,比如Yarn,Zookeeper,Hbase,Hive,Sqoop,Impala,Spark等。使用开源组件的优势显而易见,活跃的社区会不断的迭代更新组件版本,使用的人也会很多,遇到问题会比较容易解决,同时代码开源,高水平的数据开发工程师可结合自身项目的需求对代码进行修改,以更好的为项目提供服务。
六、发展现状
Hadoop 设计之初的目标就定位于高可靠性、高可拓展性、高容错性和高效性,正是这些设计上与生俱来的优点,才使得Hadoop 一出现就受到众多大公司的青睐,同时也引起了研究界的普遍关注。到目前为止,Hadoop 技术在互联网领域已经得到了广泛的运用,例如,Yahoo 使用4 000 个节点的Hadoop集群来支持广告系统和Web 搜索的研究;Facebook 使用1 000 个节点的集群运行Hadoop,存储日志数据,支持其上的数据分析和机器学习;百度用Hadoop处理每周200TB 的数据,从而进行搜索日志分析和网页数据挖掘工作;中国移动研究院基于Hadoop 开发了"大云"(Big Cloud)系统,不但用于相关数据分析,还对外提供服务;淘宝的Hadoop 系统用于存储并处理电子商务交易的相关数据。国内的高校和科研院所基于Hadoop 在数据存储、资源管理、作业调度、性能优化、系统高可用性和安全性方面进行研究,相关研究成果多以开源形式贡献给Hadoop 社区。
除了上述大型企业将Hadoop 技术运用在自身的服务中外,一些提供Hadoop 解决方案的商业型公司也纷纷跟进,利用自身技术对Hadoop 进行优化、改进、二次开发等,然后以公司自有产品形式对外提供Hadoop 的商业服务。比较知名的有创办于2008 年的Cloudera 公司,它是一家专业从事基于ApacheHadoop 的数据管理软件销售和服务的公司,它希望充当大数据领域中类似RedHat 在Linux 世界中的角色。该公司基于Apache Hadoop 发行了相应的商业版本Cloudera Enterprise,它还提供Hadoop 相关的支持、咨询、培训等服务。在2009 年,Cloudera 聘请了Doug Cutting(Hadoop 的创始人)担任公司的首席架构师,从而更加加强了Cloudera 公司在Hadoop 生态系统中的影响和地位。最近,Oracle 也表示已经将Cloudera 的Hadoop 发行版和Cloudera Manager 整合到Oracle Big Data Appliance 中。同样,Intel 也基于Hadoop 发行了自己的版本IDH。从这些可以看出,越来越多的企业将Hadoop 技术作为进入大数据领域的必备技术。
需要说明的是,Hadoop 技术虽然已经被广泛应用,但是该技术无论在功能上还是在稳定性等方面还有待进一步完善,所以还在不断开发和不断升级维护的过程中,新的功能也在不断地被添加和引入,读者可以关注Apache Hadoop的官方网站了解最新的信息。得益于如此多厂商和开源社区的大力支持,相信在不久的将来,Hadoop 也会像当年的Linux 一样被广泛应用于越来越多的领域,从而风靡全球。