Hadoop

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架构
Hadoop_第1张图片
Hadoop_第2张图片

内存存储持久化

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

Hadoop_第3张图片

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的副本放置策略

Hadoop_第4张图片

第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的其他节点。
更多副本:随机节点

HDFS写流程
Hadoop_第5张图片
HDFS写流程

  • Client:
    • 切分文件Block
    • 按Block线性和NN获取DN列表(副本数)
    • 验证DN列表后以更小的单位流式传输数据
      - 各节点,两两通信确定可用
    • Block传输结束后:
      - DN向NN汇报Block信息
      - DN向Client汇报完成
      - Client向NN汇报完成
    • 获取下一个Block存放的DN列表
      。。。。。。
    • 最终Client汇报完成
    • NN会在写流程更新文件状态

读流程
Hadoop_第6张图片
HDFS读流程

  • Client:
    • 和NN获取一部分Block副本位置列表
      线性和DN获取Block,最终合并为一个文件
      在Block副本列表中按距离择优选取
      MD5验证数据完整性

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
      磁盘
      面向文件,大小一样,不能调整
      副本数,调整,(备份,高可用,容错/可以调整很多个,为了计算向数据移动)
  • 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

    
        fs.defaultFS
        hdfs://node001:9000
    
    
        hadoop.tmp.dir
        /var/test/hadoop/local
    


配置hdfs-site.xml
              
    
        dfs.replication
        1
    
    
        dfs.namenode.secondary.http-address
        node001:50090
    
配置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  查看各节点进程启动情况


Hadoop Shell

Hadoop API

你可能感兴趣的:(大数据)