我爱编程

Hadoop技术总概

2018-04-20  本文已影响0人  活英雄

Hadoop1

HDFS

解决海量数据的存储
一个主节点namenode,多个从节点datanode
namenode:存储元数据,响应用户的操作请求。
datanode:存储数据,block64M,有三个副本。

secondarynamenode

作用:进行元数据的合并,备份元数据。
hdfs格式化以后会生成一个FSimage的镜像文件,用于保存元数据。
fsimage的信息有两份一份存在内存中一份存在磁盘上。当有文件上传到hdfs上时,会先把元数据存成两份,一份存入内存,一份以editlog线性追加的方式写入磁盘。

为了在namenode重启时,加快磁盘元数据载入内存的速度,磁盘上fsimage文件和editlog文件需要进行合并,合并过程需要再内存中进行,所以就出现了secondarynamenode,它把fsimage和编辑日志进行合并之后回传给namenode,自己也作为元数据的备份者。

secondarynamenode可以作为nanode备份但需要安装第三方软件和修改源码

image.png

MapReduce

  1. 主节点Jobtracker,
    接受用户提交的任务
    分配任务给taskTracker
    监控taskTracker执行的情况

  2. 从节点TaskTracker
    处理jobTracker分配的活

Hadoop1的架构问题

HDFS问题:
  1. 存在单点故障问题

  2. 内存受限
    namenode存储元数据,响应用户操作请求。
    为了能快速响应用户请求,把元数据放入到内存中。
    如果元数据量大,导致内存不够怎么办?

  3. 权限的问题

MapReduce1的问题:
  1. 只有一个主节点单点故障问题。
  2. 即要分配任务又要分配资源,干的活太多
  3. 难以支撑第三方框架(不可以给他们分配计算资源,如不能给spark分配计算资源只能分配MapReduce的计算资源)

Hadoop2

hdfs

解决单点故障问题

  1. 解决两个namenode元数据实时一致
    方式1:共享目录(几乎不用)
    方式2:QJM(使用奇数个节点)
    引用了JournalNode:可以保持数据的事务性一致,namenode传输元数据数据到journalNode要么全部成功要么全部失败。
    active实时写数据,standby实时读数据。

  2. 解决两个namenode自动切换

    1. 引入zookeeper
    2. 每个namenode节点配置一个zkfc
      过程:两个namenode启动之后去zookeeper抢占锁,抢到的就是active。zkfc实时监控namenode健康状况,通过心跳机制汇报给zookeeper。
      注意:Hadoop2HA的实现只支持两个namenode


      image.png

解决内存受限问题

使用用两套namenode,这两套的namenode的元数据是不一样的,而且各自是高可用的,这就叫做联邦federation。

在进行存数据时要指定存在哪个namenode上,就像存在哪个盘一样。如Hadoop dfs -put hello.txt hdfs://hadoop01:9000/hello/

联邦,可以按照部门或者项目来划分各套namenode存取的地址。

联邦也存在一定问题比如有的计算框架依赖于磁盘有的依赖于内存,不好管理。


image.png

MapReduce

  1. 解决单点故障
  2. 解决任务分配和资源分配都做的问题
  3. 解决不能支持其它计算框架的问题
    yarn的出现解决了以上问题。

YARN

YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。 YARN 集群,具有更好的扩展性,可用性,可靠性,向后兼容性,以及能支持除 MapReduce 以外的更多分布式计算程序。

ApplicationMaster
如果一个AM运行到80%挂了,会由另一个nodeManager节点上的备用AM接着运行。AM的信息是存在zookeeper之上的,其它备用AM成为active之后会继续运行80%之后的任务。

Yarn在2里面只能管理内存和cpu但不能管理磁盘和网络,这是未来发展的一个方向。

Hive

调优

  1. 从架构层面:
    网络如何配置
    防火墙如何规划
    带宽如何规划
    文件格式
    压缩格式
    资源的管理方式(yarn,Mesos等)
  2. 从源码层面:
    修改源码
  3. SQL层面
    SQL经验要丰富
  4. 参数层面
    HDFS,YARN,MapReduce,Hive

防止数据倾斜问题

自定义UDF

  1. 新建一个java项目导入hivejar包

  2. 新建一个类继承extend UDF

  3. 在这个类的内部实现一个到多个重载的名叫evaluate的方法

  4. 将编写好的自定义函数类打成jar包添加到hive的classpath中
    add jar /home/hadopp/**.jar ;
    list jar;

  5. 创建一个零时函数管理到用户自定义的类
    create temporary function myfunc as "类全限定名"

  6. 验证函数
    show functions;可以看到自定义的函数
    select myfunc(3,4);

    补充:当前会话断开后临时函数就失效。

hive hql

DDL的语句不需要跑MapReduce,因为涉及到的是元数据的操作。
另外还有select * from user;也不需要跑,因为user 是一张表,体现为hdfs上的一个目录。select * 负from user where p="1" 分区也体现为hdfs上的一个目录所以不需要计算。select name from user 特殊点:现在的版本不需要跑了。

HBase

HBase是一个分布式的面向列的,适合非结构化,半结构化,结构化,高性能的,可扩展的开源NoSQL数据库。

关系型数据库:

没有分布式时:如果库存不下可以分库,表存不下可以分表(水平分表,垂直分表)。
mysql和Oracle都是支持分布式的为什么扩展性不好呢?因为扩展时牵一发而动全身,而HBase只需要添加节点就可以了。

缺点
  1. 不好 驾驭
  2. 如果数据不大的情况下,处理起来没有关系型数据库处理起来快。

一次读数据的过程:

get ’tableName‘,’rowkey‘

  1. 通过zookeeper找到.meta.表,查询到region所在的regionserver
  2. 查找内存MemStore
  3. 通过布隆过滤器查找在哪一个StoreFile中
  4. 读取这个storeFile的Trailer,获得Datablock位置
  5. 把DataBlock加入内存找到rowkey
一次写数据过程:

put 't_Name','rk001','cf1:name','zhangsan'

  1. 通过跳表结构找到rejoin
  2. 把数据写入HLog文件
  3. 把数据写入MemStore(在其中排序)
  4. MemStore达到阈值,溢写到磁盘。
    a. 如果StoreFile达到3个进行一个minorCompact,只删除TTL=0且MIN_VERSION=>'0'的数据。
    b. 手动进行majorCompact合并Store内的所有文件为一个大文件,把相应put和delete进行抵消。
    c. 如果当前store所在的rejoin大于10G就会进行分裂,分裂的原则是保证一个rowkey所有的数据只存在于一个region之中的前提下进行均分。
一台rejoinserver挂了

关键点在于把利用HLog内存中数据恢复出来。因为其它的StoreFile都是持久化到成HFile的文件,也就是都有备份。

一台master挂了

所有元数据(namespace,table,column family)被冻结,无法创建表,删除表,修改表,在rejoin分裂的时候,无法进行rejoin的负载均衡。但是表的读写是正常的。

rowkey的设计三原则

  1. 长度越短越好,防止资源浪费
  2. 散列原则防止数据热点。
    加盐、哈希、反转、时间戳反转
  3. 唯一性原则。把经常一起读取数据设计成连续rowkey,存储在一起。

flume:日志收集系统

自动的把业务系统中的日志收集迁移到数据仓库中。

kafuka

在进行实时计算时会先把前端收集来的数据先缓存在kafka中。类似于一个缓存,

实时处理系统的架构

  1. 批处理层
    进行数据的清洗,数据的预处理,得到可以进行快速的查询的数据。
  2. 服务层
    支持批处理层,对批处理成的数据进行快速查询。
  3. 速度层
    解决实时处理的需求。
    • 实时处理就像商场中的扶梯,来一个人上一个人。离线计算使用MapReduce就像直升梯。

大数据流程图


image.png
上一篇下一篇

猜你喜欢

热点阅读