hadoop

Hadoop是什么?

Hadoop是一个分布式的系统架构

Hadoop的组成:
Hdoop=hdfs(分布式储存系统) + mapreduce(分布式计算框架) + yarn(分布式资源管理框架)+ common(工具包)

hdfs:分布式存储系统 HDFS (Hadoop Distributed File System)

功能:
1: 分布式存储系统
2: 提供了 高可靠性 高拓展性和高吞吐率的数据储存服务

分布式储存系统主要解决大数据的存储问题

HDFS架构图:
在这里插入图片描述
HDFS Client: hdfs 客户端

HDFS的功能模块以及原理详解:

1 HDFS的数据存储单元(block)

文件被切割成固定大小的数据块 block
默认数据块的大小为128MB,可自定义配置
若文件不到128MB,则单独存成一个block

2 文件的存储方式:

按大小切成若干个block,存储在不同的节点上
默认下每个block有三个副本

Block大小和副本数通过Client上传文件时设置,文件上传成功后副本数可以更改,Block Size不可改变
在这里插入图片描述
hdfs存储模型: 字节

文件现行切割成块(Block) : 偏移量offset(byte)
Block分散储存在集群节点中
单一文件Block大小一致,文件和文件可以不一致
Block可以设置副本数,副本分散在不同的节点中
副本数最好不要超过节点数量
文件上传设置副本数和Block大小 
已经上传的文件Block副本数量可以更改,但是Block的大小不可更改
只支持一次或者多次读取,同一时刻只有一个写入者
可以append追加数据(但是追加数据这个功能需要手动开启,也只能追加到文件的末尾)

NameNode(存放文件的元数据信息,块的位置 NN)

1 :功能:

接受客户端的请求(读写服务以及上传下载)

补充:
与DN进行通信,随时掌握DN节点的数据文件信息,或者DN转发信息
每三秒钟通信一次,如果发现DN失去联系超过10分钟,NN会将DN节点上海的数据拷贝到其他节点上

2 基于内存储存:不会和磁盘发生交换

只存在内存中
持久化???

补充:

分布式文件系统的文件目录
存储文件目录的文件信息
文件切割后块的信息(每个块的大小,元数据,块的名字)
NN启动的时候是没有对应块的信息的,在启动的DN的时候,DN会向NN汇报块的信息(有什么块等等),
然后NN才会记录Block与DN的对应关系

安全问题:
(因为是基于内存储存的,所以不可避免的会出现一些安全问题)

1: 如果断电,内存中的数据会全部丢失(这里丢失的数据指的是: 文件的信息,块的大小,每个块存在哪个节点.备份在哪个节点等等 简而言之就是 映射关系不在了)
2: 如果内内存满了,将无法继续储存数据

解决方案:
我们可以我们每次的操作记录保存起来

全日志回滚:花费的时间太长了

我们可以把每次的操作记录保存起来,当NN意外断电或者正常停止以后,再次启动的时候,我们只需要把日志重新操作一篇就行了
(日志里存放文件目录的创建,删除,块划分)

正常停止:
将内存中的数据写到磁盘中,下次启动的时候,直接将磁盘中的文件反序列化

意外停止:上次正常停止(退出)的磁盘文件+之后的日志操作重新操作一遍(但是可能日志的文件的内容太大,时间上也不好控制)

3 NameNode保存metatdata信息:

文件归属(owership)和权限)(permissions)
文件的大小,时间
(Block列表:Block偏移量),位置信息(不会持久化,只有DN开启后会想NN汇报节点的位置,这是NN才会知道这些信息)
Block保存在哪个DataNode(存放数据的节点)信息(DataNode启动时上报,不会保存在磁盘)

4 NameNode持久化:

NameNode的metadata信息在启动时后会加载到内存里
metadata存储到磁盘文件名为fsimage
Block的位置不会保存到fsimage
edits记录对fsimage的操作日志

fsimage保存了最新的元数据检查点,类似快照。

editslog 保存自最新检查点后的元信息变化,从最新检查点后,hadoop将对每个文件的操作都保存在edits中。客户端修改文件时候,先写到editlog,成功后才更新内存中的metadata信息

Metdata=fsimage+editslog

DataNode(存放数据的节点 DN)

基于文件系统存放数据

1 本地磁盘目录存储数据(Block),文件形式
2 同时存储Block的元数据信息(md5值)薪资文件
3 启动DN进程的时候会向NameNode汇报block信息

安全策略:
4 通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟都没有收到DN的心跳,则认为已经lost,并copy其上的block到其他的DN

总结:
利用本地的文件系统存放Block信息,会为block创建hsdoop独有的目录结构
向NN发送心跳包
在集群刚启动的时候,收集本地的block信息,打包成数据文件发送给NN

SecondaryNameNode(SNN)
它的主要工作是帮助NN合并edits log文件,减少NN启动时间(保证每次启动的时间均衡),它不是NN的备份(但可以做备份)

SNN执行合并时间和机制
根据配置文件设置的时间间隔:fs.checkpoint.period 默认为3600秒
根据配置文件设置editslogda大小 fs.checkpoint.size 规定edits文件的最大默认值为64MB

问题:集群正常关闭的时候会在磁盘中创建一个叫fsimage的文件
(这个文件就是将NN内存中数据序列化出来的文件)
我们对集群的操作(写入/追加),都会产生日志,
如果是正常退出启动,我们只要借助于上次的fsimage+日志就可以恢复

为了保证每次启动时间的时间均衡,所以启动了SecondaryNameNode

SecondaryNameNode SNN合并流程:
在这里插入图片描述
我们已经知道,每次启动都是fsimage+edits
首先SecondaryNameNode 中合并fsimage+edits规则是(chktime=3600 2.edits>=64M)
1 将NN中的fsimage+edits拷贝到SecondaryNameNode上面进行合并操作
2 拷贝的时候,如果用户在实时操作,那么NN中就会从新生成一个edits来记录用户的操作,而另外一边SNN将拷贝过来后的fsimage+edits合并之后,替换NN中的fsimage,之后NN根据fsimage进行操作,当然新的edits与合并之后传输过来的fsimage会在下一次时间内又进行合并

副本放置策略:
选择第一个节点:
如果是同一集群:放在当前节点
如果不是同一集群:随机选择一个磁盘不太慢,cpu不太忙的节点
选择第二个节点:
选择第一个节点不同的计价节点上
选择第三个节点:
第二个节点相同机架的不同位置
更多节点

​ 随机节点

namenode -format 只能格式化一次

HDFS读写流程

写入数据

1: HDFS Client(客户端) 调用Create 方法,向HDFS发送一个 上传文件的请求
2: HDFS通过调用RPC(远程调用协议),调用NameNode的Create方法,NameNode会检查权限,路径,在NameNode中创建一个空Entry对象
3: NameNode返回一个FSDataOutputStream(文件输出流)的对象给客户端
4: 客户端以流的方式将文件读取到客户端的Buffer中,创建一个packet,让buffer中的数据一次取出,分装chunk,方法packet中
5: 等packet中装满chunk之后,加入到dataqueue队列中,按照队列的先进先出的特性,取出发送
6: dataStareamer(DataStreamer的负责就是,通过挑选一系列合适的datanode来存储副本,从而要求NameNode分配新的blocks。)基于block的副本防止策略,选择DN,然后建立连接,来时发送出去packet
7: 客户端通过pipeline(管代输出)的方式开始想节点发送数据
8: 方DN的最后一个节点接受完成后,来时逆向返回状态信息,最终这些信息会存放到ackqueue里面
9: 当一个块所有的packetf都发送完成后,HDFS将block信息和DN信息发送给NN存放
10:等所有的块都放到DN之后,那么所有的映射关系也就存放到NN中了

pipeline:管道传输
管道传输方式是为了更加快速的将客户端(Client)的数据拷贝到三个节点上
block:128MB
packet:64KB 保证传输速度
chunk:512B checknum 4B 保证传输数据的安全校验
在这里插入图片描述

读出数据:

1: 首先Client(客户端)调用open()向 HDFS发送读取文件的请求,
2: HDFS通过RPC访问NN
3: 如果数据存在的话 ,就返回block对应的数据节点信息(即一个输入流对象FSDataInputStream)
4:DFSInputStream随即连接距离最近的DataNode,通过对数据流反复调用read()方法,将数据从DataNode传输到客户端
5: 当到达块末端时,会关闭与该datanode的连接,然后寻找下一个快的最佳Datanode,做同样的操作,一旦客户端完成读取,就调用close()犯法关闭文件读取。

在这里插入图片描述

HADOOP代建:

伪分布式搭建:

1: jdk的安装,配置环境变量

vi /etc/profile
添加:

•	export  JAVA_HOME=/opt/sxt/jdk1.7.0_75
•	export  PATH=$PATH:$JAVA_HOME/bin

2 ssh免密登录(本机):

1 生成密钥
ssh-keygen -t ras -p ‘’ -f ~/.ssh/id_rsa
cat /.ssh/id_rsa.pub >> aurhorized_keys

3 上传hadoop.tar.gz 到服务器

1 解压hadoop压缩包到 /opt/shsxt 目录下
2 vi /etc/profile(修改配置文件)
添加

export HADOOP_HOME=/opt/shsxt/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

在这里插入图片描述
4 修改hadoop配置文件:
/opt/shsxt/hadoop-2.6.5/etc/hadoop

vim hadoop-env.sh在这里插入图片描述
vim core-site.xml:
在这里插入图片描述
vim - hdfs-site.xml
在这里插入图片描述
5 格式化: hdfs namenode -format
6 启动 start-dfs.sh
7 查看进程:jps

1697 Jps
1412 DataNode
1574 SecondaryNameNode
1327 NameNode

在这里插入图片描述
创建文件夹:
hdfs dfs -mkdir /user/root
上传文件:
hdfs dfs -put filename(文件名)

mapreduce:分布式计算框架MapReduce
功能:
1: 分布式计算框架
2: 具有易于编程,高容错性和高扩展性等优点

yarn:分布式资源管理框架YARN(Yet Another Resource Management)
功能:
负责集群资源的管理和调度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值