- 浏览: 610915 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
月光杯:
问题解决了吗?
Exceptions in HDFS -
iostreamin:
神,好厉害,这是我找到的唯一可以ac的Java代码,厉害。
[leetcode] word ladder II -
standalone:
One answer I agree with:引用Whene ...
How many string objects are created? -
DiaoCow:
不错!,一开始对这些确实容易犯迷糊
erlang中的冒号 分号 和 句号 -
standalone:
Exception in thread "main& ...
one java interview question
上面有一篇记录了client边的过程,现在看看RegionSever这边怎么进行下去。
经过HBaseRPC后,调用传递到HRegionServer.get(byte[] regionName, Get get).
HRegion region = getRegion(regionName); return region.get(get, getLockFromId(get.getLockId()));
然后是HRegion.get(Get)方法:
/* * Do a get based on the get parameter. */ private List<KeyValue> get(final Get get) throws IOException { Scan scan = new Scan(get); List<KeyValue> results = new ArrayList<KeyValue>(); InternalScanner scanner = null; try { scanner = getScanner(scan); scanner.next(results); } finally { if (scanner != null) scanner.close(); } return results; }
返回的scanner是一个RegionScanner. 去看它的construction method吧:
RegionScanner(Scan scan, List<KeyValueScanner> additionalScanners) { //DebugPrint.println("HRegionScanner.<init>"); this.filter = scan.getFilter(); // Doesn't need to be volatile, always accessed under a sync'ed method this.oldFilter = scan.getOldFilter(); if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) { this.stopRow = null; } else { this.stopRow = scan.getStopRow(); } this.isScan = scan.isGetScan() ? -1 : 0; this.readPt = ReadWriteConsistencyControl.resetThreadReadPoint(rwcc); List<KeyValueScanner> scanners = new ArrayList<KeyValueScanner>(); if (additionalScanners != null) { scanners.addAll(additionalScanners); } for (Map.Entry<byte[], NavigableSet<byte[]>> entry : scan.getFamilyMap().entrySet()) { Store store = stores.get(entry.getKey()); scanners.add(store.getScanner(scan, entry.getValue())); } this.storeHeap = new KeyValueHeap(scanners.toArray(new KeyValueScanner[0]), comparator); }
关键code是获取scanners。这里要对hbase的数据模型要有个了解了,hbase存储的table有column family的概念,一个column family可以包含不同的column。hbase存储的时候每个cf存储成一个Store,而每个store的数据包含在内存中的memstore和disk上的一个或多个HFile。所以store.getScanner(scan, entry.getValue()))返回memstore和HFile上的scanner。第二个参数就是所要查询的column集合。
/** * Return a scanner for both the memstore and the HStore files */ protected KeyValueScanner getScanner(Scan scan, final NavigableSet<byte []> targetCols) { lock.readLock().lock(); try { return new StoreScanner(this, scan, targetCols); } finally { lock.readLock().unlock(); } }
因为Store既包括memstore又包括StoreFile,所以每一个StoreScanner又要生成多个KeyValueScanner,具体看如下code:
/** * Opens a scanner across memstore, snapshot, and all StoreFiles. * * @param store who we scan * @param scan the spec * @param columns which columns we are scanning */ StoreScanner(Store store, Scan scan, final NavigableSet<byte[]> columns) { //DebugPrint.println("SS new"); this.store = store; this.cacheBlocks = scan.getCacheBlocks(); matcher = new ScanQueryMatcher(scan, store.getFamily().getName(), columns, store.ttl, store.comparator.getRawComparator(), store.versionsToReturn(scan.getMaxVersions())); this.isGet = scan.isGetScan(); List<KeyValueScanner> scanners = getScanners(); // Seek all scanners to the initial key // TODO if scan.isGetScan, use bloomfilters to skip seeking for(KeyValueScanner scanner : scanners) { scanner.seek(matcher.getStartKey()); } // Combine all seeked scanners with a heap heap = new KeyValueHeap( scanners.toArray(new KeyValueScanner[scanners.size()]), store.comparator); this.store.addChangedReaderObserver(this); }
StoreScanner这个construction method里面先调用getScanners()拿到所有的KeyValueScanner,然后seek所有的scanner到指定的key;然后再讲所有的scanner放到一个heap里,用以merge要返回的结果。
/* * @return List of scanners ordered properly. */ private List<KeyValueScanner> getScanners() { List<KeyValueScanner> scanners = getStoreFileScanners(); KeyValueScanner [] memstorescanners = this.store.memstore.getScanners(); for (int i = memstorescanners.length - 1; i >= 0; i--) { scanners.add(memstorescanners[i]); } return scanners; }
分析各个scanner的seek,首先看StoreFileScanner,具体执行seek的是HFile上:
public int seekTo(byte[] key, int offset, int length) throws IOException { int b = reader.blockContainingKey(key, offset, length); if (b < 0) return -1; // falls before the beginning of the file! :-( // Avoid re-reading the same block (that'd be dumb). loadBlock(b); return blockSeek(key, offset, length, false); }
这里要注意的是每个Store的每个HFile在regionserver起来后是一直处于open状态的,HFile上的block index被读取到内存保持的。这里1)首先在index上查查key所在的那个data block在HFile上的位置;2)然后再把这个block读取进来;3)再然后seek到要找的key。
这里的三步,第一步是在内存里做二分查找;第二步:
private void loadBlock(int bloc) throws IOException { if (block == null) { block = reader.readBlock(bloc, this.cacheBlocks, this.pread); currBlock = bloc; blockFetches++; } else { if (bloc != currBlock) { block = reader.readBlock(bloc, this.cacheBlocks, this.pread); currBlock = bloc; blockFetches++; } else { // we are already in the same block, just rewind to seek again. block.rewind(); } } }
大意就是check一下当前block是否正式要找的,如果是那就太好了!不是就去load吧。。。
load的code很长,但逻辑很简单,看看cache,cache里面没有,再去file system上load。这里面有了一次pread。玩HDFS的经验告诉我即使是pread,HDFS上的随机读效率差。
第三步是在读上来的block里面找到key,内存中的比较。
memstore上的seek就不说了,比较简单。
等所有scanner seek到位置后,然后都被添加到KeyValueHeap的优先队列中去,StoreScanner就构造好了。
再然后,所有的Store的StoreScanner又构造出一个KeyValueHeap,用于前面说过的不同的column family的结果合并。
有了这些后,就可以做查询了!HRegion.next(List<KeyValue> outResults) 调用HRegion.nextInteral()
do { this.storeHeap.next(results); } while (Bytes.equals(currentRow, nextRow = peekRow()));
之所以有个循环,就是要遍历不同的column family吧。
我的理解暂且到此。
发表评论
-
HBase Schema Design
2013-05-24 11:41 1186As someone has said here 引用You ... -
Question on HBase source code
2013-05-22 15:05 1098I'm reading source code of hbas ... -
Using the libjars option with Hadoop
2013-05-20 15:03 963As I have said in my last post, ... -
Use HBase to Solve Page Access Problem
2013-05-17 14:48 1179Currrently I'm working on sth l ... -
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/thi
2013-05-16 15:27 1135If you meet this exception, mak ... -
[youtube] Scaling the Web: Databases & NoSQL
2012-03-23 13:11 1079Very good talk on this subject. ... -
【读书笔记】Data warehousing and analytics infrastructure at facebook
2011-03-18 22:03 1946这好像是sigmod2010上的paper。 读了之后做了以 ... -
hbase中region的flush
2011-01-20 15:52 8783都知道memstore大小到一定程度后会flush到disk上 ... -
impact of total region numbers?
2011-01-19 16:31 923这几天tune了hbase的几个参数,有些有意思的结果。具体看 ... -
Will all HFiles managed by a regionserver kept open
2011-01-19 10:29 1463code 没看仔细,所以在hbase 的mail list上面 ... -
HBase importing
2010-11-30 12:54 1000slides by hbase developer Ryan ... -
hadoop-0.20.2+737 and hbase-0.20.6 not compatible?
2010-11-11 13:28 1304master log里面发现 0 region server ... -
hbase master cannot start up
2010-11-11 13:24 29422010-10-06 15:21:44,704 INFO ... -
细说HBase怎么完成一个Get操作 (client side)
2010-10-14 14:37 5353源码解析基于HBase-0.20.6。 先看HT ... -
Hbase read performance with increasing number of client threads
2010-10-12 23:19 1618在跑ycsb的时候,发现在做heavy的get操作的时候 ... -
What are some tips for configuring HBase?
2010-10-11 15:42 1412 -
当hbase的master无法停掉的时候……
2010-09-28 11:19 1448some times you will find the ma ...
相关推荐
4. **执行(execute)操作**:`execute`方法是一个更为灵活的接口,允许我们传递一个HBase操作的回调函数。这样,我们可以自定义更复杂的查询、更新或删除操作。回调函数通常会是一个实现了HBaseCallback接口的匿名...
Hbase是一个分布式的、面向列的数据库,常用于大数据存储,是Apache Hadoop生态系统的一部分。以下是一步步的安装和配置步骤: 1. **下载Hbase**: 首先,你需要访问清华大学的开源软件镜像站点,找到Hbase的最新...
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现,类似Google Bigtable...
在本实验中,我们将深入学习如何在大数据环境中使用HBase,这是一个分布式列式数据库,它在Hadoop生态系统中扮演着重要角色。实验的目标是让你理解HBase在Hadoop架构中的地位,以及掌握通过Shell命令和Java API进行...
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包
这里创建了一个名为`user`的表,并定义了两个列族:`info1`和`data1`。第二个例子则为`info`列族设置了3个版本。 ### 插入数据 使用`put`命令可以向表中插入数据。例如: ```sh put 'user', 'rk0001', 'info:name...
HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)兼容,因此非常适合编写HBase的客户端程序。 首先,确保你的...
随着数据量的增长,一个表会被划分成多个Region,每个Region由一个范围(start key, end key]表示,并且会被分配到不同的Region Server上进行管理。 - **-ROOT- Table**: 存储.META.表的位置信息。 - **.META. ...
HBase的数据模型是非关系型的,数据被组织成表,每行都有一个唯一的行键,列由列族和时间戳定义。这种设计使得HBase适合处理海量半结构化或非结构化数据。 **二、安装HBase** 1. **环境准备**:首先确保已安装Java ...
首先,HBase是Apache Hadoop生态中的一个分布式列式数据库,它提供实时的数据访问,并且支持大规模数据存储。HBase的设计目标是对超大型表进行随机、实时读写操作。而HDFS则是Hadoop的核心组件,作为一个分布式文件...
在大数据时代,Hbase 作为一个分布式、面向列的 NoSQL 数据库,广泛应用于大规模数据存储和处理中。同时,JavaAPI 作为一个强大且流行的编程语言,广泛应用于各种软件开发中。本文旨在介绍如何使用 JavaAPI 调用 ...
赠送jar包:hbase-server-1.4.3.jar; 赠送原API文档:hbase-server-1.4.3-javadoc.jar; 赠送源代码:hbase-server-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-server-1.4.3.pom; 包含翻译后的API文档:...
HBase是Apache的一个开源非关系型分布式数据库(NoSQL),它是建立在Hadoop文件系统(HDFS)之上,适用于需要快速读/写访问大量随机数据的场景。HBase采用了Google的Bigtable数据模型,底层物理存储采用了列存储的...
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。以下是HBase的安装与简单操作指南: 一、HBase安装 下载HBase 从HBase官方网站...
下面是一个 Java 操作 Hbase 的示例程序: 首先,引入需要的包: ```java import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; ...
完成操作后,可以使用`quit`命令或按`Ctrl + D`退出HBase Shell。 表管理命令包括`status`、`table_help`、`version`和`whoami`。这些命令用于查看表的状态、获取帮助、查看版本信息和显示当前操作的用户。 命名...
每个插入的数据都有一个时间戳,HBase可以通过时间戳来实现版本控制。 #### 9. Filter操作 HBase通过Filter来支持复杂的查询操作。例如,使用`scan '表名', {FILTER => '过滤器'} `可以对表数据进行过滤。过滤器...
在IT行业中,Spring框架是Java领域最常用的轻量级开源框架之一,而HBase则是一个分布式、基于列族的NoSQL数据库,适用于处理大规模数据。本教程将详细讲解如何使用Spring来操作HBase,这对于大数据处理和分布式系统...
HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...
1. **理解HBase在Hadoop体系结构中的角色**:HBase是Hadoop生态系统中的一个关键组件,它提供了对海量数据的高效存储和检索能力,特别适合于处理半结构化的数据,如日志、时间序列数据等。 2. **熟练使用HBase操作...