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)
功能:
负责集群资源的管理和调度