一、hadoop介绍html
hadoop是一个开源分布式计算平台框架基于apache协议发布由java语言开发。官网地址http://hadoop.apache.org/java
hadoop两大核心组件HDFS分布式文件系统为分布式计算提供了数据存储和mapreduce应用程序被分区成许多小部分而每一个部分都能在集群中的任意节点上运行一句话就是任务的分解和结果的汇总node
其余两个模块Common、YARNweb
和hadoop相关的项目Ambari、Avro、Cassandra、Chukwa、Hbase、Hive、Mahout、Pig、Spark、Tez、Zookeeper数据库
二、hadoop应用apache
hadoop支持由廉价的计算机搭建集群有强大的冗余机制。编程
hadoop在各大互联网企业中应用普遍百度使用hadoop进行搜索日志的分析和网页数据的挖掘工做淘宝使用hadoop存储并处理电子商务交易相关数据facebook使用hadoop进行数据分析和机器学习。服务器
还有哪些企业在使用hadoop http://wiki.apache.org/hadoop/PoweredBy网络
三、hadoop组件介绍数据结构
Common为其余组件提供经常使用工具支持。
YARN做业调度和集群管理的框架。
Ambari: 是 Apache Software Foundation 中的一个项目。就 Ambari 的做用来讲就是建立、管理、监视 Hadoop 的集群可是这里的 Hadoop 是广义指的是 Hadoop 整个生态圈例如 HiveHbaseSqoopZookeeper 等。用一句话来讲Ambari 就是为了让 Hadoop 以及相关的大数据软件更容易使用的一个工具。http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/index.html
AvroAvro是Hadoop中的一个子项目也是Apache中一个独立的项目Avro是一个基于二进制数据传输高性能的中间件。在Hadoop的其余项目中例如HBase(Ref)和Hive(Ref)的Client端与服务端的数据传输也采用了这个工具。Avro是一个数据序列化的系统。Avro 能够将数据结构或对象转化成便于存储或传输的格式。Avro设计之初就用来支持数据密集型应用适合于远程或本地大规模数据的存储和交换。http://www.open-open.com/lib/view/open1369363962228.html
Cassandra可扩展的多主数据库不存在单点故障。
Chukwa是数据收集系统用于监控和分析大型分布式系统的数据。
HBase是一个分布式面向列的数据库。
Hive最先由facebook设计是创建在hadoop基础之上的数据仓库它提供了一些用于数据整理、特殊查询和分析在hadoop文件中数据集工具。
Mahout可扩展的机器学习和数据挖掘库。
Pig是一种高级语言和并行计算可执行框架它是一个对大型数据集分析和评估的平台。
Spark一个快速和通用计算的Hadoop数据引擎。和mapreduce相似可是要比mapreduce快。它提供了一个简单而丰富的编程模型支持多种应用包括ETL、机器学习、数据流处理、图形计算。 参考文档http://www.techweb.com.cn/network/system/2016-01-25/2267414.shtml
Tez是Apache最新的支持DAG做业的开源计算框架它能够将多个有依赖的做业转换为一个做业从而大幅提高DAG做业的性能。Tez并不直接面向最终用户事实上它容许开发者为最终用户构建性能更快、扩展性更好的应用程序。Hadoop传统上是一个大量数据批处理平台。可是有不少用例须要近乎实时的查询处理性能。还有一些工做则不太适合MapReduce例如机器学习。Tez的目的就是帮助Hadoop处理这些用例场景。
ZooKeeperZooKeeper是一组工具用来配置和支持分布式调度。一个重要功能就是对全部节点进行配置的同步。它能处理分布式应用的“部分失败”问题。部分失败是分布式处理系统的固有特征即发送者没法知道接收者是否收到消息它的出现可能和网络传输问题、接收进程意外死掉等有关系。ZooKeeper是Hadoop生态系统的一部分但又远不止如此它能支持更多相似的分布式平台和系统如JubatusCassender等等。并且HBase明确指出至少须要一个ZooKeeper实例的支持。
四、HDFS概述
HDFS设计思想来源于Google的GFS是GFS的开源实现。
HDFS要解决的问题
(1) 存储超大文件好比TB级别(2) 防止文件丢失
HDFS的特色
(1) 能够存储超大文件
(2) 只容许对一个已经打开的文件顺序写入还能够在现有文件的末尾追加。要想修改一个文件追加内容除外只能删除后再重写
(3) 可使用廉价的硬件平台搭建经过容错策略来保证数据的高可用默认存储3份数据任何一份丢失能够自动恢复
HDFS的缺点
(1) 数据访问延迟比较高由于它的设计场景是用于大吞吐量数据HDFS是单master全部文件都要通过它当请求数据量很大时延迟就增长了
(2)文件数受限和NameNode有关系
(3) 不支持多用户写入也不支持文件任意修改
五、HDFS核心概念
HDFS的几个概念
数据块:block大文件会被分割成多个block进行存储block大小默认为64MB。每个block会在多个datanode上存储多份副本默认是3份。
namenodenamenode:负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系。
SecondaryNameNode:分担namenode的工做量是NameNode的冷备份它的主要工做是合并fsp_w_picpath元数据镜像文件和fsedits元数据操做日志而后再发给namenode。
datanodedatanode:就负责存储了固然大部分容错机制都是在datanode上实现的。
rack 是指机柜的意思一个block的三个副本一般会保存到两个或者两个以上的机柜中固然是机柜中的服务器这样作的目的是作防灾容错由于发生一个机柜掉电或者一个机柜的交换机挂了的几率仍是蛮高的。
六、HDFS工做流程
HDFS写流程
HDFS写文件流程:
Client向远程的Namenode发起RPC请求;
Namenode会检查要建立的文件是否已经存在,建立者是否有权限进行操做,成功则会为文件建立一个记录,不然会让客户端抛出异常
当客户端开始写入文件的时候,会将文件切分红多个packets,并向Namenode申请blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。
此时会造成一个pipline用来传输packet。
packet以流的方式写入第一个datanode,该datanode把packet存储以后,再将其传递给下一个datanode,直到最后一个datanode。
最后一个datanode成功存储以后会返回一个ack传递至客户端,在客户端,客户端确认ack后继续写入下一个packet。
若是传输过程当中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。
HDFS读流程
HDFS读文件流程
Client向远程的Namenode发起RPC请求
Namenode会视状况返回文件的部分或者所有block列表,对于每一个block,Namenode都会返回有该block拷贝的DataNode地址
Client会选取离本身最接近的DataNode来读取block
读取完当前block的数据后,关闭与当前的DataNode链接,并为读取下一个block寻找最佳的DataNode
当读完列表的block后,且文件读取尚未结束,client会继续向Namenode获取下一批的block列表
读取完block会进行checksum验证,若是读取datanode时出现错误,客户端会通知Namenode,而后再从下一个拥有该block拷贝的datanode继续读
七、MapReduce模型
MapReduce 是大规模数据(TB 级)计算的利器,Map 和Reduce 是它的主要思想,来源于函数式编程语言。
Map负责将数据打散,Reduce负责对数据进行汇集,用户只须要实现map 和reduce 两个接口,便可完成TB级数据的计算。
常见的应用包括:日志分析和数据挖掘等数据分析应用。另外,还可用于科学数据计算,如圆周率PI 的计算等。
当咱们提交一个计算做业时,MapReduce会首先把计算做业拆分红若干个Map 任务,而后分配到不一样的节点上去执行,每个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会做为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一块儿并输出
MapReduce 执行过程
Mapper任务的执行过程
每一个 Mapper任务是一个 java 进程,它会读取 HDFS中的文件,解析成不少的键值对,通过咱们map方法处理后,转换为不少的键值对再输出;把 Mapper任务的运行过程分为六个阶段。
第一阶段是把输入文件按照必定的标准分片(InputSplit),每一个输入片的大小是固定的。
第二阶段是对输入片中的记录按照必定的规则解析成键值对。
第三阶段是调用 Mapper类中的 map 方法。
l第四阶段是按照必定的规则对第三阶段输出的键值对进行分区。
第五阶段是对每一个分区中的键值对进行排序。
第六阶段是对数据进行概括处理,也就是 reduce处理。键相等的键值对会调用一次reduce方法。
Reducer任务的执行过程
每一个 Reducer 任务是一个 java 进程。Reducer 任务接收 Mapper任务的输出,归约处理后写入到 HDFS中。能够分为3个阶段
第一阶段是 Reducer 任务会主动从 Mapper任务复制其输出的键值对。 Mapper任务可能会有不少,所以 Reducer会复制多个Mapper的输出。
第二阶段是把复制到 Reducer本地数据,所有进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次 reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中