hadoop基础整理

一、大数据概念

主要解决海量数据的存储和数据分析计算的问题

8bite =1 Byte,1k=1024Byte,

Bite Byte KB MB,GB,TB,PB,EB,ZB,YB,BB,NB,DB

  • 大数据特点:

Volume 大量 (部分企业数据量达EB)

Velocity 高速(数据处理效率要高)

Variety 多样。(结构化+非结构化)

value 低价值密度

二、从hadoop框架讨论大数据生态

  • Hadoop
    hadoop的初衷是采用大量的廉价机器,组成一个集群!完成大数据的存储和计算!

1 hadoop 1.x和2.x区别

1.x和2.x的区别是将资源调度和管理进行分离!由统一的资源调度平台YARN进行大数据计算资源的调度!
提升了Hadoop的通用性!Hadoop搭建的集群中的计算资源,不仅可以运行Hadoop中的MR程序!也可以运行其他计算框架的程序!

在hadoop不久之后,由于MR的低效性,出现了许多更为高效的计算框架!
例如: Tez,Storm,Spark,Flink

完成大数据的计算
①写程序,程序需要复合计算框架的要求!

    java---->main----->运行
    MapReduce(编程模型)----->Map--Reducer

②运行程序,申请计算资源(cpu+内存,磁盘IO,网络IO)

    java----->JVM------>OS----->申请计算资源
    1.0: MapReduce(编程模型)---->JobTracker----->JVM----->申请计算资源
    2.0: MapReduce(编程模型)---->jar------>运行时,将jar包中的任务,提交给YARN,和YARN进行通信
            由YARN中的组件-----JVM------>申请计算资源

2 hadoop的组件

HDFS(框架):负责大数据的存储
YARN(框架): 负责大数据的资源调度

MR(编程模型): 使用Hadoop制定的编程要求,编写程序,完成大数据的计算!

2.1 HDFS:负责大数据的存储
  • Namenode(1个):

    • 负责文件,名称等元数据(属性信息)的存储!
      文件名,大小,文件切分了多少块(block),创建和修改时间等!
    • 职责:接受客户端的请求;接受DN的请求 ;向DN分配任务
  • DataNode(N个)

    • 负责文件中数据的存储!
    • 负责接受NM分配的任务;负责数据块(block)的管理(读,写)!
  • 可选进程:SecondaryNamenode(N个): 负责辅助NameNode工作!
2.2 MapReduce

MapReduce(编程规范): 程序中有Mapper(简单处理)和Reducer(合并)

遵循MapReduce的编程规范,编写的程序,打包后,称为一个Job(任务)!

Job需要提交到YARN上,向YARN申请计算资源,运行Job中的Task(进程)!

Job会先创建一个进程MRAppMaster(mapreduce 应用管理者),由MRAppMaster向YARN申请资源!
MRAppMaster负责监控Job中各个Task运行情况,进行容错管理!

2.3 Yarn:负责集群中所有计算资源的管理和调度!
  • ResourceManager(1个): 负责整个集群所有资源的管理!

    • 负责接受客户端的提交Job的请求!
    • 负责向NM分配任务!
    • 负责接受NM上报的信息!
  • NodeManager(N个): 负责单台计算机所有资源的管理!

    • 负责和RM进行通信,上报本机中的可用资源!
    • 负责领取RM分配的任务!
    • 负责为Job中的每个Task分配计算资源!
  • Container(容器): 对任务运行环境的抽象

    • NodeManager为Job的某个Task分配了2个CPU和2G内存的计算资源!
      ,避免被其他的task抢占资源!
    • 将计算资源,封装到一个Container中,在Container中的资源,会被暂时隔离
    • 当前Task运行结束后,当前Container中的资源会被释放!允许其他task来使用
  • ApplicationMaster :数据切分,为应用程序申请资源,并分配给内部任务,任务监控与容错

三、Hadoop 的运行环境搭建

1、重要目录

(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本

(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件

(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)

(4)sbin目录:存放启动或停止Hadoop相关服务的脚本

(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例

2、配置文件

(1)4个默认的配置文件:

     位置:  HADOOP_HOME/share/xxxx.jar/xxx-default.xml

​ 文件名:core-default.xml: 设置hadoop最核心的参数!
​ hdfs-default.xml 保存的是hdfs相关的参数!

​ mapred-default.xml: MR程序在运行时,需要使用的参数!

​ yarn-default.xml: yarn在启动时,需要的参数!

(2)4个可自定义的配置文件:xxx-site.xml

​ core-site.xml: 用户自定义的设置hadoop最核心的参数!
​ hdfs-site.xml 用户自定义的保存的是hdfs相关的参数!

​ mapred-site.xml: 用户自定义的MR程序在运行时,需要使用的参数!
​ yarn-site.xml: 用户自定义的yarn在启动时,需要的参数!

(3) tips

可以自定义配置文件的目录: hadoop --config 配置文件的目录
如果没有配置,默认读取 HADOOP_HOME/etc/hadoop 中对应的配置文件!

Hadoop在启动时,先加载4个默认的配置文件,再加载用户自定义的配置文件,如果用户自定义的配置文件中有和4个默认配置文件中门的参数,可以覆盖之前已经加载的值!

​ hadoop-daemon.sh start namenode脚本在执行时,只会去默认的目录中读取配置文件!

3、hadoop的运行模式:本地模式、伪分布式模式以及完全分布式模式

(1) 本地模式:在本机上使用hdfs,使用的就是本地的文件系统

​ 设置方法:

core-site.xmlfs.defaultFS=file:/// (默认,不用修改)

(2)伪分布式:NN和DN在一台机器,且只有一个DN节点

​ 设置方法:

  1. 配置集群

    指定HDFS中namenode的地址,core-site.xmlfs.defaultFS=hdfs://hadoop101:9000

    配置hdfs-site.xml指定HDFS副本的数量dfs.replication

  2. 启动集群

    格式化nameNode ,bin/hdfs namenode -format,启动namenode,datanode

    启动NN: hadoop-daemon.sh start namenode

                停止NN:  hadoop-daemon.sh stop namenode
                启动DN:  hadoop-daemon.sh start datanode
                停止DN:  hadoop-daemon.sh stop datanode
                使用:  hadoop fs  命令  文件路径
    
  3. 查看集群jps

    jps是JDK中的命令,不是Linux命令。不安装JDK不能使用jps

  4. Yarn上运行mapreduce程序

    完成大数据的计算!

         ①按照MR的规范编写一个程序
         ②将程序打包为jar
         ③运行jar中的程序
    

    两种运行模式:
    取决于参数: mapreduce.framework.name=local(默认)
    ①本地模式(在本机上运行MR) mapreduce.framework.name=local

         在本机运行MR!在本机使用多线程的方式,运行多个Task!

    ②在YARN上运行 mapreduce.framework.name=yarn

     将MR提交给YARN,由YARN将Job中的多个task分配到多台机器中,启动container运行task!
             需要启动YARN,YARN由RM和NM进程组成!
    

(3) 完全分布式

准备3台客户机 P0501&wo

四、HDFS(hadoop distributed file system)分布式文件系统

1. hfs 不支持对文件的随机读写,可以追加,但不能修改

​ 原因:文件在HDFS上存储时,以block为基本单位存储的

​ a. 没有提供对文件的在线寻址功能

​ b. 文件以块形式存储,修改了一个块中的内容,就会影响当前块之后的所有块,效率低

2. HDFS 不适合存小文件

原因: HDFS存储了大量的小文件,会降低NN的服务能力

NN负责文件元数据(属性,块的映射)的管理,NN在运行时,必须将当前集群中存储的所有文件的元数据全部加载到内存,NN需要大量的内存

4. 同一个文件在同一时刻只能有一个客户端写入

5. 块大小,取决于dfs.blocksize ,2.x 默认为128M,1.x 默认为64M

原因: 基于最佳传输损耗理论(在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输)

不论对磁盘的文件进行读还是写,都需要先进行寻址

目前硬件的发展条件,普通磁盘写的速率大概为100M/s,寻址时间一般为10ms

块在传输时,每64k还需要校验一次,因此块大小,必须为2的n次方

6. 块大小需要合适调节

不能太大,a. 在一些分块读取的场景,不够灵活,会带来额外的网络消耗;b.在上传文件时,一旦发生故障,会造成资源的浪费。

不能太小,a. 块太小,同样大小的文件,会占用过多的NN的元数据空间;b. 块太小,在进行读写操作时,会消耗额外的寻址空间

7 副本数的概念指的是最大副本数

默认块大小128M,指的是块的最大大小。每个块最多存128M,如果当前块存储的数据不满128M,存了多少数据,就占用多少磁盘空间,一个块只属于一个文件。

8 shell操作

hadoop fs 既可以对本地文件系统进行操作还可以操作分布式文件系统

hdfs dfs 只能操作分布式文件系统

hadoop fs -help +命令,可查帮助文档

9 HDFS的写数据流程

①服务端启动HDFS中的NN和DN进程
②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件
③NN处理请求,检查客户端是否有权限上传,路径是否合法等
④检查通过,NN响应客户端可以上传
⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,
NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回
⑥客户端根据返回的DN节点,请求建立传输通道

客户端向最近(网络举例最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)
下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点

通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!
每个节点在收到packet后,向客户端发送ack确认消息!

⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块
⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!

客户端关闭输出流


10 异常写流程

①-⑥见上
⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)
在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。
每个节点在收到packet后,向客户端发送ack确认消息!
如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!
假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到
dataQuene。

重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!
只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!
NN会自动维护副本数!

11 机架感知

2.7.2默认的策略:
第一个副本放在本地机架的一个DN节点
第二个副本放在本地机架的另一个DN节点

    本地机架的网络拓扑举例最多为2,速度快!

第三个副本放在其他机架的一个DN节点

    为了安全性

tomcat服务器日志
数据库服务卡mysql数据 客户端()

五、MapReduce

六、zookeeper

1、概述:zookeeper= 文件系统+通知机制

开源的分布式的,为分布式应用提供协调服务的apache项目,多用作为集群提供服务的中间件

负责存储和管理大家都关心的数据,eg,hdfs 的url

Zookeeper是java编写的一个开源的分布式的存储中间件!
Zookeeper可以用来存储分布式系统中各个进程都关心的核心数据!
Zookeeper采取观察者模式设计,可以运行客户端在读取数据时,设置一个观察者一旦观察的节点触发了指定的事件,服务端会通知客户端线程,客户端可以执行回调方法,执行对应的操作!

2、特点:

(1)一致性:zookpeer 中的数据按顺序分批入库,并最终一致

(2)原子性:一次数据更新要么成功要么失败

(3)单一视图:client 无论连接到哪个zk节点,数据都是一致的

(4)可靠性:每次对zk的操作状态都会保存到服务器,每个server保存一份相同的数据副本(和hdfs不一样,dhfs 每个datanode 数据不一致)

(5)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

(6)实时性:在一定范围内,client 能读取到最新数据

3、数据结构

与unix文件系统类似,整体可看作一棵树,每个节点称作一个znode,每个znode可以类似看作一个目录,其他可以创建子目录

zookeeper 集群自身维护了一套数据结构,存储结构是一个树形结构,其上每个节点,成为znode,每个znode默认能存1M的数据,每个znode可以通过其路径唯一标示

4、应用场景:

数据发布与订阅:适用于配置信息多设备共享,会发生动态变化

软负载均衡:负责收集服务信息与状态监控

集群管理:每台机器的运行状态收集

5、使用

启动:   bin/zkServer.sh start
             bin/zkCli.sh -server host:port
             
停止:   bin/zkServer.sh stop
          bin/zkCli.sh -server host:port  close|exit
          
增:   create [-s] [-e]  path  data
                -s:  创建一个带序号的znode
                -e:  创建一个临时znode,临时的znode被所创建的session拥有,一旦session关闭,临时
                        节点会被删除
删:   delete  path 
            rmr   path
改:   set  path  data

查:   get  path 
       stat path
       ls   path
       ls2  path
支持四字命令
nc hadoop101 2181  ruok
设置观察者
  get  path watch:  监听指定节点数据的变化
    ls   path watch:  监听当前路径子阶段数据的变化,一旦新增或删除了子节点,会触发事件
    注意: 观察者在设置后,只有当次有效!

二、ZK集群的注意事项

  1. ZK在设计时,采用了paxos协议设计,这个协议要求,集群半数以上服务实例存储,集群

    才可以正常提供服务
    
  2. ZK集群中,server有Leader 和Followwer两种角色

    Leader只有一个,在集群启动时,自动选举产生!
    
    选举Leader时,只有数据和Leader保持同步的Follower有权参与竞选Leader!
    在竞选Leader时,serverid大的Server有优势!
    
  3. 集群模式ZK的写流程

    ①客户端可以连接任意的zkserver实例,向server发送写请求命令
    ②如果当前连接的server不是Leader,server会将写命令发送给Leader
    ③Leader将写操作命令广播到集群的其他节点,所有节点都执行写操作命令
    ④一旦集群中半数以上的节点写数据成功,Leader会响应当前Server,让当前Server
            响应客户端,写操作完成!
            
    

你可能感兴趣的:(hadoop,hdfs)