Hadoop 简介
狭义来说,hadoop 是 Apache 基金会开发的分布式系统基础架构,用来解决海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop 通常是指一个更广泛的概念 —— Hadoop 生态圈。

Hadoop 三大发行版本
Apache、Cloudera、Hortonworks
Apache 版本最原始(最基础)的版本,对于入门学习最好。
Cloudera 在大型互联网企业中用的较多。其主要产品有 CDH、Cloudera Manager,Cloudera Support
Hadoop 优势
高可靠性: Hadoop 底层维护多个数据副本,所以即使 Hadoop 某个计算元素或存储出现故障,也不会导致数据的丢失。
高扩展性: 在集群间分配任务数据,可方便的扩展数以千计的节点。
高效性: 在 MapReduce 的思想下,Hadoop 是并行工作的,以加快任务处理速度。
高容错性: 能够自动将失败的任务重新分配。
**低成本:**Hadoop 不要求机器的配置达到极高的标准,大部分普通商用服务器即可满足要求,通过提供多个副本和容错机制提高集群的可靠性
Hadoop 基本组成

常用 Shell 命令
hdfs dfs -ls <path>:列出指定 HDFS 路径下的文件和目录
hdfs dfs -mkdir <path>:在 HDFS 中创建新目录
hdfs dfs -put <localsrc> <dst>:将本地文件(或目录)复制到 HDFS
hdfs dfs -get <src> <localdst>:将 HDFS 上的文件(或目录)复制到本地
hdfs dfs -mv <src> <dst>:移动 HDFS 中的文件目录或重命名文件目录
hdfs dfs -cp <src> <dst>:复制 HDFS 中的文件或目录
hdfs dfs -rm <path>:删除 HDFS 中的文件
hdfs dfs -cat <path>:在控制台显示 HDFS 文件的内容
hdfs dfs -du <path>:显示 HDFS 文件或目录的大小
hdfs dfs -df <path>:显示 HDFS 的可用空间
hdfs fsck path [-files [-blocks [-location]]]
-files列出路径内的文件状态
-files -blocks输出文件块报告(几个块,几个副本)
-files -blocks -locations 输出每个block的详情
HDFS 分布存储
HDFS 是一个分布式文件系统,具有高容错、高吞吐 量等特性,分布在多个集群节点上的文件系统。有 NN、DN、SNN 三种角色。
HDFS 启停

NameNode(NN)
HDFS 的主角色,负责管理每个文件的块所在的 DataNode、整个 HDFS 文件系统、存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限)等。
DataNode(DN)
HDFS 从角色,负责处理客户端的读写请求,存储删除文件块,以及块数据校验和。
SecondaryNameNode(SNN)
NN 的辅助角色,帮 NN 打杂,监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。
可通过 9870 端口(默认 9870)访问 web 界面,查看集群各节点状态及信息

文件写入流程
发送的写入请求通过后,客户端会根据 NN 返回的信息自动把数据分块,向网络距离最近的 DN 写入数据。同时,DN 会完成备份操作,把备份传到其他的 DN,然后由其他的 DN 再次做备份传播,直到满足设置的备份数量。当数据写入完成后,客户端会通知 NN,由 NN 完成元数据记录。

HDFS 架构的稳定性
心跳机制和重新复制
每个 DataNode 定期向 NameNode 发送心跳消息,如果超过指定时间没有收到心跳消息,则将 DataNode 标记为死亡。NameNode 不会将任何新的 IO 请求转发给标记为死亡的 DataNode,也不会 再使用这些 DataNode 上的数据。 由于数据不再可用,可能会导致某些块的复制因子小于其指定值, NameNode 会跟踪这些块,并在必要的时候进行重新复制。
数据的完整性
由于存储设备故障等原因,存储在 DataNode 上的数据块也会发生损坏。为了避免读取到已经损坏的数 据而导致错误,HDFS 提供了数据完整性校验机制来保证数据的完整性,具体操作如下: 当客户端创建 HDFS 文件时,它会计算文件的每个块的 校验和 ,并将 校验和 存储在同一 HDFS 命名空 间下的单独的隐藏文件中。当客户端检索文件内容时,它会验证从每个 DataNode 接收的数据是否与存 储在关联校验和文件中的 校验和 匹配。如果匹配失败,则证明数据已经损坏,此时客户端会选择从其 他 DataNode 获取该块的其他可用副本。
元数据的磁盘故障
FsImage 和 EditLog 是 HDFS 的核心数据,这些数据的意外丢失可能会导致整个 HDFS 服务不可 用。为了避免这个问题,可以配置 NameNode 使其支持 FsImage 和 EditLog 多副本同步,这样 FsImage 或 EditLog 的任何改变都会引起每个副本 FsImage 和 EditLog 的同步更新。
支持快照
快照支持在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态。
文件读取流程

存储方式
Block 块和多副本
由于文件大小不一,不利于统一管理,hdfs 设定了统一的存储单位 Block 块,Block 块是 hdfs 最小存储单位,通常每个 128MB(可修改 dfs.blocksize)。hdfs 会按照 Block 块大小把文件切分成多份存储在多个 datanode 上也就是多个服务器上,同时为了保证整个文件的完成性(防止 Block 块丢失或损坏),hdfs 会对每个 Block 块做多个备份存储在其他节点上,备份的数量默认是 3,可以在 hdfs-site.xml 中配置数量,修改后要重新分发该文件,保证每个服务器的配置文件相同!
|
|
同时还可以临时决定上传文件的副本数量:
hdfs fs -D dfs.replication=5 -put test.tst /data/test
还可以修改已存在的 hdfs 文件的副本数量:
hdfs fs -setrep [-R] 5 path path 是指定文件路径,-R 表示对子目录也生效
edits 和 fsimage 文件
hdfs 中文件被划分成一堆堆 block 块,为了方便整理记录文件和 block 的关系,namenode 基于一批 edits 文件和一个 fsimage 文件完成整个文件系统的维护管理。
edits 文件是一个流水账文件,记录了 hdfs 的每一次操作以及该次操作影响的文件及其对应的 block。为了保证 edits 文件检索性能,会有多个 edits 文件,每一个 edits 文件存储到达一定数量会开启新的 edits,保证不出现超大的 edits 文件。最终所有 edits 文件会合并为一个 fsimage 文件,这个 fsimage 文件就记录了最终状态的文件操作信息。如果已经有了 fsimage,就会把全部的 edits 和已存在的 fsimage 进行新的合并,生成新的 fsimage。

元数据合并及控制参数
**注意!**元数据(eidts 和 fsimage)的合并不是由 NN 完成的,而是 SNN,NN 只是基于元数据对整个文件系统进行维护管理,负责元数据记录和权限审批,NN 是管理者,不是员工。
SNN 会通过 http 从 NN 拉取 edits 和 fsimage 然后合并元数据并提供给 NN 使用

HDFS 漫画
读写数据

HDFS 故障类型和检测方法

MapReduce 分布式并行计算框架
MapReduce 是基于 Yarn 运行的,没有 Yarn 就无法运行 MapReduce,MapReduce 有 RM、NM、AM 三种角色。
MR 不适合实时计算,不适合流式计算,不适合有向图计算。
可通过 8042 端口(默认 8042)访问 web 界面,查看 MR 任务的执行信息
计算模式
MapReduce 属于分散汇总。spark、flink 属于中心调度.

Map 和 Reduce
Map 接口提供“分散”功能,Reduce 提供“汇总聚合”功能,用户可以通过 Java、python 等编程调用 mapreduce 接口完成开发,不过现在已经有了 Hive on MR(稍微过时),sparkSQL 等客户端。不懂编程仅用 SQL 就能完成开发,使用更方便,逐渐成为主流。
MR 执行原理

Yarn 作业调度、资源管理
Yarn 管控整个集群的资源调度,MR 程序运行时,是在 Yarn 的监督下运行的,MR 程序会把计算任务分成若干个 map 和 reduce,然后向 Yarn 申请资源并运行任务。Yarn 有四种角色:ResourceManager(RM)、NodeManager(NM)、ProxyServer(PS)、JobHistoryServer(JHS)

Yarn 启停

ResourceManager
集群资源总管家,整个集群资源调度者,负责协调调度各个程序所需资源。
NodeManager
单机资源管家,单个服务器的资源调度者,负责协调调度单个服务器的资源供程序使用。同时负责该节点内所有容器的生命周期的管 理,监视资源和跟踪节点健康。具体如下:
|
|
ApplicationMaster
在用户提交一个应用程序时,YARN 会启动一个轻量级的进程 ApplicationMaster 。 ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器内资 源的使用情况,同时还负责任务的监控与容错。具体如下:
|
|
运行时可通过服务器的 8088 端口(默认 8088)访问 web 界面
JobHistoryServer
记录历史运行程序的信息及产生的日志,把每个程序的运行日志统一收集到 hdfs,可通过 19888 端口访问 web 界面

Container
Container 是 Yarn 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
Hadoop 一键启停

