Hadoop
# Hadoop
# 了解 Mapreduce 嘛
tag:
携程count:1
as:
# spark 和 mapreduce 区别
tag:
携程count:1
as:
# hadoop
tag:
count:2
as:hadoop 如何实习高可用
hadoop 是什么
Hadoop 是一个分布式系统基础架构,主要是为了解决海量数据的存储和海量数据的分析计算问题。
Hadoop 主要组件是 HDFS、MapReduce、YARN
- HDFS 是分布式文件系统,用于存储文件
- MapReduce 是一个分布式运算程序的编程框架
- YARN 作为一个资源管理、任务调度的框架
Hadoop 有哪两大服务?
- 提供海量数据的存储服务 -》HDFS
- 提供分析海量数据框架及运行平台 -》MapReduce 和 Yarn
Hadoop 的特点(优缺点)
优点 (四高特性):
- 1)高可靠性:Hadoop 底层维护多个数据副本,即使 Hadoop 某个计算元素或存储出现故障时,也不会导致数据的丢失
- 2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点
- 3)高效性:在 MapReduce 的思想下,Hadoop 是并行工作,加快任务处理速度
- 4)高容错性:能够自动将失败的任务重新分配
缺点:
- 1)Hadoop 不适用于低延迟数据访问
- 2)Hadoop 不能高效存储大量小文件
- 3)Hadoop 不支持多用户写入并任意修改文件
# Hadoop 生态圈组件及其作用?
- Zookeeper:是一个开源的分布式应用程序协调服务,基于 zookeeper 可以实现同步服务,配置维护,命名服务。
- Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
- Hbase:是一个分布式的、面向列的开源数据库,利用 Hadoop HDFS 作为其存储系统。
- Hive:基于 Hadoop 的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单 的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。
- Sqoop:一个可以将关系型数据库中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中的工具
- Kafka:是一种分布式、高吞吐量的分布式发布订阅消息系统。
- Spark:基于内存的迭代计算框架。可以基于 Hadoop 上存储的大数据进行计算。
- Flink:一个面向流处理和批处理的分布式数据计算引擎。用于实时计算的场景较多。
# Hadoop 1.x,2.x,3.x 的区别?
Hadoop 1.x 阶段
- Hadoop 中的 MapReduce 既负责资源调度又负责计算耦合性较大。
Hadoop 2.x 阶段
- 增加了 Yarn。Yarn 只负责资源的调度,MapReduce 只负责运算。
- 新增了 HDFS 高可用机制,通过配置 Active 和 Standby 两个 NameNode 实现在集群中对 NameNode 的热备,解决了 1.0 存在的单点故障问题。
Hadoop 3.x 阶段
- 相比于 Hadoop 2.x 阶段在组成上没有变化。
- Java 运行环境升级为 1.8
- Hadoop3.0 支持两个以上的 namenode,也就是可以设置一个 active 和多个 standby
- MapReduce 本地优化,性能提升了 30%
- Hadoop3.0 的时候支持 HDFS 的纠删码机制,作用就是节省存储空间【普通副本机制假设需要 3 倍存储空间而这种机制只需 1.4 倍即可】
# Hadoop 集群工作时启动哪些进程?它们有什么作用?
- NameNode:负责管理整个分布式文件系统 HDFS 的元数据信息,如文件目录结构、权限、文件块的副本数量等。
- DataNode:负责存储 HDFS 中的数据块,并响应客户端的读写请求。
- Secondary NameNode:定期从 NameNode 中备份元数据信息,用于恢复 NameNode 的故障。
- ResourceManager:负责管理整个集群中的资源,包括计算资源和存储资源,协调和调度集群中的作业。
- NodeManager:负责管理每个节点上的资源,监控节点的健康状况,并向 ResourceManager 报告节点的资源使用情况。
- 高可用
- DFSZKFailoverController:高可用时它负责监控 NN 的状态,并及时的把状态信息写入 ZK。它通过一个独立线程周期性的调用 NN 上的一个特定接口来获 取 NN 的健康状态。FC 也有选择谁作为 Active NN 的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
- JournalNode:高可用情况下存放 namenode 的 editlog 文件
# hdfs 读写流程
tag:
count:2
as:
HDFS 读数据
- 客户端向 namenode 发起 RPC 调用,请求读取文件数据。
- namenode 检查文件是否存在,如果存在则获取文件的元信息 (blockid 以及对应的 datanode 列 表)。
- 客户端收到元信息后选取一个网络距离最近的 datanode,依次请求读取每个数据块。客户端首先 要校检文件是否损坏,如果损坏,客户端会选取另外的 datanode 请求。
- datanode 与客户端建立 socket 连接,传输对应的数据块,客户端收到数据缓存到本地,之后写入 文件。
- 依次传输剩下的数据块,直到整个文件合并完成。
HDFS 写数据
- 客户端发出请求
- namenode 查看维护的目录结构,检查 data 是否存在,如不存在直接报错”,如存在返回给客户端同意上传文件请求,将操作写入日志文件
- 客户端请求上传第一个块,询问 namenode 块的存储位置
- namenode 查看自己的 datanode 池,返回给客户端一个 datanode 列表
- 客户端发出请求建立 pipeline
- 客户端先把文件写入缓存,达到一个块的大小时,会在客户端和第一个 datanode 建立连接开始流式 的传输数据,这个 datanode 会一小部分一小部分的接收数据然后写入本地仓库,同时会把 这些数据传输到第二个 datanode,第二个 datanode 也同样一小部分一小部分的接收数据并写入本 地仓库,同时传输给第三个 datanode... (在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列响应完成后返回给客户端)
- 第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。
- 整个文件完成,namenode 更新内存元数据
# 调度器
- FIFO Scheduler(先进先出调度器):将所有的 Applications 放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个 app 分配资源。如果第一个 app 需要的资源被满足了,如果还剩下了资源并且满足第二个 app 需要的资源,那 么就为第二个 app 分配资源,优点:简单,不需要配置。 缺点:不适合共享集群。如果有大的 app 需要很多资源,那么其他 app 可能会一直等待
- Capacity Scheduler(容量调度器):CapacityScheduler 用于一个集群 (集群被多个组织共享) 中运行多个 Application 的情况,目标是 最大化吞吐量和集群利用率。CapacityScheduler 允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织 有一个专门的队列,每个组织的队列还可以进一步划分成层次结构, 从而允许组织内部的不同用户组的使用。 每个队列内部,按照 FIFO 的方式调度 Applications。当某个队列的资源空闲时,可以将它的剩余资源 共享给其他队列
- 一般选这个 Fair Scheduler(公平调度器):FairScheduler 允许应用在一个集群中公平地共享资源。默认情况下 FairScheduler 的公平调度只基 于内存,也可以配置成基于 memory and CPU。当集群中只有一个 app 时,它独占集群资源。当有新的 app 提交时,空闲的资源被新的 app 使用,这样最终每个 app 就会得到大约相同的资源。可以为不同的 app 设置优先级,决定每个 app 占用的资源百分比。FairScheduler 可以让短的作业在合理的时间内完 成,而不必一直等待长作业的完成。
编辑 (opens new window)
上次更新: 2025/01/01, 10:09:39