Hadoop入门及介绍

目录

  • Hadoop家族概述
  • Hadoop
    • Hadoop介绍
    • HDFS
      • 概述
      • 节点介绍
      • 文件读写
    • MapReduce
      • 概述
      • 原理过程分析
      • 管理框架
      • YARN
      • 失败处理
  • HBase
    • 概述
    • 内部原理
      • 服务器
      • 特点
      • 存储特性
    • 基本命令
  • 配置教程

内容结构

在这里插入图片描述

Hadoop家族概述

  • Hadoop:分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构;
  • Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计;适合数据仓库的统计分析;
  • Pig:大规模数据分析工具,提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算;
  • HBase:高可靠性、高性能、面向列、可伸缩的分布式存储系统;
  • Sqoop:将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中;
  • Zookeeper:为分布式应用所设计的分布的、开源的协调服务,主要是用来解决分布式引用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务;
  • Mahout:基于Hadoop的机器学习和数据挖掘的一个分布式框架,用MapReduce实现了部分数据挖掘算法,解决的并行挖掘的问题;
  • vro:一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制;

Hadoop

一、Hadoop介绍

        Hadoop是一个分布式系统基础架构,充分利用集群的威力进行高速运算和存储。主要解决大数据存储(HDFS)和大数据分析(MapReduce)两大问题;

二、HDFS

1、概述

        分布式文件系统。对于外部客户端而言,HDFS就像一个传统的分级文件系统,可以进行创建、删除、移动或重命名文件或文件夹等操作,与Linux文件系统类似;存储在HDFS中的文件被分成块,然后这些块被复制到多个数据节点中(DataNode),这与传统的RAID架构大不相同。块的大小(通常为128M)和复制块的数量在创建文件时由客户机决定。名称节点可以控制所有文件操作。HDFS内部所有的通信都基于标准的TCP/IP协议。

图片

2、节点介绍

1) NameNode

        处理客户端的读写请求、管理HDFS的名称空间、管理数据块映射信息、配置副本策略,其本质是一个主管、管理者;

2) DataNode

        存储实际的数据块,执行NameNode下达的命令(数据块的读/写操作);

3) Secondary NameNode

        在紧急情况下,辅助恢复NameNode。平时可以辅助NameNode,分担其工作量。会定期合并fsimage和fsedits,并推送给NameNode;

3、文件读写

图片

1)过程

        文件在客户端时会被分块,这里文件被分为A~E五个块。同时为了负载均衡,每个节点有三个块。具体步骤如下:

  • 客户端将要上传的文件按128M的大小分块;
  • 客户端向名称节点发送写数据请求;
  • 名称节点记录各个DataNode信息,并返回可用的DataNode列表;
  • 客户端直接向DataNode发送分割后的文件块,发送过程以流式写入;
  • 写入完成后,DataNode向NameNode发送消息,更新元数据;

2)注意

  • 写1T文件,需要3T的存储,3T的网络流量;
  • 在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode还活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去,读取时,读其他节点;
  • 宕掉一个节点没关系,还有其他节点可以备份;甚至,宕掉一个机架也没关系,其他机架上也有备份;

三、MapReduce

1、概述

        用于大规模数据集(大于1TB)的并行运算。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归纳)函数,用来保证所有映射的键值对中每一个共享相同的键组。

图片

2、原理过程分析

        单词计数来分析MapReduce的逻辑,如下图所示,一般的MapReduce程序会经过以下几个过程:输入(Input)、输入分片(Splitting)、Map阶段、Shuffle阶段、Reduce阶段、输出(Final result);

图片

1)步骤介绍

  • 数据一般放在HDFS上面,文件是被分块的;
  • 输入分片:在进行Map阶段之前,MapReduce框架会根据输入文件计算输入分片(split),每个输入分片会对应一个Map任务,输入分片往往和HDFS的块关系很密切。一般来说,一个文件块会对应至少一个分片,如果文件大小超过HDFS文件块则多作为多个输入分片。上图Splitting对应下面的三个数据应该理解为三个分片;
  • Map阶段:这个阶段的处理逻辑其实就是编写好的Map函数,因为一个分片对应一个Map任务,并且是对应一个文件块,所以这里其实是数据本地化的操作,也就是所谓的移动计算而不是移动数据。如上图,这里的操作其实就是把每句话进行分割,然后得到每个单词,再对每个单词进行映射,得到单词和1的键值对;
  • Shuffle阶段:这是“奇迹”发生的地方,MapReduce的核心其实就是Shuffle。原理就是将Map的输出进行整合,然后作为Reduce的输入发送给Reduce。简单理解就是把所有Map的输出按照键进行排序,并且把相对键的键值对整合到同一个组中,如上图,Bear、Car、Deer、River是排序的,并且Bear这个键有两个键值对;
  • Reduce阶段:与Map类似,这里也是用户编写程序的地方,可以针对分组后的键值对进行处理。如上图,针对同一个键Bear的所有值进行了一个加法操作,得到<Bear,2>这样的键值对;

MapReduce的本质就是把一组键值对<K1,V1>经过Map阶段映射成新的键值对<K2,V2>;接着经过Shuffle/Sort阶段进行排序和“洗牌”,把键值对排序,同时把相同的键的值整合;最后经过Reduce阶段,把整合后的键值对进行逻辑处理,输出到新的键值对<K3,V3>;

3、管理框架

        Hadoop MapReduce可以根据其使用的资源管理框架不同,而分为MR v1和YARN/MR v2版:

图片

1)MR v1版本

        资源管理主要是Jobtracker和Tasktracker:

  • Jobtracker主要负责:作业控制(作业分解和状态监控),主要是MR任务以及资源管理;
  • TaskTracker主要负责:调度Job的每一个子任务task;并且接受JobTracker的命令;

2)YARN/MR v2版本

        YARN把JobTracker的工作分为两部分:

  • ResourceManager(资源管理器):全局管理所有应用程序计算资源的分配;
  • ApplicationMaster:负责相应的调度和协调;

        NodeManager是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源(CPU、内存、硬盘、网络)使用情况,并且向调度器汇报;

4、YARN

1) 组成

        YARN资源管理框架包括ResourceManager(资源管理器)、ApplicationMaster、NodeManager(节点管理器):

图片

  • ResourceManager:全局的资源管理器,负责整个系统的资源管理和分配,它主要由两个组件构成:
    • 调度器(Scheduler):负责分配最少但满足Application运行所需的资源量给Application。Scheduler只是基于资源的使用情况进行调度,并不负责监视/跟踪Application的状态,当然也不会处理失败的Task;
    • 应用程序管理器(ApplicationManager):负责处理客户端提交的Job以及协商第一个Container以供ApplicationMaster运行,并且在ApplicationMater失败的时候会重新启动ApplicationMaster(YARN中使用Resource Container概念来管理集群的资源,Resource Container是资源的抽象,每个Container包括一定的内存、IO、网络等资源)
  • ApplicationMaster:是一个框架特殊的库,每个Application有一个ApplicationMaster,主要管理和监控部署在YARN集群上的各种应用;
  • NodeManager:主要负责启动ResourceManager分配给ApplicationMaster的Container,并且会监视Container的运行情况。在启动Container的时候,NodeManager会设置一些必要的环境变量以及相关文件;当所有准备工作做好后,才会启动该Container。启动后,NodeManger会周期性地监视该Container运行占用的资源情况,若是超过了该Container所声明的资源量,则会kill掉该Container所代表的进程;

2)ResourceManager

         全局的资源管理和任务调度

  • 把整个集群当做计算资源池,只关注分配,不管应用,且不负责容错;
  • 资源管理
    • 以前资源是每个节点分成一个个的Map slot和Reduce slot,现在是一个个Container,每个Container可以根据需要运行ApplicationMaster、Map、Reduce或者任意的程序;
    • 以前的资源分配是静态的,目前是动态的,资源利用率更高;
    • Container是资源申请的单位,用户提交作业到ResourceMananger,然后在某个NodeMananger上分配一个Container来运行ApplicationMaster,ApplicationMaster再根据自身程序需要向ResourceManager申请资源;
    • YARN有一套Container的生命周期管理机制,而ApplicationMaster和其Container之间的管理是应用程序自己定义的;
  • 任务调度
    • 只关注资源的使用情况,根据需求合理分配资源
    • Scheduler可以根据申请的需要,在特定的机器上申请特定的资源(ApplicationMaster负责申请资源时的本地化考虑,ResourceManager将尽量满足其申请需求,在指定的机器上分配Container,从而减少数据移动)

3)ApplicationMaster

        单个作业的资源管理和任务监控

  • ApplicationMaster可以是用任何语言编写的程序,它和ResourceManager和NodeManager之间是通过ProtocolBuf交互,以前是一个全局的JobTracker负责的,现在每个作业一个,可伸缩性更强,至少不会因为作业太多,造成JobTracker瓶颈。同时将作业的逻辑放到一个独立的ApplicationMaster中,使得灵活性更加高,每个作业都可以有自己的处理方式,不用绑定到MapReduce的处理模式上;
  • 特点
    • 计算应用的资源需求,资源可以是静态或动态计算的,静态的一般是Client申请时就指定了,动态则需要ApplicationMaster根据应用的运行状态来决定;
    • 根据数据来申请对应位置的资源;
    • 向ResourceMananger申请资源,与NodeManager交互进行程序的运行和监控,监控申请的资源的使用情况,监控作业进度;
    • 跟踪任务状态和进度,定时向ResourceManager发送心跳消息,报告资源的使用情况和应用的进度信息;
    • 负责本作业内的任务的容错;

4)Container

        基本的资源单位(CPU、内存等)

  • Container可以加载任意程序,而且不限于Java;
  • 一个Node可以包含多个Container,也可以是一个大的Container;
  • ApplicationMaster可以根据需要,动态申请和释放Container;

5)失败处理

  • 任务失败
    • 运行时异常或者JVM退出都会报告给ApplicationMaster;
    • 通过心跳来检查挂住的任务(timeout),会检查多次(可配置)才判断该任务是否失效;
    • 一个作业的任务失败率超过配置,则认为该作业失败;
    • 失败的任务或作业都会有ApplicationMaster重新运行;
  • ApplicationMaster失败
    • ApplicationMaster定时发送心跳信号到ResourceManager,通常一旦ApplicationMaster失败,则认为失败,但也可以通过配置多次后才失败;
    • 一旦ApplicationMaster失败,ResourceManager会启动一个新的ApplicationMaster;
    • 新的ApplicationMaster负责恢复之前的错误的ApplicationMaster的状态(yarn.app.mapreduce.am.job.recovery.enable=true),这一步是通过将应用运行状态保存到共享的存储上来实现的,ResourceManager不会负责任务状态的保存和恢复;
    • Client也会定时向ApplicationMaster查询进度和状态,一旦发现其失败,则向ResourceManager询问新的ApplicationMaster;
  • NodeManager失败
    • NodeManager定时发送心跳到ResourceManager,如果超过一段时间没有收到心跳消息,ResourceManager就会将其移除;
    • 任何运行在该NodeManager上的任务和ApplicationMaster都会在其他NodeManager上进行恢复;
    • 如果某个NodeManager失败的次数太多,ApplicationMaster会将其加入黑名单(ResourceManager没有),任务调度时不在其上运行任务;
  • ResourceManager失败
    • 通过checkpoint机制,定时将其状态保存到磁盘,然后失败的时候,重新运行;
    • 通过zookeeper同步状态和实现透明的HA

四、HBase

1、概述

1)定义

        一种列式的分布式数据库,类似于数据库的存储层,适用于结构化的存储。非常适合用来进行大数据的实时查询;但是底层依旧依赖hdfs来作为其物理存储,类似于hive;

2)特点

  • 大:一个表可以有数十亿行,上百万列;
  • 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
  • 面向列:面向列(族)的存储和权限控制,列(族独立检索);
  • 稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
  • 数据类型单元:都是字符串,没有类型;

2、内部原理

1)服务器

图片

  • Master服务器:负责维护表结构信息,挂掉之后依然可以查询数据,但是不能新建表;
  • RegionServer服务器:存储实际的数据,保存的表数据直接存储在hadoop的hdfs上;
  • Zookeeper:管理了hbase所有RegionServer的信息,包括具体的数据段存放在哪个RegionServer上。客户端每次与hbase连接,其实都是先与zookeeper通信,查询出哪个RegionServer需要连接,然后再连接RegionServer;

2)特点

  • Region:一段数据的集合,hbase中的表一般拥有一个到多个Region
    • Region不能跨服务器,一个RegionServer上有一个或者多个Region;
    • 数据量小的时候,一个Region足以存储所有的数据;但是,当数据量大的时候,hbase会拆分Region;
    • 当hbase在进行负载均衡的时候,也有可能会从一台RegionServer上把Region移动到另一台RegionServer上;
    • Region是基于hdfs的,它的所有数据存取操作都是调用了hdfs的客户端接口来实现的;
  • RegionServer:存放Region的容器,直观上说就是服务器上的一个服务。一般来说,一个服务器只会安装一个RegionServer服务;
  • Master:只负责各种协调工作,比如建表、删表、移动Region、合并等操作;

3)存储特性

图片

  • 列:最基本的存储单位,一个列或者多个列形成一行,行跟行的列可以完全不一样,行跟行的数据可以存储在不同的机器上,甚至同一行内的列也可以存储在完全不同的机器上;每个列都有多个版本,多个版本的值存储在单元格中。若干个列归类为一个列族;
  • 行键:完全由用户指定的一串不重复的字符串。hbase根据行键进行字典序升序排序,假如你插入hbase的时候,不小心用了之前已经存在的行键,那么就会把之前存在的行更新掉,之前已经存在的值会被放到这个单元格的历史记录里面,并不会丢掉,只是你需要带上版本参数才可以找到这个值;
  • 列族:一个表有几个列族是一开始就定好的。此外,表的很多属性,比如过期时间、数据块缓存以及是否压缩等都是定义在列族上。同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性,因为他们都在一个列族里面,而属性都是定义在列族上的;一个没有列族的表是没有意义的,因为列必须依赖列族而存在;
  • 版本号:可以省略,默认返回最后一个版本的数据;每个列或者单元格的值都被赋予一个时间戳;

3、基本命令

        hbase中的列全部都是灵活的,可以随便定义,你在向hbase中插入一个单元格的时候,这个单元格由表:列族:行:列来定位,所以是你在TableA中插入了一个单元格,这个单元那个的属性叫A,才让这行数据有了一个A列,而别的行有没有A列hbase并不知道,只有在hbase遍历到这行的时候它才会知道该行是否有这个列;
        hbase的所有数据属性都是定义在列族上的,同一个表的不同列族可以定义完全不同的两套属性,所以从这个意义上来说,列族更像是传统关系数据库中标,而表本身反倒变成只是存放列族的空壳了;
        hbase删除记录并不是真的删除了数据,而是放置了一个墓碑标记,把这个版本连同之前的版本都标记为不可见了。这是为了性能着想,这样hbase就可以定期去清理这些已经被删除的记录,而不用每次都进行删除操作。
        在使用hbase的时候,表是不可以说删就删的,因为可能很多客户端现在正好连着,而且也有可能hbase正在做合并或者分裂操作。如果你这时删除了表,会造成无法恢复的错误,hbase也不会让你直接就删表,而是需要先做一个disable操作,意思是先把这个表停用掉,并且下线。在没有什么数据或者没有什么人使用的情况下,disable命令会执行得很快,但如果系统已经上线了,并且负载很大的情况下disable命令会执行得很慢,因为disable要通知所有的RegionServer来下线这个表,并且有很多涉及该表的操作需要被停用掉,以保证该表真的已经完全不参与任何工作了;

//建立一个test表,表内有一个cf列族
create 'test','cf'
//查看整个库中的表
list 
//查看表属性
describe 'test'
//在已建的test表中建立新的cf2列族
alter 'test','cf2'
//往test表中插入一个单元格
put 'test','row1','cf:name','jack'
//遍历表的数据
scan 'test'
//查询某个单元格的记录
get 'test','row1','cf:name'
//删除单元格数据
delete 'test','row2','cf:name'
//删除列的信息
deleteall 'test','row3'
//停用表
disable 'test'
//删除表
drop 'test'
//查看具体命令的说明
help '命令'

五、配置教程

1、安装教程

  • 解压文件 – > /usr/local 为了方便更改名字
tar -zxf hadoop-2.7.5.tar.gz -C /usr/local 
mv /usr/local/hadoop-2.7.5.tar.gz /usr/local/hadoop
  • 配置hadoop环境变量
vim /etc/profile
//末尾添加如内容
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
//使环境变量生效
source /etc/profile
  • 修改hadoop启动所需的jdk环境目录
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
//修改下面一行内容,假设你此前已经将Java环境配置成功,并且路径为/usr/local/java
export JAVA_HOME=/usr/local/java
  • 测试
hadoop version

2、伪分布式配置教程

  • 修改配置文件 core-site.xml
<configuration>
  <property>
    <!--用来指定hdfs的老大,namenode的地址-->
    <name>fs.default.name</name>
    <value>hdfs://127.0.0.1:9000/</value>
   </property>
   <property>
     <!--用来指定hadoop运行时产生文件的存放目录-->
   <!--如果不配置,默认放在/tmp目录下,这是一个临时目录,数据>可能会被系统清除-->
     <name>hadoop.tmp.dir</name>
     <value>file:/usr/local/hadoop/tmp</value>
  </property>
</configuration>
  • 修改配置文件 hdfs-site.xml
<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
  </property>
  <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop/tmp/dfs/name</value>
  </property>
  <property>
      <name>dfs.datanode.name.dir</name>
      <value>file:/usr/local/hadoop/tmp/dfs/data</value>
  </property>
</configuration>
  • 修改配置文件 mapred-site.xml
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>
  • 修改配置文件 yarn-site.xml
<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>127.0.0.1</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>
  • 格式化NameNode
hdfs namenode -format
  • 启动所有进程 (启动每个节点都会要求输入一次密码,这个属于正常现象)
start-all.sh
  • 测试
jps

3、附录:配置hadoop的ssh免密登录

ssh-keygen -t rsa
//ip即填写你的服务器ip地址
ssh-copy-id -i .ssh/id_rsa.pub root@ip  
//查看是否以及获得keys
more .ssh/authorized_keys
发布了622 篇原创文章 · 获赞 150 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/feizaoSYUACM/article/details/104863085
今日推荐