HBase篇

问题1、HBase的gc调优,为什么

Markdown
涉及文件:hbase-env.sh
1、并行GC
参数:-XX:+UseParallelGC
解释:开启并行GC
2、同时处理垃圾回收的线程数
参数:-XX:ParallelGCThreads=cpu_core – 1
解释:该属性设置了同时处理垃圾回收的线程数。
3、禁用手动GC
参数:-XX:DisableExplicitGC
解释:防止开发人员手动调用GC

为什么要通过GC调优来提升HBase效率呢?
JRE在默认情况下会按照一般情况来估计用用户的程序在做什么、它们怎么创建对象、如何分配堆去处理数据等。这些假设在多数情况下都是正确的。此外,JRE能够运用启发式的算法来根据运行的进程进行调整。甚至当启发式的学习调整功能受限于具体实现时,JRE也能够更好地处理某些特殊情况。
现在的底线是它不能很好地处理region服务器。主要原因是当redion服务器处理特定的负载时,特别是写入量过大的负载,繁重的负载会迫使内存分配策略无法安全地只依赖JRE对程序行为的各种假设:用户需要使用JRE所提供的选项来调整垃圾回收策略以应对这些特殊情况

问题2、HBase的读写机制

  • 读请求过程:

HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。

接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,从而读取到Meta,进而获取到Meta表中存放的元数据。

Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Memstore和Storefile来查询数据。

最后HRegionServer把查询到的数据响应给Client。

  • 写请求过程

Client也是先访问zookeeper,找到Meta表,并获取Meta表元数据。

确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。

Client先把数据写入到HLog,以防止数据丢失。

然后将数据写入到Memstore。

如果HLog和Memstore均写入成功,则这条数据写入成功

如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。

当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的HFile。

当HFile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

  • 细节描述

hbase使用MemStore和StoreFile存储对表的更新。
数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并 且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。
当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。

StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(minor_compact, major_compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile。
由于对表的更新是不断追加的,compact时,需要访问Store中全部的 StoreFile和MemStore,将他们按row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。

问题3、HBase如何设计rowkey,如何在负载均衡和读写性能之间做出平衡

  • rowKey长度原则
    rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。
    建议越短越好,不要超过16个字节,原因如下:
    • 数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
    • MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率
  • rowkey散列原则
    如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
  • rowkey唯一原则
    必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

  • 由于热点问题的存在,我们需要在负载均衡和读写性能之间做平衡;避免热点问题的方法有以下几种

    • 加盐
      在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
    • 哈希
      哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
    • 反转
      第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。
      反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题
    • 时间戳反转
      一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据
    • 其他建议
      尽量减少行键和列族的大小在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,这个时候它们将会占用大量的存储空间。
      列族尽可能越短越好,最好是一个字符。
      冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好

问题4、hive和hbase的区别

  • Hive

    • 数据仓库工具
      Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。

    • 用于数据分析、清洗
      Hive适用于离线的数据分析和清洗,延迟较高

    • 基于HDFS、MapReduce
      Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。

  • HBase

    • nosql数据库
      是一种面向列存储的非关系型数据库。
  • 用于存储结构化和非结构话的数据
    适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。

  • 基于HDFS
    数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。

  • 延迟较低,接入在线业务使用
    面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。

  • 总结:Hive与HBase

Hive和Hbase是两种基于Hadoop的不同技术,Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到HBase,或者从HBase写回Hive。

问题5、介绍hbase的协处理器

  • 协处理器有两种: observer 和 endpoint
    • Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。Observer Coprocessor 就是一些散布在 HBase Server 端代码中的 hook 钩子, 在固定的事件发生时被调用。比如: put 操作之前有钩子函数 prePut,该函数在 put 操作
      执行前会被 Region Server 调用;在 put 操作之后则有 postPut 钩子函数
      以 Hbase2.0.0 版本为例,它提供了三种观察者接口:
      ● RegionObserver:提供客户端的数据操纵事件钩子: Get、 Put、 Delete、 Scan 等。
      ● WALObserver:提供 WAL 相关操作钩子。
      ● MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。
      到 0.96 版本又新增一个 RegionServerObserver
      下图是以 RegionObserver 为例子讲解 Observer 这种协处理器的原理:
      在这里插入图片描述
    • Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处 理器执行一段 Server 端代码,并将 Server 端代码的结果返回给客户端进一步处理,最常 见的用法就是进行聚集操作。如果没有协处理器,当用户需要找出一张表中的最大数据,即
      max 聚合操作,就必须进行全表扫描,在客户端代码内遍历扫描结果,并执行求最大值的 操作。这样的方法无法利用底层集群的并发能力,而将所有计算都集中到 Client 端统一执 行,势必效率低下。利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,
      HBase 将利用底层 cluster 的多个节点并发执行求最大值的操作。即在每个 Region 范围内 执行求最大值的代码,将每个 Region 的最大值在 Region Server 端计算出,仅仅将该 max 值返回给客户端。在客户端进一步将多个 Region 的最大值进一步处理而找到其中的最大值。
      这样整体的执行效率就会提高很多
      在这里插入图片描述
  • 总结:
    Observer 允许集群在正常的客户端操作过程中可以有不同的行为表现
    Endpoint 允许扩展集群的能力,对客户端应用开放新的运算命令
    observer 类似于 RDBMS 中的触发器,主要在服务端工作
    endpoint 类似于 RDBMS 中的存储过程,主要在 client 端工作
    observer 可以实现权限管理、优先级设置、监控、 ddl 控制、 二级索引等功能
    endpoint 可以实现 min、 max、 avg、 sum、 distinct、 group by 等功能

问题6、hbase集群如何对jvm调优

见问题1

问题7、怎么把数据放到hbase的。hive整合hbase

  • 将hive分析结果的数据,保存到HBase当中去
    • 把hbase的lib目录下的五个jar包拷贝到hive的lib下
    • 修改hive的配置文件hive-site.xml,添加两条配置
    	<property>
                <name>hive.zookeeper.quorum</name>
                <value>node01,node02,node03</value>
        </property>
    
         <property>
                <name>hbase.zookeeper.quorum</name>
                <value>node01,node02,node03</value>
        </property>
    
    • 修改hive-env.sh配置文件添加以下配置
    export HADOOP_HOME=/export/servers/hadoop-2.7.5
    export HBASE_HOME=/export/servers/hbase-2.0.0
    export HIVE_CONF_DIR=/export/servers/apache-hive-2.1.0-bin/conf
    
    • 以上三步是准备步骤,现在在hive当中建外部表并加载数据
    create database course;
    use course;
    create external table if not exists course.score(id int,cname string,score int) 
    row format delimited fields terminated by '\t' stored as textfile ;
    
    load data local inpath '/export/hive-hbase.txt' into table score;
    
    • 创建hive内部表加载外部表数据,并与HBase进行映射
    create table course.hbase_score(id int,cname string,score int)  
    stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
    with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score") 
    tblproperties("hbase.table.name" = "hbase_score");
    
    insert overwrite table course.hbase_score select id,cname,score from course.score;
    
    • 在hbase当中查看表hbase_score
    • 总而言之,最重要的是建立hive表与HBase进行映射
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值