赞
踩
Hadoop 2.x由HDFS、MapReduce和YARN三个分支构成;
HDFS:NN Federation、HA
MapReduce:运行在YARN上的MR
YARN:资源管理系统
Hadoop核心
Hadoop的核心就是HDFS(Hadoop Distributed File System,Hadoop分布式文件系统 )和MapReduce,而两者只是理论基础,不是具体可使用的高级应用,Hadoop旗下有很多经典子项目,比如HBase、Hive等,这些都是基于HDFS和MapReduce发展出来的。
HDFS
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统 ),主从结构,一个NameNode和多个DataNode,分别对应独立的物理机器。它是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。HDFS的文件被分成块进行存储,HDFS块的默认大小为128MB,块是文件存储处理的逻辑单元。
HDFS的设计特点:
1、大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。
2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算机上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得多。
3、流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。
4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。
5、硬件故障,HDFS认为所有计算机都可能会出现问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。
HDFS特点:
1、数据冗余,软件方式保证低成本硬件容错。
2、流式读写(一次写入,多次读取,不可修改)。
3、适合存储大文件(否则namenode消耗高,头大身小)。
优点:存储块大,吞吐量高,为存储大文件设计;
缺点:延迟高,不适合交互式访问,不支持多用户同时操作一个块。
HDFS的关键元素:
Block:将一个文件进行分块,通常是128M
NameNode:是所有HDFS源数据的管理者,用户数据永远不会经过NameNode。是主服务器,管理文件系统的命名空间和客户端对文件的访问操作。NameNode执行文件系统的命名空间操作,比如打开关闭重命名文件或者目录等,它也负责数据块到具体DataNode的映射。是保存整个文件系统的目录信息、文件信息及分块信息,这是由唯一一台主机专门保存,当然这台主机如果出错,NameNode就失效了。在Hadoop2.*开始支持activity-standy模式(如果主NameNode失效,启动备用主机运行NameNode)。
NameNode:存放元数据(文件和数据块的映射表;数据块和数据节点的映射表)是一个管理节点
DataNode:集群中的DataNode管理存储的数据。负责处理完系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。分布在廉价的计算机上,用于存储Block块文件。工作节点,真正存储数据块。
如图:
介绍:
1.每个数据块3个副本,分布在两个机架内的三个节点,2个在同一个机架上,另外一个在另外的机架上。
2.心跳检测,datanode定期向namenode发送心跳消息。查看是否有datanode挂掉了。
3.secondary namenode;定期同步元数据映像文件和修改日志,namenode发生故障,secondaryname是冷备份,不会马上上位,减少损失而已。
简单介绍下:(文章最后有详细解析)
HDFS读取文件的流程:
(1)客户端向namenode发起独立请求,把文件名,路径告诉namenode;
(2)namenode查询元数据,并把数据库返回客户端;
(3)此时客户端就明白文件包含哪些块,这些块在哪些datanode中可以找到;
HDFS写文件流程:
(1)客户端把文件拆分成固定大小128M的块,并通知namenode;
(2)namenode找到可用的datanode返回给客户端;
(3)客户端根据返回的datanode,对块进行写入
(4)通过流水线管道流水线复制
(5)更新元数据。告诉namenode已经完成了创建新的数据块。保证了namenode中的元数据都是最新的状态。
HDFS使用:
它提供了 shell 接口,可以进行命令行操作
hadoop namenode -format #格式化namenode
hadoop fs -ls / #打印 / 目录文件列表
hadoop fs -mkdir input #创建目录 input
hadoop fs -put hadoop-env.sh input/ #上传文件 hadoop-env.sh 到 input 目录下
hadoop fs -get input/abc.sh hadoop-envcomp.sh #从 input 目录中下载文件
hadoop fs -cat input/hadoop-env.sh #查看文件 input/hadoop-env.sh
hadoop dfsadmin -report #dfs报告
hadoop fs和hadoop dfs的区别
fs涉及到一个通用的文件系统,可以指向任何的文件系统如local,HDFS等。但是dfs仅是针对HDFS的。hadoop fs使用面最广,可以操作任何文件系统。hadoop dfs与hdfs dfs 只能操作HDFS文件系统相关,前者已经 deprecated(已弃用),一般使用后者
那么什么时候使用fs呢?
可以在本地与hadoop分布式文件系统的交互操作中使用
MapReduce
通俗说MapReduce是一套从海量源数据提取分析元素最后返回结果集的编程模型,将文件分布式存储到硬盘是第一步,而从海量数据中提取分析需要的内容就是MapReduce做的事了。
MapReduce 并行计算框架
主从结构,一个JobTracker和多个TaskTracker
1) MapReduce是由一个单独运行在主节点上的JobTacker和运行在每个集群从节点上的TaskTracker共同组成的。JobTacker负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。总结点监控他们的执行情况,并且重新执行之前失败的任务;从节点仅负责由主节点指派的任务
2) MapReduce模型原理是利用一个输入的key/value对集合来产生一个输出的key/value对集合,使用Map和Reduce函数来计算
3) MapReduce将大数据分解为成百上千小数据集,每个数据集分别由集群中的一个节点(一般是一台计算机)并行处理生成中间结果,后然这些中间结果又由大量的节点合并,形成最终结果
下面以一个还算海量数据最大值为例:一个银行有上亿储户,银行希望找到存储金额最高的的金额是多少,按照传统的计算方式,这样做:
Java代码
Long moneys[] ...
Long max = 0L;
for(int i=0;i<moneys.length;i++){
if(moneys[i]>max){
max = moneys[i];
}
}
如果计算的数组长度少的话,这样实现不会有问题的,可是面对海量数据的时候就会有问题了。
MapReduce会这样做:首先数字是分布存储在不同块中的,以某几个块为一个Map,计算出每个Map中的最大值,然后将每个Map中的最大值做Reduce操作,Reduce再取最大值给用户。
MapReduce的基本原理就是:将大的数据分析分成小块逐个分析,最后再将提取出来的数据汇总分析,最终获得我们想要的内容。当然怎么分块分析,怎么做Reduce操作非常复杂,Hadoop已经提供了数据分析的实现,我们只需要编写简单的需求命令即可达成我们想要的数据。
分而治之,一个大任务分成多个子任务(map),并行执行之后,合并结果(reduce)。
eg:做统计的时候,把统计的文件拆分,然后分别统计每一个数据出现的次数,然后合并拆分项,就可以统计每一个数据出现的总次数。
MapReduce并行计算框架:【图解】
思想:分而治之,将一个大任务分成多个小的子任务(map),并行执行后,合并结果(reduce)
运行流程:
1)基本概念:
--Job & Task:
一个 Job(任务、作业) 被切分为多个 Task,Task 又分为 MapTask 和 ReduceTask
--JobTracker
作业调度
分配任务、监控任务
监控 TaskTracker 的状态
--TaskTracker
执行任务
向 JobTracker 汇报任务状态
3. 容错机制:2种
1)重复执行:
默认重复执行 4 次,若还是失败,则放弃执行
2)推测执行:
在整个任务执行中,等所有的Map端执行结束后,Reduce端才会开始,这个时候可能会存在某个节点(TaskTracker)执行的特别特别的慢,JobTracker就会发现其中有一个节点(TaskTracker )算的特别慢,它比别的节点慢很多的时候,说明它已经出现了问题,那么推测执行这个时候就会这样执行:算的特别慢的那个节点还继续接着算,在另外找一台TaskTracker执行同样的事情,只有这个事情,它们两者(新建的和之前执行特别慢的)谁先算完,就会把另外一个终止。
可以保证任务不会因为某1-2个机器错误或故障而导致整体效率下降
总结:
总的来说Hadoop适合应用于大数据存储和大数据分析的应用,适合于服务器几千台到几万台的集群运行,支持PB级的存储容量。
Hadoop典型应用有:搭建大型数据仓库、搜索、日志处理、推荐系统、数据分析、视频图像分析、数据保存等。
Hadoop的使用范围远小于SQL或Python之类的脚本语言,所以不要盲目使用Hadoop。
WordCount单词计数案例
计算文件中出现每个单词的频数
输入结果按照字母顺序进行排序
MapReduce
Map:任务的分解
Reduce:结果的汇总
补充:
HDFS读流程:
我们先说一个语义:下载回这个文件。换句话说就是取回这个文件的所有的块,那么当有能力取回文件的所有块的时候,那么它的子集操作就是取回其中某些块或者某个块也能实现。所以我们先来看取回文件的所有块的流程是怎么实现的:
1、客户端和NameNode建立连接,获取文件block的位置信息(fileBlockLocations)
2、客户端根据自己想要获取的数据位置挑选需要连接的DataNode(如果全文下载,从0开始;如果是从某一位置开始,客户端需要给出)
需要用inputstream.seek(long)//从什么位置开始读取,和哪个DataNode开始连接获取block;
3、距离的概念:只有文件系统在读流程中附加距离优先的概念,计算层才能够被动实现计算向数据移动,距离有以下三种:
(1)本地,最近的距离;
(2)同机架,次之的距离;
(3)other(数据中心),最远的距离;
4、客户端下载完成block后会验证DataNode中的MD5,保证块数据的完整性。
HDFS写流程:
1、客户端访问NameNode,NameNode检查路径和权限,如果路径中有与要上传的文件重名的文件就不能上传了,不能覆盖,如果没有才创建,创建名为file.copying的临时文件;
2、NameNode触发副本放置策略,如果客户端在集群内的某一台机器,那么副本第一块放置在该服务器上,然后再另外挑两台服务器;如果在集群外,namenode会根据策略先找一个机架选出一个datanode,然后再从另外的机架选出另外两个datanode,然后namenode会将选出的三个datanode按距离组建一个顺序,然后将顺序返回给客户端;
3、客户端会根据返回的三个节点和第一个节点建立一个socket连接(只会和第一个节点建立),第一个节点又会和第二个节点建立socket连接,由第二个节点又会和第三个节点建立一个socket连接,这种连接的方式叫Pipeline;
4、客户端会将block切分成package(默认是64kB),以流式在pipeline中传输
好处:
(1)速度快:时间线重叠(其实流式也是一种变异的并行);
(2)客户端简单:副本的概念是透明的;
5、由DataNode完成接收block块后,block的metadata(MD5校验用)通过一个心跳将信息汇报给NameNode;
6、如果再pipeline传输中,任意节点失败,上游节点直接连接失败节点的下游节点继续传输,最终在第5步汇报后,NameNode会发现副本数不足,一定会出发DataNode复制更多副本,客户端Client副本透明;
7、client一直重复以上操作,逐一将block块上传,同时DataNode汇报block的位置信息,时间线重叠;
8、最终,如果NameNode收到了DataNode汇报的所有块的信息,将文件的.copying去掉,文件可用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。