Hbase客户端API基础小结笔记(未完)
客户端API:基础
HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无效数据之类的操作。
通常在正常负载下和常规操作下,客户端读操作不会受到其他修改数据的客户端影响,因为它们之间的冲突可以忽略不计。但是,当允许客户端需要同时修改同一行数据时就会产生问题。所以,用户应当尽量使用批量处理(batch)更新来减少单独操作同一行数据的次数。 (如果是实时系统,则需要加上synchronized关键字)
创建HTable实例是有代价的。每个实例都需要扫描.META表,以检查该表是否存在、是否可用,此外还要执行一些其他操作,这些检查和操作导致实例调用非常耗时,因此推荐用户只创建一次HTable实例(就好比在Hadoop的setup中创建一次实例,供后续mapreduce调用,最终在cleanup中close)
向HBase插入数据的example:
package HBaseTest; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; /**
* Created by root on 5/27/16.
*/
public class PutExample {
public static void main(String[] args){
//加载配置文件
Configuration conf = HBaseConfiguration.create(); HTable table = null;
try {
//创建HTable对象
table = new HTable(conf,"practice");
//设置rowkey
Put put = new Put(Bytes.toBytes("rowKeyNum1")); //设置要写入的列族,列与value
put.add(Bytes.toBytes("f1"),Bytes.toBytes("cardNo"),Bytes.toBytes("123456789")); table.put(put);
//获取rowkey
Get result = new Get("rowKeyNum1".getBytes());
//将获取到的值放入Hbase的Result中
Result rs = table.get(result);
//获取指定列族的列的value
String cardNo = Bytes.toString(rs.getValue("f1".getBytes(),"cardNo".getBytes()));
System.out.println("---cardNo---" + cardNo);
} catch (IOException e) {
e.printStackTrace();
} }
}
数据和坐标都是以Java的byte[]形式存储的,即以字节数组的形式存储的。使用这种底层存储类型的目的是 ,允许存储任意类型的数据,并且可以有效地只存储所需的字节,这保证了最少的内部数据结构开销。另一个原因是,每一个字节数组都有一个offerset参数和一个length参数,它们允许用户提交一个已存在的字节数组,并进行效率很高的字节级别的操作。
客户端的写缓冲区
每一个put操作实际上都是一个RPC操作,它将客户端数据传送到服务器然后返回。这只适合小数据量的操作,如果有个应用程序需要每秒存储上千行数据到HBase表中,这样的处理就不太合适了。(一般情况下,在LAN网络中大概要花1毫秒的时间,这意味着1秒钟的时间内只能完成1000次RPC往返响应。)
HBase的API配备了一个客户端的写缓冲区(write buffer),缓冲区负责收集put操作,然后调用RPC操作一次性将put送往服务器。(默认情况下,客户端缓冲区是禁用的,可以通过将自动刷写autoflush设置为false来激活缓冲区)
HTable table = new HTable(conf,"practice");
table.setAutoFlush(false);
客户端写缓冲区的大小默认是2MB,如果需要存储较大的数据,为了避免每次创建实例都要修改缓冲区大小,可以在hbase-site.xml配置文件中添加一个较大的预设值。
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value>
</property>
这会将缓冲区大小增肌到20MB,大小可以根据数据量等参考设置。
强制刷写数据可以调用table.flushCommits();直接产生一个RPC请求。
注意:
客户端缓冲区是一个简单的保存在客户端进程内存中的列表,用户需要注意不能在运行时终止程序,如果发生这种情况,哪些尚未被刷写的数据就会丢失,服务器将无法收到数据,因此这些数据没有任何副本可以用来做数据恢复。
另外注意,一个更大的缓冲区需要客户端和服务器端消耗更多的内存,因此服务器端也需要先将数据写入到服务器端消耗更多的内存,因为服务器端也需要先将数据写入到服务器的写缓冲区中,然后再处理它,估算服务器端内存的占用可使用hbase.client.write.buffer 乘以 hbase.regionserver.handle.count 乘以region服务器的数量。
如果用户只存储大单元格,客户端缓冲区的作用就不大了,因为传输时间占用了大部分的请求时间。
参考:《HBase权威指南》
Hbase客户端API基础小结笔记(未完)的更多相关文章
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- Hbase记录-HBase客户端API
本章介绍用于对HBase表上执行CRUD操作的HBase Java客户端API. HBase是用Java编写的,并具有Java原生API.因此,它提供了编程访问数据操纵语言(DML). HBaseCo ...
- Hbase王国游记之:Hbase客户端API初体验
§历史回顾 2018年岁末,李大胖朦胧中上了开往Hbase王国的车,伴着一声长鸣,列出缓缓驶出站台,奔向无垠的广袤. (图片来自于网络) 如不熟悉剧情的,可观看文章: 五分钟轻松了解Hbase列式存储 ...
- jQuery 学习笔记(未完待续)
一.jQuery概述 宗旨: Write Less, Do More. 基础知识: 1.符号$代替document.getElementById()函数 2.使 ...
- linux学习笔记---未完待续,缓慢更新
做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...
- Greys学习笔记(未完待续)
Greys介绍 greys-anatomy是一个Java线上诊断工具,取名来自美剧<实习医生格雷>,由菜鸟-杜琨同学开发维护.比我们常用的脚本工具btrace提供更多的功能,greys采用 ...
- oracle-绑定变量学习笔记(未完待续)
--定义变量SQL> var a number; --给绑定变量赋值SQL> exec :a :=123; PL/SQL procedure successfully completed. ...
- iOS开发——设备信息小结(未完待续...)
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] init]; NSString *name = device.name; //获取设备所有者 ...
- MongoDB基础教程系列--未完待续
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
随机推荐
- .NET WebForm 简介
WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. 在学习WebForm时,其知识量比WinForm要多,在实 ...
- Android Genymotion无法启动
virtualbox无法启动,闷声作大死改了uxtheme.dll导致系统无法启动,正确的解决方法 关于在64位win7下运行Virtualbox安装系统时出错(提示VBoxDD.DLL错误)的解决方 ...
- EverEdit安装
- IntelliJ UI安装
- warning MSB3391
1.用C#生成dll文件 提示 (warning MSB3391)"未包含任何可为 COM 互操作注销的类型"和 ( warning MSB3214)"不包含任何可为 C ...
- [转]CSS,font-family,常用网页字体
http://www.zreading.cn/ican/2014/10/css-font-family/ CSS,font-family,好看常用的中文字体 2014-10-14 例1(小米米官网): ...
- user-select : 保护版权内容的简单方案
有的适合我们需要保护我们页面的内容,为了版权或者安全等原因,这个适合我们可以使用 user-select 这个CSS属性,简单易用. 嗯,这个属性不麻烦,而且也不是 CSS 3 / CSS 4 的新属 ...
- 电源相关知识—S0、S1(POS)、S2、S3(STR)、 S4、S5、睡眠、休眠、待机
转 http://blog.sina.com.cn/s/blog_52f28dde0100l3ci.html APM https://en.wikipedia.org/wiki/Advanced_Po ...
- JavaScript整合
JavaScript已经学完了,总体感觉良好,但是突然发现原来JS可以做的东西比我想象的还要多!我整理了一些JavaScript的基础知识,这些内容掌握好的话,对我们深入学习JavaScript会有很 ...
- Wifite v2 is now available
Wifite v2 is now available What's new in this version: support for cracking WPS-encrypted networks ( ...