当前一般HBase的读写(删除也认为是写)都是通过HTable对象来操作的。
首先看官方的注释
* <p>Used to communicate with a single HBase table.
*
* <p>This class is not thread safe for reads nor write.
*
* <p>In case of writes (Put, Delete), the underlying write buffer can
* be corrupted if multiple threads contend over a single HTable instance.
多线程操作同一个HTable实例的时候write buffer会混乱。也就是说HTable不是线程安全的。
具体体现在两个方面:
1.写的时候会把数据写到一个writebuffer里面,多线程的话全部写入到同一个buffer会导致数据紊乱
2. wirteBuffer清空的时候也有问题,不知道哪些数据已经写成功,哪些还未写成功。
基于这两个方面我们可以认为写的时候用同一个HTable实例时不推荐的。
有人可能会提出HTablePool是线程安全的,那用pool会如何。
实际上HTabePool的作用我认为是为了控制客户端对HTable的滥用。
其官方说明
/*Get areference to the specified table from the pool。*/
得到的仅仅是一个HTable的引用,如果当前pool中没有该table的HTable对象那么会new一个。
记住操作完以后要把该引用放回去,否则你每次去getTable都是去new一个新的对象,这是一个很大的开销。
接着来看看scan的几个参数:
1. caching
对于这个重要的参数,api上尽然说明不多。。
这个值可以大幅减少rpc时间,也就是说,如果你要求100条数据,如果你的caching是10,那么rpc通信次数只有10次,如果你的caching设置为1,那么rpc次数是100,这是一个极大地开销,不过这个值也不能设置的太大,否则对服务器端和客户端都是灾难性的。
2. batch
每个result上的kv数。
3.maxResultSize
Result的最大值
简单来说,
caching是一次从服务器端返回对少个Result对象,batch是每个Result上的kv数目,MaxResultSize是单个Result的最大值。
batch和MaxResultSize都是为了防止单个Result过大,将单个过大的Result拆开成几个返回防止客户端oom。。
相关推荐
### HBASE使用注意事项详解 #### 一、表设计注意事项 **1.... - **背景**:HBase依赖于...此外,对于Java API的使用也需要注意资源管理和HTable实例的有效管理。遵循这些原则将有助于提高HBase系统的稳定性和性能。
首先,避免直接使用`HTable`实例化。通常,开发人员可能会直接通过`new HTable(config, tablename)`创建`HTable`对象,但这不是推荐的方式,因为它涉及到了昂贵的初始化过程,包括检查表的存在性和可用性。这种初始...
2. 增操作:使用HTable类可以实现增操作。首先需要创建一个HTable对象,然后使用Put对象将数据写入到HBase中。 ```java public static void put(String tablename, String row, String columnFamily, String column,...
"htable2csv"工具的工作原理可能包括以下步骤: 1. **解析HTML**:首先,该工具会解析输入的HTML文件或网页内容,找到其中的`<table>`元素。HTML解析库如BeautifulSoup或html.parser在Python中被广泛应用来实现这一...
批量导入操作需要使用 HTable 类,通过 put() 方法将数据写入 Hbase 表中。代码如下: ```java public static void put(String tableName, String row, String columnFamily, String column, String data) throws ...
使用 HTable 对象进行增删改查操作: ```java HTable table = new HTable(configuration, "wuji"); Put put = new Put("rowkey"); put.add("cf", "qualifier", "value"); table.put(put); Get get = new Get(...
对于并发控制,可以使用HTable的`checkAndPut()`和`checkAndDelete()`方法。 九、优化与性能 优化HBase Java API的使用,可以考虑以下几点:批量操作、使用BufferedMutator、调整缓存设置、选择合适的分区策略等。 ...
3. `HTable`: 表示与HBase表的连接,通过`HTable.getTableName()`获取表名,`HTable.getTableDescriptor()`获取表的描述符,`HTable.put()`和`HTable.get()`分别用于写入和读取数据。 4. `Put` 和 `Get`: 这两个类...
5. HBase的连接池管理和HTable的使用。 6. HBase中Scan类的运用,用于数据的扫描和查询。 这样的课程设计有助于学生理解Hadoop生态系统的实际应用,以及如何在实际项目中结合不同的数据库技术进行数据管理。同时,...
创建`HTable`实例来操作表,并使用`Put`对象插入数据: ```java HTable table = new HTable(config, "MyTable"); byte[] rowKey = Bytes.toBytes("row1"); Put put = new Put(rowKey); put.add(Bytes.toBytes(...
Hbase 入库方式比较 ...预先生成 HFile 入库适合大规模数据集,通过 MapReduce 入库适合需要批量处理数据的场景,使用 HTable.put() 方法入库适合小规模数据集,多线程入库适合需要高效写入的场景。
- **使用Scan**:当需要扫描表中的一部分或全部数据时,可以使用Scan。 示例代码如下: ```java public void testGet() throws IOException { HTable table = new HTable(conf, "peoples"); Get get = new Get...
批量导入通常使用`HTable`的`put`方法或者`batch`方法。`put`方法用于插入单条记录,而`batch`方法则可以处理多条记录,提高了效率。批量操作将所有待写入的数据先放入内存,然后一次性提交到HBase,减少了网络传输...
本篇文章将详细探讨MapInfo中的一些常见函数及其用法,这对于MapInfo的开发和高级使用至关重要。 1. **SelectByExpression()**: 这个函数用于根据指定的表达式选择表中的记录。例如,`SelectByExpression("AREA >...
HTable table = new HTable(hbaseConfig, tablename); Get get = new Get(row.getBytes()); get.addColumn(family.getBytes(), column.getBytes()); if (num > 1) { get.setTimestamp(time); } if (time != 0...
在大数据领域,分布式数据库HBase是处理海量结构化半结构化数据的重要工具,尤其是在与Hadoop结合使用时,能够提供高效、可扩展的数据存储和查询能力。本文将详细讲解如何在Hadoop环境中安装HBase以及如何使用Java ...
通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭,这样可以批量写入数据到HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向HBase服务端发起写请求。...
批量读取也是同样的原理,使用`HTable.get(List)`可以高效获取多行数据。 6. 多线程并发写入: 在客户端开启多个写线程,每个线程负责一个HTable对象的flush操作,结合定时flush和写缓冲区,能够在数据量变化时灵活...
4. **查询数据**:使用 `HTable` 的 `get()` 方法获取特定行的数据,或者使用 `Scanner` 对象进行扫描操作,遍历表中的多行数据。 5. **删除表和数据**:`HBaseAdmin` 提供了 `deleteTable()` 方法删除整个表,而 `...
3. **插入数据**:使用`HTable`接口插入数据到HBase。首先创建一个`Put`对象,然后添加行键和列族/列标识符及对应的值。 ```java HTable table = new HTable(config, "myTable"); byte[] rowKey = Bytes.toBytes(...