* 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. cocos2d-x 中XML解析与数据存储

    一不小心就玩了一周的游戏了.哎.玩的时候时间过得总是这么快... 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉), 看了 ...

  2. 2435: [Noi2011]道路修建(树上操作)

    2435: [Noi2011]道路修建 题目:传送门 题解: 建完边之后以1为根建树,统计深度和各个点的子树大小(包括自己) 询问的时候:答案=长度*abs(n-深度大的点的子树大小*2) ans+= ...

  3. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  4. 如何显示bootstrap fileinput缩略图上面的删除按钮

    bootstrap上传文件控件初始化js: //bootstrap上传文件控件 $(".fileupload").fileinput({ language: "zh&qu ...

  5. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示

    pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...

  6. POJ 1273 Drainage Ditches【最大流】

    题意:给出起点是一个池塘,M条沟渠,给出这M条沟渠的最大流量,再给出终点是一条河流,问从起点通过沟渠最多能够排多少水到河流里面去 看的紫书的最大流,还不是很理解,照着敲了一遍 #include< ...

  7. ZBrush实用插件ZAppLink简介

    ZAppLink是ZBrush版本推出时被评为最值得期待的插件.事实证明,ZAppLink的出现让工具与工具之间有了交流,搭起软件与软件的沟通桥梁. ZAppLink插件专用于扩展ZBrush®的绘制 ...

  8. 路飞学城Python-Day3

    Moudle 1 Chapter 1 #练习题# 1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型?"""编译型:编译类指在应用源程 ...

  9. vue 锚点定位

    vue 锚点定位 <template> <div class="details"> <div class="wrapper w"& ...

  10. [HDU5687]2016"百度之星" - 资格赛 Problem C

    题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作. 1.insert : 往字典中插入一个单词2.delete: 在字典中删除所有前缀等于给定字符串的单词3.search: 查询是否在字 ...