* HBase框架基础(二)

上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程。

* HBase的读写流程及3个机制

HBase的读数据流程:

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

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

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

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

HBase写数据流程:

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

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

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

4、CLient先把数据写入到HLog,以防止数据丢失。

5、然后将数据写入到Memstore

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

7、如果Memstore达到阈(yu)值(注意,不存在“阀值”这么一说,属于长期的误用,在此提醒),会把Memstore中的数据flush到Storefile中。

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

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

重申强调上述涉及到的3个机制:

** Flush机制:

当MemStore达到阈值,将Memstore中的数据Flush进Storefile

涉及属性:

hbase.hregion.memstore.flush.size:134217728

即:128M就是Memstore的默认阈值

hbase.regionserver.global.memstore.upperLimit:0.4

即:这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。

hbase.regionserver.global.memstore.lowerLimit:0.38

即:当MemStore使用内存总量达到hbase.regionserver.global.memstore.upperLimit指定值时,将会有多个MemStores flush到文件中,MemStore flush 顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于hbase.regionserver.global.memstore.lowerLimit。

** Compact机制:

把小的Memstore文件合并成大的Storefile文件。

** Split机制

当Region达到阈值,会把过大的Region一分为二。

 
 

* HBaseAPI的使用

接下来我们来尝试一下使用Java来操作一下HBase,首先我们需要配置一下开发环境。

** 下载maven离线依赖包

maven本次用到的Hbase+Hadoop的Maven离线依赖包传送门:

链接:http://pan.baidu.com/s/1bpthCcf 密码:wjq

** 新建Eclipse的Maven Project,配置pom.xml的dependency如图:

 
 

** 接下来我们来表演一下HBase的相关操作

首先,声明静态配置,用以初始化整个Hadoop以及HBase的配置,如图:

 
 

检查表是否存在:

 
由于我的HBase中有student表,所以执行后返回true

注:这就是一个最简单的示例,接下来的代码展示,只展示最核心的函数块,不再全部截图,文后结束给大家Demo源码传送门

创建数据库表:

 
 

此处我在Java的主函数中执行了该创建表的方法,表明为staff,并有两个列族,分别为info和other_info,成功后,来到CRT验证一下,如图:

 
 

删除数据库表:

完成后请自行测试,如何测试已经在上一步告诉你了

 
 

增:

向我们之前创建好的student表中插入一条数据

 
 

然后执行:

 
请自行观察执行结果

结果:

 
 

删:

 
 

改:

与增的案例意思是一样的,只需要按照指定的rowKey和列族:列覆盖原来的值就可以了

查:

查询表中的所有数据和信息,所有的都会查了,单行信息就很简单了~

 
 

测试结果:

 
 

源码传送门:

链接:http://pan.baidu.com/s/1o8x5q8i 密码:2kf1

* HBase的MapReduce调用

1、首先需要查看配置HBase的Mapreduce所依赖的Jar包,使用命令:

$ bin/hbase mapredcp,然后出现如下依赖,这些依赖我们一会需要export 到classpath中:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-common-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/protobuf-java-2.5.0.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-client-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-hadoop-compat-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-protocol-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/high-scale-lib-1.1.1.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/zookeeper-3.4.5-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/guava-12.0.1.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/htrace-core-2.04.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/netty-3.6.6.Final.jar

2、执行环境变量的临时导入

$ export HBASE_HOME=/opt/modules/hbase-0.98.6-hadoop2

$ export HADOOP_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6

$ export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`

注意:两边有反引号,表示将mapredcp命令的执行结果赋值给classpath。

3、运行官方自带的MapReduce相关的jar

案例一:统计student表有多少行数据

直接执行代码:

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar lib/hbase-server-0.98.6-hadoop2.jar rowcounter student

案例二:使用MapReduce任务将数据导入到HBase

Step1、创建测试文件

$ vi fruit.txt,文件如图:

 
 

完事之后,我们要上传这个fruit.txt到HDFS系统中

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put ./fruit.txt /input/

Step2、创建HBase表

$ bin/hbase shell

hbase(main):001:0> create 'fruit','info'

Step3、执行MapReduce到HBase的fruit表中

在这一步开始之前,我们先拓展一点知识:

* tsv格式的文件:字段之间以制表符\t分割

* csv格式的文件:字段之间以逗号,分割(后面的数据分析我们会经常涉及到这样的格式)

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar \

lib/hbase-server-0.98.6-hadoop2.jar importtsv \

-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color \

fruit hdfs://mycluster/input

成功之后,我们来检查一下HBase中的数据,如图:

 
 

惊不惊喜?意不意外?

* 总结

本节主要是了解一些HBase的一些基本Java API,以及如何使用官方的jar来执行一些常用的MapReduce操作,比如向HBase中导入数据。注意:一定要仔细观察每一条语句执行的参数和意义,不要直接复制。(截图展示代码的目的也正是如此)


个人微博:http://weibo.com/seal13

QQ大数据技术交流群(广告勿入):476966007


作者:Z尽际
链接:https://www.jianshu.com/p/fb59dabbd67a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HBase框架基础(二)的更多相关文章

  1. HBase框架基础(五)

    * HBase框架基础(五) 本节主要介绍HBase中关于分区的一些知识. * HBase的RowKey设计 我们为什么要讨论rowKey的设计?或者说为什么很多工作岗位要求有rowKey的优化设计经 ...

  2. HBase框架基础(四)

    * HBase框架基础(四) 上一节我们介绍了如何使用HBase搞一些MapReduce小程序,其主要作用呢是可以做一些数据清洗和分析或者导入数据的工作,这一节我们来介绍如何使用HBase与其他框架进 ...

  3. HBase框架基础(三)

    * HBase框架基础(三) 本节我们继续讨论HBase的一些开发常识,以及HBase与其他框架协调使用的方式.在开始之前,为了框架之间更好的适配,以及复习之前HBase的配置操作,请使用cdh版本的 ...

  4. HBase框架基础(一)

    * HBase框架基础(一) 官方网址:http://hbase.apache.org/ * HBase是什么妖怪? 要解释HBase,我们就先说一说经常接触到的RDBMS,即关系型数据库: ** m ...

  5. TP框架基础 (二) ---空控制器和空操作

    通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...

  6. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

  7. Hive框架基础(二)

    * Hive框架基础(二) 我们继续讨论hive框架 * Hive的外部表与内部表 内部表:hive默认创建的是内部表 例如: create table table001 (name string , ...

  8. Hadoop框架基础(二)

    ** Hadoop框架基础(二) 上一节我们讨论了如何对hadoop进行基础配置已经运行一个简单的实例,接下来我们尝试使用eclipse开发. ** maven安装 简单介绍:maven是一个项目管理 ...

  9. django 基础框架学习 (二)

    Django框架基础-02 Django缓存cookie 1.说明        当我们服务器在响应数据的同时,希望写⼊⼀些缓存数据到客户端        我们可以选择在响应的同时,将要写⼊到客户端的 ...

随机推荐

  1. cmd文件操作-添加

    新建文件夹 mkdir 文件名 mkdir wenjianjia 新建文件 type NUL > 文件名.文件类型

  2. Android This Activity already has an action bar supplied by the window decor

    This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ ...

  3. iOS7实现带文本输入框的UIAlertView及获取TextField文本内容

    if (customAlertView==nil) { customAlertView = [[UIAlertView alloc] initWithTitle:@"自定义服务器地址&quo ...

  4. iReport5.6.0使用说明

    1,需要安装jdk1.7,因为目前还不支持最新的jdk1.8 2,安装好软件之后,打开安装目录下的etc/ireport.conf文件,配置关联自己的jdk1.7的路径,如下: #jdkhome=&q ...

  5. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  6. js闭包的用途详解

    js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中 我们来看看闭包的用途.事实上,通过使用闭包,我们可以做很多事情.比如模拟 ...

  7. 【原创】TimeSten安装与配置

    1.安装TimeSten 2.安装时要指定TNS_ADMIN_LOCATION,即tnsnames.ora的路径,因为tt会根据这个连接Oracle.C:\TimesTen\tt1122_32\net ...

  8. BZOJ 2555: SubString 后缀自动机_LCT

    很水的一道题,就是有些细节没注意到. 比如说将调试信息误以为是最终结果而多调了20分钟QAQ ..... 我们注意到,每新加一个节点,改变的是该节点沿着 Parent 走一直走到根节点. 对应的,在 ...

  9. 【模板】扩展中国剩余定理(EXCRT)

    扩展中国剩余定理,是求解形如:$x\equiv a_{1}($ mod $b_{1})$$x\equiv a_{2}($ mod $b_{2})$$x\equiv a_{3}($ mod $b_{3} ...

  10. CF587F Duff is Mad(AC自动机+树状数组+分块)

    考虑两一个暴力 1 因为询问\([a,b]\)可以拆成\([1,b]\)-\([1,a-1]\)所以把询问离线,然后就是求\([1,x]\)中被\(S_i\)包含的串的数量.考虑当\([1,x-1]- ...