Hadoop简介
Hadoop 的思想之源:Google 第一遇到大数据计算问题的公司
Openstack :NASA
面对的数据和计算难题
- 大量的网页怎么存储
- 搜索算法
带给我们的关键技术和思想(Google三大理论)
- GFS 文件存储
- Map-Reduce 计算
- Bigtable
创始人:Doug cutting
Hadoop简介:http://hadoop.apache.org
分布式存储系统HDFS (Hadoop Distributed File System )POSIX
分布式存储系统
提供了 高可靠性、高扩展性和高吞吐率的数据存储服务
分布式计算框架MapReduce
分布式计算框架(计算向数据移动)
具有 易于编程、高容错性和高扩展性等优点。
分布式资源管理框架YARN(Yet Another Resource Management)
负责集群资源的管理和调度
版本:1.x,2.x,3.x
Hadoop 分布式文件系统HDFS
存储模型:字节
文件线性切割成块(Block):偏移量 offset (byte, 中文)
block分散存储存储在集群节点中
单一文件Block大小一致,文件与文件可以不一致
Block可以设置副本数,副本无序分散在不同节点中(默认是3个)
副本数不要超过节点数量
文件上传可以设置Block大小和副本数(资源不够开辟的进程)
已上传的文件Block副本数可以调整,大小不变
2.x 128MB Block 默认Block为128M,可以人为设置,最小1M,
只支持一次写入多次读取,同一时刻只有一个写入者
可以append追加数据
架构模型 主从模型
文件元数据MetaData, 文件数据
元数据:metedata size offset
主节点负责管理元数据
从节点负责处理具体的文件数据,即块文件
NameNode 主节点保存文件元数据:单节点posix
DataNode 从节点保存文件Block数,多数据
DataNode 与NameNode1报错心跳, DataNode向NameNode提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据(cs架构)
DataNode利用服务器本地文件系统存储数据块
Hadoop架构
内存存储持久化
NameNode(NN)
基于内存存储:不会和磁盘发生交换(双向)
- 值存在内存中
- 持久化 单向 => 写入磁盘
NameNode主要功能:
- 接受客户端的读写服务
- 收集DataNode汇报的Block列表信息
NameNode保存metadata信息包括
- 文件owership和 permissions
- 文件大小,时间
- (Block列表:Block偏移量), 位置信息(持久化不存)
- Block每个副本位置(有DataNode上报)
NameNode持久化的两种方式 fsimage 和 edits
fsimage 写入磁盘时慢,从磁盘恢复到内存中快
- NameNode的metadata信息在启动后会加载到内存中
- 磁盘镜像快照 内存—》序列化 — 》 二进制文件
- metadata 存储到磁盘文件名 “fsimage”(时点备份 )
- 从二进制文件反序列化成对象恢复到内存中
- Block的位置信息不回保存到fsimage
edits 写入磁盘时快,从磁盘恢复时慢
- edits记录对metadata的操作日志 .存储所有操作记录
- 按照操作记录重新执行一遍从而变成内存中数据
所以二者需要结合使用
在系统第一次搭建完成后此时还没有跑起来时会格式化, 就会产生第一 fsimage 文件, 空的fsimage文件,启动hadoop时读取空的fsimage文件时会产生一个空的edits_log文件,此时edits和fsimage会进行合并生成一个新的fsimage文件,以后不管重启多少次fsimage文件将不会再改变,只是对edits文件增长,但是不能任由edits文件增长,此时需要在达到一定条件后再对edits和fsimage文件做合并,生成新的fsimage,充分发挥两者优势
此时需要SecondaryNameNode(SNN) Hadoop1.0
它不是NN的备份(但可以做备份), 它的主要工作就是帮助NN合并editslog,减少NN启动时间
SNN执行合并时机:
- 根据配置文件设置的时间间隔fs.checkpoint.period 默认是3600s
- 根据配置文件设置editslog的大小,fs.checkpoint.size 规定edits文件的最大值, 默认是64MB
DataNode(DN)
- 本地磁盘目录存储数据(Block),文件形式
- 同时存储Block的元数据信息文件(此处的元数据是指存储数据Block的md5值,确保文件的正确性完整性,如果不正确,则去另外的DN去寻找这个文件的备份)
- 启动DN时回想NN汇报block信息
- 通过向NN发送心跳保持与其联系(3s一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost, 并copy其上的block到其他DN上,恢复到默认的副本数
为啥是10分钟?
DN数据较大,给10分钟有可能进行恢复工作,避免进行频繁的拷贝
HDFS优点
- 高容错性
- 数据自动保存
- 副本丢失后,自动恢复
- 适合批处理
- 移动计算而非数据
- 数据位置暴露给计算框架(Block偏移量)
- 适合大数据处理
- GB,TB,甚至PB级数据
- 百万规模以上的文件数量
- 10K+节点
- 可构建在廉价机器上
- 通过多副本提高可靠性
- 提供了容错和恢复机制
HDFS缺点
- 低延迟数据访问
- 比如毫秒级
- 低延迟与高吞吐率
- 小文件存取
- 占用NameNode大量内存
- 寻道时间超过读取时间
- 并发写入,文件随机修改
- 一个文件只能有一个写者
- 仅支持append
Block的副本放置策略
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的其他节点。
更多副本:随机节点
HDFS写流程
HDFS写流程
- Client:
- 切分文件Block
- 按Block线性和NN获取DN列表(副本数)
- 验证DN列表后以更小的单位流式传输数据
- 各节点,两两通信确定可用 - Block传输结束后:
- DN向NN汇报Block信息
- DN向Client汇报完成
- Client向NN汇报完成 - 获取下一个Block存放的DN列表
。。。。。。 - 最终Client汇报完成
- NN会在写流程更新文件状态
读流程
HDFS读流程
- Client:
- 和NN获取一部分Block副本位置列表
线性和DN获取Block,最终合并为一个文件
在Block副本列表中按距离择优选取
MD5验证数据完整性
- 和NN获取一部分Block副本位置列表
HDFS文件权限 POSIX标准(可移植操作系统接口)
- 与Linux文件权限类似
- r:read w:write x:execute
- 权限x对于文件忽略,对于文件夹表示是否允许访问其内容
- 如果linux系统用户zhangsan使用hadoop命令也创建一个文件,那么这文件在HDFS中的owner就是zhangsan
- HDFS的权限目的:阻止误操作,但不绝对,HDFS相信,你告诉我你是谁,我就认为你是谁
安全模式
namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败,尚未获取动态信息)。
在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。
集群
角色==进程
- namenode
- 数据元数据
内存存储,不会有磁盘交换
持久化(fsimage,edits log)
不会持久化block的位置信息
block:偏移量,因为block不可以调整大小,hdfs,不支持修改文件
偏移量不会改变
- 数据元数据
- datanode
- block块,md5
磁盘
面向文件,大小一样,不能调整
副本数,调整,(备份,高可用,容错/可以调整很多个,为了计算向数据移动)
- block块,md5
- SN 只在hadoop1.x版本中有
- NN&DN
- 心跳机制
DN向NN汇报block信息
安全模式
- 心跳机制
- client
Client:
写
线性上传block
先和NN通信,元数据,获取第一个block的节点信息(3副本,选择机制)
和DN通信:pipeline:C和1stDN有socket,1stDN和2edDN有socket。。。。
小片传输:4K,C给1stDN,1stDN同时本机缓存,瞬间放入下游socket中
当block传输完毕:block自身的网络I/O时间,时间线重叠的艺术
DN会向NN汇报自己新增的block
C向NN汇报blockX传输完成给我下一个block节点信息
全部传输完成,NN更新元数据状态可用
读
线性读取block,不会有并发,只有一个网卡
距离:择优选取同机架,同节点
NN每次只给一部分block信息
Hadoop 分布式计算框架MR
Hadoop 体系架构
Hadoop安装
可以通过官网查看安装细节
Hadoop
- 操作系统环境
- 依赖软件ssh,jdk
- hadoop3.0以后需要装jdk8,其他的装jdk7就行
- 环境的配置
- java_home
vi + /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_67 PATH=$PATH:$JAVA_HOME/bin 保存退出 source /etc/profile
- 免密钥
cd到用户目录 ll -a 查看隐藏目录 如果没有 ./ssh文件夹 则输入 ssh localhost 输入密码后 再输入exit退出ssh 此时在输入 ll -a 就会看到 ./ssh文件夹 如果在输入 ssh localhost后无法免密,此时输入 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 此时会在ssh文件夹中生成两个文件 id_dsa,和id_dsa.pub 然后执行 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 验证:ssh localhost ,此时不需要输入密码就可以联接
部署伪分布式
安装jdk、配置环境变量,测试
免秘钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
hadoop包安装并配置环变:hadoop-2.6.5.tar.gz
Hadoop的第二次JAVA_HOME 环境变量配置
vi hadoop-env.sh
vi mapred-env.sh
vi yarn-env.sh
配置core-site.xml
vi core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://node001:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/test/hadoop/local</value>
</property>
配置hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node001:50090</value>
</property>
配置slaves文件
vi slaves node06
格式化hdfs
hdfs namenode -format (只能格式化一次,再次启动集群不要执行)
启动集群
start-dfs.sh
角色进程查看:jps
帮助: hdfs
hdfs dfs
查看web UI: IP:50070
创建目录:hdfs dfs -mkdir -p /user/root
查看目录: hdfs dfs -ls /
上传文件: hdfs dfs -put hadoop-2.6.5.tar.gz /user/root
停止集群:stop-dfs.sh
部署全分布式
全分布安装
---------------------------------------------
前期准备:
jdk
hostname
hosts
date
安全机制
firewall
windows 域名映射
节点: node001/003/003/04
全分布分配方案:
NN SNN DN
NODE06 *
NODE07 * *
NODE08 *
NODE09 *
节点状态:
node001: 伪分布
node002/003/004 : ip配置完成
建立各节点通讯(hosts)
设置时间同步:date -s “xxxx-x-xx xx:xx:xx”
秘钥分发:
在每个节点上登录一下自己:产生.ssh目录
从node001向node002/node003/node004分发公钥 (公钥的名称要变化)
scp id_dsa.pub node002:`pwd`/node001.pub
各节点把node001的公钥追加到认证文件里:
cat ~/node001.pub >> ~/.ssh/authorized_keys
node002/node003/node004安装jdk环境,node001分发profile给其他节点,并重读配置文件
分发hadoop部署程序2.6.5 到其他节点
copy node001 下的 hadoop 为 hadoop-local (管理脚本只会读取hadoop目录)
[root@node001 etc]# cp -r hadoop hadoop-local
配置core-site.xml
配置hdfs-site.xml
配置slaves
分发副本到其他002,003,004节点
格式化集群:hdfs namenode -format
启动集群:start-dfs.sh
Jps 查看各节点进程启动情况