HBase客户端API中,我们看到对HBase的任何操作都需要首先创建HBaseConfiguration类的实例。为HBaseConfiguration类继承自Configuration类,而Configuration类属于Hadoop核心包中实现的类,该类的主要作用是提供对配置参数的访问途径。

Configuration类中的配置参数都是来自于Hadoop的配置文件中,而这些配置文件在Configuration类中被当做一个个资源(Resource),每个资源都包含了一组以XML格式存在的name/value对,事实上,这些资源每一个都是单独的XML文件,例如HBase安装配置中提到过的core-site.xml等。对于Configuration类而言,最重要的就是提供访问配置信息的接口,该类提供了一系列的Set/Get方法用于读写特定名称(name)的值(value)。此外,Configuration类除了提供加载默认配置文件的方法外,还提供了addResource方法加载指定的xml配置文件,这样就允许一些基于Hadoop的子项目甚至是用户自己定义的配置参数被加载使用。

addResource类共有4种方式加载指定的配置信息:

Ø  String:加载指定文件名的配置文件,该文件须在Hadoop的classpath中。

Ø  Path:直接加载本地文件系统上以该参数为完整路径的配置文件。

Ø  URL: 指定配置文件的Url路径并加载。

Ø  InputStream:从输入流中反序列化所得到的配置对象。

Configuration类在默认情况下,会按照顺序加载下列配置文件:

Ø  core-default.xml:该文件包含了Hadoop的只读配置参数。

Ø  core-site.xml:该文件即用户设置的Hadoop配置参数。

由于Configuration类同时提供了对参数的Set方法,而处于集群的安全性等原因,管理员可能并不像某些参数在后期被改动,这时可以将配置文件中不希望被改动的参数设置为final,Configuration类在加载配置参数后,就会禁止对声明为final的参数的改动。如下图所示,可以设置core-site.xml中的fs.default.name参数为final,以禁止该值被修改。

值得注意的是,早期版本的Hadoop配置是通过hadoop-site.xml文件实现的,在近期的版本中,该配置文件已被弃用,而改用core-site.xml、mapred-site.xml和hdfs-site.xml结合来完成配置。因此,在载入配置文件时,Hadoop会检查在classpath中是否存在hadoop-site.xml,如果存在则会在日志中输出一条DEPRECATED的Warnning信息。

在了解了Configuration类之后,我们再分析其子类HBaseConfiguration类。下图为HBaseConfiguration类的类图,除了继承自Configuration类之外,该类还实现了一下私有或共有的方法。从功能上讲,该类也是提供对HBase配置参数的访问。

public HBaseConfiguration();

public HBaseConfiguration(finalConfiguration c);

这两个构造函数是用来实例化HBaseConfiguration类的,然而只在早期版本中使用,目前我们分析的0.90.4以及后期版本中,这两个构造函数都已被启用。由于新的HBaseConfiguration类中所有的成员变量和成员方法都被声明为static,因此该类已经被禁止实例化,而当我们需要使用HBaseConfiguration对HBase的配置信息进行访问时,事实上获得的是一个Configuration类的实例。

privatestatic Configuration conf = null;

static{

conf = HBaseConfiguration.create();

}

显然,HBaseConfiguration.create()方法返回的是一个能够访问HBase配置信息的Configuration的实例。

publicstatic Configuration create() {

Configuration conf = new Configuration();

return addHbaseResources(conf);

}

create()方法中主要做两个操作:首先创建一个Configuration类的实例conf,然后调用addHbaseResources方法对conf实例进行处理并将处理后的conf实例返回给该方法的调用者。

进一步,我们再分析addHbaseResources方法会执行那些操作:

public static ConfigurationaddHbaseResources(Configuration conf) {

conf.addResource("hbase-default.xml");

conf.addResource("hbase-site.xml");

checkDefaultsVersion(conf);

checkForClusterFreeMemoryLimit(conf);

return conf;

}

首先,调用conf对象的addResource(Stringname)方法,依照次序加载如下配置文件:

Ø  hbase-default.xml:该文件是hbase的默认配置参数。

Ø  hbase-site.xml:该文件为用户对hbase的配置参数。

然后,调用checkDefaultsVersion(Configurationconf)方法,该方法通过conf实例获取hbase.defaults.for.version的值,即配置文件hbase-default.xml中的版本信息,同时获取当前运行的HBase的版本信息,如果默认配置文件中的版本号不同于当前运行的HBase的版本号,则会抛出一个RuntimeException,报告配置文件与当前HBase环境的版本不一致。

最后,调用checkForClusterFreeMemoryLimit(Configuration conf)方法,该方法通过conf实例获取两个参数:

Ø  hbase.regionserver.global.memstore.upperLimit:RegionServer中每个MemStore的内存上限比例,超过这个值,一个新的update操作将被挂起,并强制执行flush操作。默认值为0.4,表示最大比例为堆大小的40%。

Ø  hfile.block.cache.size:HFile文件的块缓存大小占堆内存大小的比例。默认值为0.2,表示最大比例为20%。

获取这两个参数的值后,该方法将判断这两个参数的总大小是否超过堆内存大小的80%,如果这两个参数之和超过0.8,就会抛出一个RuntimeException,报告当前MemStore和BlockCache所占堆内存比例超过要成功执行集群操作的阈值上限。这里参数之和不能超过0.8的原因,是由于在HConstants类中,定义了一个HBASE_CLUSTER_MINIMUM_MEMORY_THRESHOLD常量,该常量的值为0.2,该值为集群成功启动所需要的最小空闲堆内存百分比,即集群成功启动所需要的空余堆空间至少为堆大小的20%。因此,当MemStore和BlockCache所占堆空间比例超过80%时,将导致集群无法成功启动。

转载自: http://hi.baidu.com/wangyucao1989/blog/item/5fc80c33afdf4a63ad4b5fbe.html

HBase Configuration过程相关推荐

  1. [Hbase]Hbase章2 Hbase读写过程解析

    写数据 Hbase使用memstore和storefile存储对表的更新.数据在更新时首先写入hlog和memstore,memstore中的数据是排序的,当memstore累计到一定的阀值时,就会创 ...

  2. Hbase安装~Hbase安装过程中常见的问题

    HBase的运行依赖于Zookeeper,Hadoop HBase安装 1.解压文件 tar -zxvf hbase-1.3.1-bin.tar.gz 2.配置文件 1)hbase-env.sh 修改 ...

  3. hbase 读写过程

    Hbase在生态系统中的位置 Hbase存储的逻辑视图 Hbase的存储格式 Hbase写数据流程 Hbase快速响应数据 Hbase在生态系统中的位置 HBase位于结构化存储层,Hadoop HD ...

  4. HBase 1.2.6 完全分布式集群安装部署详细过程

    2019独角兽企业重金招聘Python工程师标准>>> Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Big ...

  5. apache-hadoop-1.2.1、hbase、hive、mahout、nutch、solr安装教程

    1 软件环境: VMware8.0 Ubuntu-12.10-desktop-i386 jdk-7u40-linux-i586.tar.gz hadoop-1.2.1.tar.gz eclipse-d ...

  6. hbase/thrift/go连接失败

    问题 在通过Go连接hbase的过程中, 发现 get操作可以查到数据, 但是scanner命令访问数据失败, 也没有报错, 就是单纯的查不到数据. 而且Python PHP都一切正常. 这里简单复述 ...

  7. HBase Region 自动拆分策略

    原文地址:https://cloud.tencent.com/developer/article/1374592 HBase自定义拆分策略 自定义拆分策略 您可以使用自定义RegionSplitPol ...

  8. hbase常见问题及解决方案总结(一)

    hbase常见问题及解决方案总结(一) 使用hbase已经有一段时间,无论是在linux还是使用java api,大多数的问题-都没有进行整理,为了加强记忆,现在列举出曾一些我曾经踩过的坑,希望能对读 ...

  9. hbase安装记录测试

    hbase集群安装--jared 部署笔记是在2014年年初记录的,现在放在51cto上. ***环境介绍 1台master,3台node. master node1 node2 node3 hado ...

最新文章

  1. 全球顶级设计师云集天猫双11 超1000款时尚大牌新品首发
  2. 清除Solution中的vss信息
  3. 代码同步工具_可以多重连接的数据库管理工具
  4. Bzoj2037: [Sdoi2008]Sue的小球
  5. Python中单元测试出错了,会怎么样?
  6. 选择排序 自带时间复杂度分析
  7. 实例3:python
  8. 2016年3月-7月电机组装以及基于MAXON运动控制系统
  9. IPTV视频码流分析
  10. CentOS7图形界面模式
  11. 【洛谷OJ】传球游戏
  12. Linux可执行文件
  13. 直播录屏软件哪个好?什么软件可以录屏直播会议?
  14. Protel网络教程
  15. 【unity】解决3d max导出的fbx在unity贴图丢失的问题
  16. 闪迪加强版 120G 使用心得
  17. 2016全球大数据战略版图剖析(7):跨基础设施/分析篇
  18. 编程语言 - 强弱/动静态类型 - 整理
  19. 基于java的社区志愿者服务系统
  20. 数字游戏ABCD*E=DCBA-第11届蓝桥杯Scratch选拔赛真题精选

热门文章

  1. MYSQL——大厂面试问题集合
  2. python调参工作都是干啥的_知乎 | 计算机视觉工程师一天都大致在做些什么?
  3. C语言:1~100内的猜数游戏
  4. Unity中打开键盘+平板打开键盘+windows打开默认小键盘
  5. Redis Redis原理
  6. TIL: 简单初始化iex
  7. python 遍历字典 提取指定key值value
  8. 5ecsgo启动失败2错误代码2,csgo5e连接失败 | 手游网游页游攻略大全
  9. ubuntu下格式化sd卡
  10. 局域网电脑互相ping不通的解决办法