Hadoop基础
简介
-
Hadoop是可靠的、可扩展的开源分布式计算和分布式存储框架
-
由Hadoop Common,HDFS,MapReduce,Yarn 组成
- HDFS:分布式文件系统
- MapReduce:分布式计算框架
- Yarn:资源调度系统
-
Hadoop的优势
- 高可靠
- 数据存储: 数据块多副本
- 数据计算: 某个节点崩溃, 会自动重新调度作业计算
- 高扩展性
- 存储/计算资源不够时,可以横向的线性扩展机器
- 一个集群中可以包含数以千计的节点
- 集群可以使用廉价机器,成本低
- Hadoop生态系统成熟
- 高可靠
-
Hadoop能做什么
- 搭建大型数据仓库
- PB级数据的存储 处理 分析 统计等业务
- 搜索引擎
- 日志分析
- 数据挖掘
- BI
1、HDFS(数据分块,冗余存储)
-
HDFS的启动
- $HADOOP_HOME/sbin/start-dfs.sh
- 退出安全模式(safemode) hdfs dfsadmin -safemode leave
- 通过IP:50070查看hdfs的运行状态
-
HDFS的shell命令
- 和linux指令基本一致 只是需要加上hadoop fs -命令
常用的例如:ls text mv put rm 例: hadoop fs -mkdir -p /hadoop001/test # 在HDFS中创建文件夹
- 文件基本操作(上传,删除,下载)
-
HDFS的设计思路
- 文件拆分(文件的并行处理,存储的负载均衡)
- 数据冗余(容错)
-
HDFS 的设计目标
- 适合运行在通用硬件(commodity hardware)上的分布式文件系统
- 高度容错性的系统,适合部署在廉价的机器上
- HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用
- 容易扩展,为用户提供性能不错的文件存储服务
-
HDFS的架构
-
NameNode
fsimage - 它是在NameNode启动时对整个文件系统的快照
edit logs - 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:
- edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
- NameNode的重启会花费很长时间,因为有很多改动[笔者注:在edit logs中]要合并到fsimage文件上。
- 如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。
- 负责客户端请求的响应
- 负责元数据(文件的名称、副本系数、Block存放的DN)的管理
- 元数据 MetaData 描述数据的数据
- 监控DataNode健康状况 10分钟没有收到DataNode报告认为Datanode死掉了
-
DataNode
- 存储用户的文件对应的数据块(Block)
- 要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况
-
secondarynamenode
它的职责是合并NameNode的edit logs到fsimage文件中,解决namenode的问题
- 首先,它定时到NameNode去获取edit logs,并更新到fsimage上。
- 一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
- NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。
-
-
HDFS的缺点
- 低延迟的数据访问
- 小文件存储
2、YARN
- Yarn是资源管理系统,可以让多个不同框架共享资源,提高资源利用率
- Yarn的架构和执行流程
- ResourceManager: RM 资源管理器 整个集群同一时间提供服务的RM只有一个,负责集群资源的统一管理和调度 处理客户端的请求: submit, kill 监控我们的NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉我们的AM来如何进行处理
- NodeManager: NM 节点管理器 整个集群中有多个,负责自己本身节点资源管理和使用 定时向RM汇报本节点的资源使用情况 接收并处理来自RM的各种命令:启动Container 处理来自AM的命令
- ApplicationMaster: AM 每个应用程序对应一个:MR、Spark,负责应用程序的管理 为应用程序向RM申请资源(core、memory),分配给内部task 需要与NM通信:启动/停止task,task是运行在container里面,AM也是运行在container里面
- Container 容器: 封装了CPU、Memory等资源的一个容器,是一个任务运行环境的抽象
- Client: 提交作业 查询作业的运行进度,杀死作业
1、Client提交作业请求
2、ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一 个Container(容器),并将 ApplicationMaster 分发到这个容器上面
3、在启动的Container中创建ApplicationMaster
4、ApplicationMaster启动后向ResourceManager注册进程,申请资源
5、ApplicationMaster申请到资源后,向对应的NodeManager申请启动Container,将要执行的 程序分发到NodeManager上
6、Container启动后,执行对应的任务
7、Tast执行完毕之后,向ApplicationMaster返回结果
8、ApplicationMaster向ResourceManager 请求kill
-
Yarn的启动
-
启动yarn
$HADOOP_HOME/sbin/start-yarn.sh
-
jps查看进程 ResourceManager NodeManager
-
图形化界面 IP:8088
-
停止YARN相关的进程 sbin/stop-yarn.sh
-
3、MapReduce
3.1、MapReduce概念
- MapReduce编程分Map和Reduce阶段
- 将作业拆分成Map阶段和Reduce阶段
- Map阶段 Map Tasks 分:把复杂的问题分解为若干"简单的任务"
- Reduce阶段: Reduce Tasks 合:reduce
- MapReduce编程执行步骤
- 准备MapReduce的输入数据
- 准备Mapper数据
- Shuffle
- Reduce处理
- 结果输出
3.2、Python使用MRJob包实现MapReduce
- mrjob介绍
- 使用python开发在Hadoop上运行的程序, mrjob是最简单的方式
- mrjob程序可以在本地测试运行也可以部署到Hadoop集群上运行
# 实现Wordcount
from mrjob.job import MRJob
class MRWordCount(MRJob):
#每一行从line中输入
def mapper(self, _, line):
for word in line.split():
yield word,1
# word相同的 会走到同一个reduce
def reducer(self, word, counts):
yield word, sum(counts)
if __name__ == '__main__':
MRWordCount.run()
运行:
python mr_word_count.py my_file.txt
-
运行MRJob的不同方式
-
内嵌式
-
特点是调试方便,启动单一进程模拟任务执行状态和结果,默认(-r inline)可以省略,输出文件使用 > output-file 或-o output-file,比如下面两种运行方式是等价的
python word_count.py -r inline input.txt > output.txt python word_count.py input.txt > output.txt
-
-
Hadoop方式
- python word_count.py -r hadoop hdfs:///test.txt -o hdfs:///output
-
4、Hadoop生态系统
-
Hive:数据仓库
R:数据分析
Mahout:机器学习库
pig:脚本语言,跟Hive类似
Oozie:工作流引擎,管理作业执行顺序
Zookeeper:用户无感知,主节点挂掉选择从节点作为主的
Flume:日志收集框架
Sqoop:数据交换框架,例如:关系型数据库与HDFS之间的数据交换
Hbase : 海量数据中的查询,相当于分布式文件系统中的数据库
Spark: 分布式的计算框架基于内存
- spark core
- spark sql
- spark streaming 准实时 不算是一个标准的流式计算
- spark ML spark MLlib
Kafka: 消息队列
Storm: 分布式的流式计算框架 python操作storm
Flink: 分布式的流式计算框架
5、HDFS读写及高可用
- HDFS写流程
- 客户端向NameNode发出写文件请求。
- NameNode检查是否已存在文件、检查权限。若通过检查,NameNode返回可写的DataNode列表。
- 客户端按128MB大小来切分文件。
- 客户端将NameNode返回的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后客户端和NameNode分配的多个DataNode构成pipeline管道,客户端只向第一个DataNode写数据,数据的复制由DataNode通过pipeline管道传给第二个、第三个…DataNode。
- 每个DataNode写完一个块后,会返回确认信息。
- 所有数据写完,发送完成信号给NameNode。
- HDFS读流程
- 客户端向NameNode发出读文件请求,将文件名传递给NameNode
- NameNode返回该文件的BlockID列表,以及每个BlockID所保存的DataNode地址
- 客户端从列表中每个Block对应的第一个DataNode中开始读取数据
- HDFS如何实现高可用(HA)
- 数据存储故障容错
- 磁盘介质在存储过程中受环境或者老化影响,数据可能错乱
- 对于存储在 DataNode 上的数据块,计算并存储校验和(CheckSum)
- 读取数据的时候, 重新计算读取出来的数据校验和, 校验不正确抛出异常, 从其它DataNode上读取备份数据
- 磁盘故障容错
- DataNode 监测到本机的某块磁盘损坏
- 将该块磁盘上存储的所有 BlockID 报告给 NameNode
- NameNode 检查这些数据块在哪些DataNode上有备份,
- 通知相应DataNode, 将数据复制到其他服务器上
- DataNode故障容错
- 通过心跳和NameNode保持通讯
- 超时未发送心跳, NameNode会认为这个DataNode已经宕机
- NameNode查找这个DataNode上有哪些数据块, 以及这些数据在其它DataNode服务器上的存储情况
- 从其它DataNode服务器上复制数据
- NameNode故障容错
- 主从热备 secondary namenode
- zookeeper配合 master节点选举
- 数据存储故障容错
来源:CSDN
作者:Natal-lzz
链接:https://blog.csdn.net/weixin_45639174/article/details/103482507