- 浏览: 87072 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (69)
- java (28)
- linux (6)
- redis (4)
- C# (3)
- 架构 (10)
- java ee (1)
- web (1)
- 操作系统 (7)
- sqlserver (1)
- android (2)
- Hadoop (12)
- 大数据 (21)
- 分布式 事务 消息 (10)
- linux mysql (1)
- 数据库 (3)
- 关于hadoop之bootshell使用 (2)
- 关于hbase---HTableInterfaceFactory (1)
- Spring (3)
- Hbase (5)
- jstorm (10)
- nginx (1)
- 分布式 (1)
- 区块链 (3)
- dubbo (1)
- nacos (1)
- 阿里 (1)
- go (3)
- 缓存 (1)
- memcached (1)
- ssdb (1)
- 源码 (1)
最新评论
-
想个可以用的名字:
楼主,能不能给发一份源代码,1300246542@qqq.co ...
spring+websocket的使用 -
wahahachuang5:
web实时推送技术使用越来越广泛,但是自己开发又太麻烦了,我觉 ...
websocket -
dalan_123:
前提是你用的是spring mvc 才需要加的1、在web.x ...
spring+websocket的使用 -
string2020:
CharacterEncodingFilter这个filter ...
spring+websocket的使用
关于hbase
一、客户端类
HTable 和 HTablePool: (1)、HTable用于一个线程创建一个HTable;最好只创建唯一一个HTable对象;因为每次创建HTable实例都需要付出代价;检查meta.表对应的表是否存在,是否可用以及其他
的一些操作;对性能的损耗不可忽视的;同时HBase所有的修改操作都是保证行级别的原子性;
(2)、若是需要多个HTable对象,则考虑使用HTablePool类;操作同一行的记录 最好使用batch操作;以减少单独操作该行的次数
二、CRUD操作
(1)、put方法
1、void put(Put put) throws IOException;将一个put或者存储在列表中的一组put作为输入参数
注:构建Put对象
Put(byte[] row);
Put(byte[] row, RowLock rowlock);
Put(byte[] row, long ts);
Put(byte[] long ts, RowLock rowLock);
参数说明:RowKey---》row 提供唯一的行键 RowLock--》行级锁 ts---》时间戳
2、byte转换类 Bytes
static byte[] toBytes(ByteBuffer bb);
static byte[] toBytes(String s);
static byte[] toBytes(boolean b);
static byte[] toBytes(long val);
static byte[] toBytes(float f);
static byte[] toBytes(int val);
3、put的add方法
Put add(byte[] family, byte[] qualifier,byte[] value);
Put add(byte[] family,byte[] qualifier,long ts, byte[] value);
Put add(KeyValue kv) throws IOException;
可以通过行键+列族+列限定符+时间戳定位具体的内容
关于ts参数,在通过add进行数据添加时,不指定ts参数内容时,则使用构造函数的ts对应的内容;若是在
构造实例也没有指定ts参数,则有region机器指定
(1)、KeyValue = 行键+列族+列限定符+时间戳
List<KeyValue> get(byte[] family,byte[] qualifier);
Map<byte[],List<KeyValue>> getFamilyMap();
(2)、检查单元格是否存在
boolean has(byte[] family,byte[] qualifier);
boolean has(byte[] family,byte[] qualifier, long ts);
boolean has(byte[] family,byte[] qualifier,byte[] value);
boolean has(byte[] family,byte[] qualifier,long ts,byte[]);
4、HBase使用
// 1、创建所需配置
Configuration conf = HBaseConfiguration.create();
// 2、实例化客户端
HTable table = new HTable(conf,"table name");
// 3、创建put存放数据记录
// 创建row key
Put put = new Put(Bytes.toBytes("row_key"));
// 创建column family
put.add(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
put.add(Bytes.toBytes("colfam2"),Bytes.toBytes("qual2"));
// 4、添加记录到指定的表
table.put(put);
以上代码Configuration对应HBase的hbase-site.xml文件(默认情况下程序会从classpath下直接尝试读取
hbase-default.xml 和 hbase-site.xml)再程序获取到Configuration一般是默认+用户自定义参数合并之后的结果
5、说明
(a)、关于hbase中的时间戳
在hbase中有一个特殊的功能,同一个列单元格(特定类的值)可以存在多个版本。就是通过使用时间戳按照降序来存储的,单位为毫秒;该参数可以通过客户端api进行指定,也可以忽略
让服务器端来完成。主要根据实际情况来完成的。这样获取指定的数据时,根据执行的参数可以获取多个。默认情况下只显示最新的那个版本
(b)、RowLock类
在构造Put实例时会存在一个RowLock参数,特别在某一行记录需要频繁修改时,可以在客户端创建RowLock实例防止用户的修改该行
(c)、KeyValue类
数据和坐标都是以byte[]形式存储;目的主要是为了允许存储任意类型的数据,并有效存储所需的字节,保证最少的
内部结构开销;并且每一个字节数据组都有一个offset和length参数,允许用户提交存在的字节数据,并进行高效率的
字节操作。
KeyValue(byte[] row,int offset,int rlength, -------RowKey
byte[] family, int foffset,int flength, ----Column Family
byte[] qualifier , int qoffset,int qlength,--Qualifier Column
long timestamp,Type type, -- Version
byte[] value,int voffset, int vlength) -- Value
byte[] getRow()
byte[] getKey() 行---》行键 键---指的是单元格的坐标
三、客户端write buffer
由于每一个put操作就是RPC操作;将client数据传输到server后返回,只适合小量数据操作;因而减少RPC调用就需要限制往返时间(round-trip time);也即是
client发送一个request到server,然后server进行网络response的时间。同时消息大小也会影响rpc性能;尽量使用批量处理,减少请求次数。
(1)、开启客户端的写缓冲区
void setAutoFlush(boolean autoFlush);
boolean isAutoFlush();
默认客户端缓存区是禁用的,可以通过设定为false开启缓冲区;不过一旦开启客户端缓冲区,数据进行写入时,需要手动执行
void flushCommits() throws IOException;
同时客户端可以手动调整缓冲区;不过更多是通过hbase-site.xml
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value>
</property>
缓冲区刷写
1、显示刷写 flushCommits
2、隐式刷写 通过将当前的缓冲区大小和用户配置大小作比较;若是超出限制则会调用flushCommits方法;若是禁用则需通过setAutoFlush(true)来开启
注:close方法也会触发隐式刷写
一旦客户端关闭自动刷写;没有手动执行flushCommits那么通过put操作的内容就不会被提交到server端
ArrayList<Put> getWriteBuffer() 获取添加到缓冲区中的Put实例列表;该列表在HTable不是线程安全的;
不能在程序运行期终止程序,否则会导致尚未刷写的数据丢失,
(2)、put 列表
// 1、put list
List<Put> puts = new ArrayList<Put>();
// 2、create put
Put put1 = new Put(Bytes.toBytes("ROW1"));
put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val1"));
// 3、add put to put list
puts.add(put1);
Put put2 = new Put(Bytes.toBytes("ROW2"));
put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val2"));
puts.add(put2);
// 4、执行put操作
table.put(puts);
原子性操作 compare-and-set(CAS)
boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,byte[] value,Put put)
throws IOException;
五、Scan的使用
类似RDBMS的游标
(1)、创建Scan及应用
// 创建Scan
Scan scan = new Scan();
// 指定扫描范围
scan.addColumn(Bytes.toBytes("colfam1"),
Bytes.toBytes("col-5").addColumn(Bytes.toBytes("colfam1"))
Bytes.toBytes("col-33").setStartRow(Bytes.toBytes("row-11")).setStopRow(Bytes.toBytes("row-20"))
);
// 获取ResultScanner
ResultScanner scanner = table.getScanner(scan);
// 迭代变量scanner
for(Result result : scanner){
System.out.println(result);
}
// scanner关闭
scanner.close();
注:获取的内容进行匹配的时候都是按照字典顺序排序的
六、缓存与批量处理
1、设定scanner的缓存
hbase-site.xml配置
<property>
<name>hbase.client.scanner.caching</name>
<value>10</value>
</property>
程序配置
void setCaching(int caching);
int getCaching();
缓存针对的行级的操作
批量是面向列级的操作
RPC请求次数 = (行数 * 每行的列数) / Min(每行列数,批量大小) / 扫描缓存次数(额外加上打开和关闭scanner)
一、客户端类
HTable 和 HTablePool: (1)、HTable用于一个线程创建一个HTable;最好只创建唯一一个HTable对象;因为每次创建HTable实例都需要付出代价;检查meta.表对应的表是否存在,是否可用以及其他
的一些操作;对性能的损耗不可忽视的;同时HBase所有的修改操作都是保证行级别的原子性;
(2)、若是需要多个HTable对象,则考虑使用HTablePool类;操作同一行的记录 最好使用batch操作;以减少单独操作该行的次数
二、CRUD操作
(1)、put方法
1、void put(Put put) throws IOException;将一个put或者存储在列表中的一组put作为输入参数
注:构建Put对象
Put(byte[] row);
Put(byte[] row, RowLock rowlock);
Put(byte[] row, long ts);
Put(byte[] long ts, RowLock rowLock);
参数说明:RowKey---》row 提供唯一的行键 RowLock--》行级锁 ts---》时间戳
2、byte转换类 Bytes
static byte[] toBytes(ByteBuffer bb);
static byte[] toBytes(String s);
static byte[] toBytes(boolean b);
static byte[] toBytes(long val);
static byte[] toBytes(float f);
static byte[] toBytes(int val);
3、put的add方法
Put add(byte[] family, byte[] qualifier,byte[] value);
Put add(byte[] family,byte[] qualifier,long ts, byte[] value);
Put add(KeyValue kv) throws IOException;
可以通过行键+列族+列限定符+时间戳定位具体的内容
关于ts参数,在通过add进行数据添加时,不指定ts参数内容时,则使用构造函数的ts对应的内容;若是在
构造实例也没有指定ts参数,则有region机器指定
(1)、KeyValue = 行键+列族+列限定符+时间戳
List<KeyValue> get(byte[] family,byte[] qualifier);
Map<byte[],List<KeyValue>> getFamilyMap();
(2)、检查单元格是否存在
boolean has(byte[] family,byte[] qualifier);
boolean has(byte[] family,byte[] qualifier, long ts);
boolean has(byte[] family,byte[] qualifier,byte[] value);
boolean has(byte[] family,byte[] qualifier,long ts,byte[]);
4、HBase使用
// 1、创建所需配置
Configuration conf = HBaseConfiguration.create();
// 2、实例化客户端
HTable table = new HTable(conf,"table name");
// 3、创建put存放数据记录
// 创建row key
Put put = new Put(Bytes.toBytes("row_key"));
// 创建column family
put.add(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
put.add(Bytes.toBytes("colfam2"),Bytes.toBytes("qual2"));
// 4、添加记录到指定的表
table.put(put);
以上代码Configuration对应HBase的hbase-site.xml文件(默认情况下程序会从classpath下直接尝试读取
hbase-default.xml 和 hbase-site.xml)再程序获取到Configuration一般是默认+用户自定义参数合并之后的结果
5、说明
(a)、关于hbase中的时间戳
在hbase中有一个特殊的功能,同一个列单元格(特定类的值)可以存在多个版本。就是通过使用时间戳按照降序来存储的,单位为毫秒;该参数可以通过客户端api进行指定,也可以忽略
让服务器端来完成。主要根据实际情况来完成的。这样获取指定的数据时,根据执行的参数可以获取多个。默认情况下只显示最新的那个版本
(b)、RowLock类
在构造Put实例时会存在一个RowLock参数,特别在某一行记录需要频繁修改时,可以在客户端创建RowLock实例防止用户的修改该行
(c)、KeyValue类
数据和坐标都是以byte[]形式存储;目的主要是为了允许存储任意类型的数据,并有效存储所需的字节,保证最少的
内部结构开销;并且每一个字节数据组都有一个offset和length参数,允许用户提交存在的字节数据,并进行高效率的
字节操作。
KeyValue(byte[] row,int offset,int rlength, -------RowKey
byte[] family, int foffset,int flength, ----Column Family
byte[] qualifier , int qoffset,int qlength,--Qualifier Column
long timestamp,Type type, -- Version
byte[] value,int voffset, int vlength) -- Value
byte[] getRow()
byte[] getKey() 行---》行键 键---指的是单元格的坐标
三、客户端write buffer
由于每一个put操作就是RPC操作;将client数据传输到server后返回,只适合小量数据操作;因而减少RPC调用就需要限制往返时间(round-trip time);也即是
client发送一个request到server,然后server进行网络response的时间。同时消息大小也会影响rpc性能;尽量使用批量处理,减少请求次数。
(1)、开启客户端的写缓冲区
void setAutoFlush(boolean autoFlush);
boolean isAutoFlush();
默认客户端缓存区是禁用的,可以通过设定为false开启缓冲区;不过一旦开启客户端缓冲区,数据进行写入时,需要手动执行
void flushCommits() throws IOException;
同时客户端可以手动调整缓冲区;不过更多是通过hbase-site.xml
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value>
</property>
缓冲区刷写
1、显示刷写 flushCommits
2、隐式刷写 通过将当前的缓冲区大小和用户配置大小作比较;若是超出限制则会调用flushCommits方法;若是禁用则需通过setAutoFlush(true)来开启
注:close方法也会触发隐式刷写
一旦客户端关闭自动刷写;没有手动执行flushCommits那么通过put操作的内容就不会被提交到server端
ArrayList<Put> getWriteBuffer() 获取添加到缓冲区中的Put实例列表;该列表在HTable不是线程安全的;
不能在程序运行期终止程序,否则会导致尚未刷写的数据丢失,
(2)、put 列表
// 1、put list
List<Put> puts = new ArrayList<Put>();
// 2、create put
Put put1 = new Put(Bytes.toBytes("ROW1"));
put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val1"));
// 3、add put to put list
puts.add(put1);
Put put2 = new Put(Bytes.toBytes("ROW2"));
put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val2"));
puts.add(put2);
// 4、执行put操作
table.put(puts);
原子性操作 compare-and-set(CAS)
boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,byte[] value,Put put)
throws IOException;
五、Scan的使用
类似RDBMS的游标
(1)、创建Scan及应用
// 创建Scan
Scan scan = new Scan();
// 指定扫描范围
scan.addColumn(Bytes.toBytes("colfam1"),
Bytes.toBytes("col-5").addColumn(Bytes.toBytes("colfam1"))
Bytes.toBytes("col-33").setStartRow(Bytes.toBytes("row-11")).setStopRow(Bytes.toBytes("row-20"))
);
// 获取ResultScanner
ResultScanner scanner = table.getScanner(scan);
// 迭代变量scanner
for(Result result : scanner){
System.out.println(result);
}
// scanner关闭
scanner.close();
注:获取的内容进行匹配的时候都是按照字典顺序排序的
六、缓存与批量处理
1、设定scanner的缓存
hbase-site.xml配置
<property>
<name>hbase.client.scanner.caching</name>
<value>10</value>
</property>
程序配置
void setCaching(int caching);
int getCaching();
缓存针对的行级的操作
批量是面向列级的操作
RPC请求次数 = (行数 * 每行的列数) / Min(每行列数,批量大小) / 扫描缓存次数(额外加上打开和关闭scanner)
发表评论
-
nacos单机源码调试
2018-12-17 11:35 1221首先从github上获取对应的源码Nacos源码git cl ... -
jstorm源码之TransactionalState
2016-03-21 19:31 888一、作用 主要是通过结合zookeeper,在zookee ... -
jstorm源码之RotatingTransactionalState
2016-03-21 19:29 581一、作用 构建一个Rotationg transacti ... -
jstorm源码之PartitionedTridentSpoutExecutor
2016-03-21 19:28 887一、作用 Partition Spout对应的exec ... -
jstorm源码之 RichSpoutBatchExecutor
2016-03-21 19:28 0一、作用 RichSpoutBatchExecutor是IRi ... -
jstorm源码之RotatingMap
2016-03-21 19:27 876一、作用 基于LinkedList + HashM ... -
jstorm源码之 RichSpoutBatchExecutor
2016-03-21 19:24 615一、作用 RichSpoutBatchExecutor是IRi ... -
jstorm源码之TridentTopology
2016-03-16 18:12 2363在jstorm中对应TridentTopology的源码如下, ... -
jstorm操作命令
2016-03-15 18:04 2737启动ZOOPKEEPER zkServer.sh start ... -
JStorm之Supervisor简介
2016-03-15 18:02 1249一、简介Supervisor是JStorm中的工作节点,类似 ... -
JStorm介绍
2016-03-15 17:56 919一、简介Storm是开源的 ... -
mycat的使用---sqlserver和mysql
2016-01-11 14:33 8617数据库中间件mycat的使 ... -
HBase系列四--计数器
2015-12-02 10:58 1980一、计数器 在hbase中,由于针对同一行的记录进行 ... -
HBase系列三
2015-12-01 16:51 2309关于spring-hbase中scan + filter的操作 ... -
spring hadoop系列(六)---HbaseSystemException
2015-11-30 09:13 498一、源码 /** * HBase Data Access e ... -
spring hadoop系列(五)---spring hadoop hbase之HbaseSynchronizationManager
2015-11-27 18:16 875一、源码如下 /** * Synchronization m ... -
spring hadoop 系列(三)--spring hadoop hbase HbaseConfigurationFactoryBean
2015-11-27 16:28 1541一、源码分析 /** * 设定Hbase指定Configu ... -
spring hadoop 系列(二)
2015-11-27 15:26 597一、源码分析 /** * * HbaseAccesso ... -
spring hadoop之batch处理(二)
2015-11-24 18:10 1523一、测试 public class MrBatchApp { ... -
spring hadoop之mapreduce batch
2015-11-24 15:51 636一、测试 // 定义hadoop configuration ...
相关推荐
### Hadoop与HBase系列配置知识点 #### 一、Hadoop概述 Hadoop是一个由Apache基金会维护的开源软件框架,其主要目标是为了实现可靠、可扩展的分布式计算环境。通过简单编程模型支持大规模数据集在计算机集群上的...
- **第7章:构建实际应用**:通过一系列具体的案例研究,展示如何使用HBase构建复杂的应用程序,涵盖了从需求分析到系统设计、实现再到测试和部署的全过程。 #### 三、HBase核心技术详解 **1. 数据存储模型**:...
HBase是Apache软件基金会的一个开源项目,是一款基于Google Bigtable理念设计的分布式列式数据库,专为大规模数据存储而设计。...然后,用户可以通过创建表、插入数据、执行查询等一系列操作,体验HBase的强大功能。
行键是唯一的,而列族则包含一系列相关的列。在hbase-0.98.23的源代码中,可以看到`org.apache.hadoop.hbase.regionserver.HRegion`类是处理单个HBase表区域的主要类,其中包含了行键到列族数据的映射。 其次,...
1. **表(Table)**:HBase中的数据组织在表中,表由行和列族组成,每个表都有一个唯一的名字。 2. **行(Row)**:表中的数据按照行键(Row Key)排序存储。行键是不可变的,用户自定义的字节数组,用于定位数据。 ...
这个过程涵盖了一系列的技术细节,包括Thrift的原理、HBase的Thrift服务、Python客户端的使用,以及在实际项目中的应用和优化策略。通过提供的博客配套文件,读者可以更深入地学习和实践这一技术。
每个HRegionServer管理一系列HRegion对象,每个HRegion对应表的一个逻辑分区。HRegion由多个HStore组成,每个HStore对应一个Column Family,提供了一种存储和访问数据的逻辑单元,适合存放具有相似访问模式的列。 ...
HBase 1.0版本的发布标志着该项目的重要里程碑,它是未来1.x系列版本的稳定基础。这个版本旨在至少达到0.98稳定版本的水平,同时避免引入过多新功能,确保了版本的稳定性和可靠性。HBase 1.0版的发布由HBase 1.0版本...
1. **HBase客户端API**:这是Java-HBase开发包的核心,提供了一组Java接口和类,用于连接到HBase集群,创建表,插入、查询和更新数据。例如,`HTableInterface` 和 `HBaseAdmin` 接口,以及 `Put`、`Get` 和 `Scan` ...
1. **分布式架构**:HBase采用Master-Slave架构,由一个HMaster主节点负责区域服务器(RegionServer)的管理、故障检测和负载均衡,多个RegionServer存储实际的数据,提供读写服务。 2. **表和列族**:HBase的表是...
在Java客户端上连接HBase集群时,需要配置一系列的环境和依赖,其中包括了`winutils`工具。`winutils-2.2.0.zip`这个压缩包就是针对Windows用户提供的,用于配置Hadoop环境,以便于与HBase交互。 首先,`winutils....
对于`hadoop-2.5.2-hbase-0.14.0-hadoop2`这个版本,它适用于Hadoop 2.x系列,这是Hadoop的一个重要版本,引入了YARN资源管理器,提高了集群的效率和可扩展性。 HBase的安装通常包括以下几个步骤: 1. 下载HBase的...
在HBase的开发中,常常需要使用到一系列的jar包,这些jar包涵盖了HBase本身及其依赖的库,如Hadoop的相关组件。Hadoop的jar包通常包含Hadoop Common、Hadoop HDFS、Hadoop MapReduce等模块,它们提供了Hadoop的基本...
- **区域划分**:表被划分为多个区域(table shards),每个区域包含一系列连续的行键。区域由起始和结束行键定义。 ##### 2. 分布与分配 - **分布单位**:区域是HBase集群中数据分布的基本单位。 - **分配策略**:...
《大数据云计算技术系列:Hadoop之Hbase从入门到精通》 HBase,全称Hadoop Database,是一款基于Hadoop生态系统的分布式列式存储系统,旨在处理海量结构化数据。它借鉴了Google Bigtable的设计思想,但开源并适应了...
在HBase 1.x版本中,为了便于用户更直观地管理和操作HBase表,开发了一系列的可视化客户端工具。这些工具不仅简化了命令行操作的复杂性,还通过图形化的界面使得数据查询和管理变得更加友好。 首先,我们要了解...
7. **兼容性**:HBase 1.2.6版本与Hadoop 2.x系列兼容,可以无缝地集成到Hadoop生态系统中,如MapReduce、HDFS和YARN。 **资源获取与安装**: 原始资源位于Apache的官方归档服务器上,地址是:`...
大数据云计算技术系列 Hbase 简介 一、简介 Hbase源于Chad Walters和Jim在2006年11月提出的BigTable概念,它是一个开源的分布式数据库,最初作为Hadoop贡献项目的一部分在2007年2月创建。2007年10月,Hbase成为首...
HBase提供了一系列的管理和监控工具,例如HBase Shell用于执行管理命令,HBase Master UI用于监控集群状态,以及JMX服务用于远程监控。管理员应定期检查这些工具以确保系统健康运行。 通过理解并熟练掌握这些知识...