文章目录
hadoop初识
概述
项目起源
Hadoop由 Apache Software Foundation 公司于 2005 年秋天作为Lucene的子项目Nutch的一部分正式引入。它受到最先由 Google Lab 开发的 Map/Reduce 和 Google File System(GFS) 的启发
发展历程
目前Hadoop版本以2.7.x为主
名字由来
Hadoop这个名字不是一个缩写,而是一个虚构的名字。
该项目的创建者,Doug Cutting解释Hadoop的得名 :“这个名字是我孩子给一个棕黄色的大象玩具命名的。我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子恰恰是这方面的高手。”
Hadoop核心组件与应用
核心组件
核心组件包括Hadoop的基础组件HDFS、MapReduce和Yarn,以及其他常用组件如:HBase、Hive、Hadoop Streaming、Zookeeper等。
组件介绍
- HDFS:分布式海量数据存储功能
- Yarn:提供资源调度与任务管理功能
- 资源调度:根据申请的计算任务,合理分配集群中的计算节点(计算机)。
- 任务管理:任务在执行过程中,负责过程监控、状态反馈、任务再调度等工作。
- MapReduce:分布式并行编程模型和计算框架。解决分布式编程门槛高的问题,基于其框架对分布式计算的抽象map和reduce,可以轻松实现分布式计算程序。
- Hive:提供数据摘要和查询的数据仓库。解决数据仓库构建问题,基于Hadoop平台的存储与计算,与传统SQL相结合,让熟悉SQL的编程人员轻松向Hadoop平台迁移。
- HBase:基于列式存储模型的分布式数据库。解决某些场景下,需要Hadoop平台数据及时响应的问题。
- Zookeeper:分布式协同服务。主要解决分布式下数据管理问题:统一命名、状态同步、集群管理、配置同步等。
Hadoop生态圈
Ambari平台介绍
- Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。
- 同类产品为Cloudera Manager的CDH。
- 优点:
- Web安装图形界面操作便捷。
- Hadoop家族个组件支持全面。
- 社区资源比较丰富。
- 缺点:
- Bug较多:安装过程中,莫名其妙的出现错误。系统运维过程中偶尔出错。以上两种情况重启就正常。
- 安装速度与网络质量关系较大,往往时间较长。
- 在合理避免大坑的情况下,3小时内可以搭建一个基本版的集群。
分布式文件系统HDFS
分布式文件系统HDFS
1.产生背景
传统的本地文件系统(单机式),在数据量增长过快、数据备份、数据安全性、操作使用便捷性上存在严重不足。
2.特点介绍
- 高容错和高可用性,硬件错误是常态而不是异常
- HDFS设计为运行在普通硬件上,所以硬件故障是很正常的。HDFS提供文件存储副本策略,可以实现错误自检并快速自动恢复。个别硬件的损坏不影响整体数据完整性和计算任务的正常执行。
- 流式数据访问
- HDFS主要采用流式数据读取,做批量处理而不是用户交互处理,因此HDFS更关注数据访问的高吞吐量。
- 弹性存储,支持大规模数据集
- HDFS支持大文件存储,典型的文件在GB甚至TB级别,可以支持数以千万计的大规模数据集。根据业务需要灵活的增加或者缩减存储节点。弹性存储的最大挑战是减小在修改存储节点时的数据震荡问题。
- 简单一致性模型
- HDFS文件实行一次性写、多次读的访问模式。设计为文件一经创建、写入和关闭之后就不需要再更改了,这种设计和假定简化了数据一致性问题,使高吞吐量成为可能。
- 移动计算而非移动数据
- 由于HDFS支持大文件存储,对于大文件来说,移动计算比移动数据的代价要低。这样也可以减少网络的拥塞和提高系统的吞吐量。
- 协议和接口多样性
- 为上层应用提供了多种接口,Http RestFul接口、NFS接口、Ftp接口等等POSIX标准协议,另外通常会有自己的专用接口。
- 多样的数据管理功能
- 对于数据压缩、数据加密、数据缓存和存储配额等提供了多样的管理功能。
应用场景
- 各大运营商。
- 中大型互联网公司,如BAT、京东、乐视、美团等。
- 金融银行保险类公司。
- 各大云平台底层存储平台。
- 其他本地系统无法承载存储能力的应用。
HDFS设计架构
1.HDFS是什么
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。
由论文为GFS(Google File System)Google 文件系统启发,是Google GFS的开源Java实现。
2.HDFS组件角色
2.1 Namenode
- HDFS元数据管理者,管理NameSpace(文件系统命名空间),记录文件是如何分割成数据块以及他们分别存储在集群中的哪些数据节点上。
- NameSpace或其本身属性的任何更改都由NameNode记录,维护整个文件系统的文件和目录。
2.2 DataNode
- DataNode是文件系统的工作节点。根据客户端或者NameNode发送的管理指令,负责HDFS的数据块的读写和检索操作。
- 通过心跳机制定期向NameNode发送他们的存储块的列表。
2.3 Client
- 客户端Client代表用户与NameNode或者DataNode交互来访问整个文件系统的对象。
- 开发人员面向Client API来编程实现,对NameNode、DataNode来说透明无感。
3.HDFS设计架构
3.1 基本架构
HDFS是一个主从式(Master/Slave)的体系结构。HDFS集群中有一个NameNode和一些DataNodes,NameNode管理文件的元数据,DataNode存储实际的数据。从用户的角度看,就像操作传统的文件系统一样,可以通过目录路径对文件执行创建、读取、删除操作。客户端联系NameNode来获取元数据信息,而真正的文件I/O是直接和DataNode进行交互的。
3.2 读文件流程
详细步骤:
- 第一步:Client向NameNode发送数据请求后,寻找数据对应的数据块的位置信息。
- 第二步:NameNode返回文件对应的数据块元数据信息,如所属机器、数据块的block_id、数据块的先后顺序等。
- 第三步:由Client与DataNode直接通信,读取各个block数据块的信息。过程为并行读取,由客户端合并数据。
3.3 写文件流程
详细步骤:
- 第一步:
- Client向NameNode发送写数据请求后,寻找可以写入的数据块block信息的机器位置。
- 若文件过大,写入可能会分成很多block数据块,实际上是通过一个block一个block的申请。
- 若副本为3,则每次请求后返回一个block的对应的3个副本的block的存放位置。
- 第二步:
- Client获取到对应的block数据块所处的DataNode节点位置后,Client开始写操作。
- Client先写入第一个DataNode,以数据包package的方式逐个发送和接收。如64K大小的package包大小来发送和接收。
- 存在多个副本时,package包的写入是依次进行的。写入到第一个DataNode后,第一个向第二个DataNode传输。第二个写完后,由第二个向第三个DataNode传输package。以此类推。
- 写完一个block数据块后,如果还有则反复进行第一步和第二步。
- 第三步:
- 待所有的数据块block均写完后,Client接收到全部写完的ack答复,告诉NameNode数据已写完,Client关闭socket流。
- DataNode也会向NameNode报告新增block数据块的信息。
HDFS高可靠性措施
1.冗余备份
数据存储在这些HDFS中的节点上,为了防止因为某个节点宕机而导致数据丢失,HDFS对数据进行冗余备份,至于具体冗余多少个副本,在dfs.replication中配置。
2.跨机架副本存放
仅仅对数据进行冗余备份还不够,假设所有的备份都在一个节点上,那么该节点宕机后,数据一样会丢失,因此HDFS要有一个好的副本存放策略,该策略还在开发中。目前使用的是,以dfs.replication=3为例,在同一机架的两个节点上各备份一个副本,然后在另一个机架的某个节点上再放一个副本。前者防止该机架的某个节点宕机,后者防止某个机架宕机。
3.心跳检测
DataNode节点定时向NameNode节点发送心跳包,以确保DataNode没有宕机。如果宕机,会采取相应措施,比如数据副本的备份。
4.数据完整性检测
NameNode在创建HDFS文件时,会计算每个数据的校验和并储存起来。当客户端从DataNode获取数据时,他会将获取的数据的校验和与之前储存的校验和进行对比。
5.安全模式
HDFS启动时,会进入安全模式,此时不允许写操作。这时,NameNode会收到所有DataNode节点的数据块报告,在确认安全之后,系统自动退出安全模式。
6.核心文件备份
HDFS的核心文件是映像文件和事务日志,如果这些文件损坏,将会导致HDFS不可用。系统支持对这两个文件的备份,以确保NameNode宕机后的恢复。
7.空间回收
从HDFS中删除的文件会首先被放入到/trash中,/trash文件夹中的内容是被删除文件最后的副本,该文件夹会被定时清空。该文件夹中不存在的文件就彻底不存在了。
经典问题分析(答案解析于二中)
- HDFS为何要将文件分成block块存储?
- HDFS block块的默认大小时多少?
- HDFS block块的大小是否可以更改?
- 一个block块文件是否可以存储多个文件数据?
- 如果一个文件的大小,小于一个blocksize,那么它实际占用多大空间?
- HDFS block越大越好?还是越小越好?