发生情景:
启动多个线程共用table连接,
HTable table = new HTable(conf, "tablename"); @Test public void insert_multithread() throws InterruptedException { for (int k = 1; k <= 10; k++){ final int j = k; new Thread(new Runnable() { public void run() { try { // Configuration conf = new Configuration(); // conf.set("hbase.zookeeper.quorum", "192.168.1.160"); // HTable table = new HTable(conf,"wf:error"); errorTable.setAutoFlushTo(false); long t1 = System.currentTimeMillis(); for (int i = 0; i < 10000; i++){ String uuid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8); Put put = new Put(Bytes.toBytes( uuid + "_" +"2015070" + j )); put.add(fBytes,Bytes.toBytes("stacktrace"),Bytes.toBytes("java.io.IOException:file not found" + UUID.randomUUID().toString())); // puts.add(put); errorTable.put(put); if (i % 10000 == 0) { errorTable.flushCommits(); } } // table.close(); long t2 = System.currentTimeMillis(); System.out.println(Thread.currentThread() + ",t2-t1=" + (t2 - t1)); }catch (IOException e){ } } }).start(); } System.out.println("waiting....."); Thread.sleep(1000 * 60 * 10); System.out.println("completing......."); }
报错:
java.util.ConcurrentModificationException at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953) at java.util.LinkedList$ListItr.remove(LinkedList.java:919) at org.apache.hadoop.hbase.client.AsyncProcess.submit(AsyncProcess.java:319) at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:965) at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1281) at com.cobub.hbase.HbaseTest$1.run(HbaseTest.java:88) at java.lang.Thread.run(Thread.java:745)
分析:先将put进行放到BufferedMutatorImpl进行缓存,然后提交服务器进行插入,同时remove()一个put
Iterator<? extends Row> it = rows.iterator(); while (it.hasNext()) { Row r = it.next(); HRegionLocation loc = findDestLocation(r, posInList); if (loc == null) { // loc is null if there is an error such as meta not available. it.remove(); } else if (canTakeOperation(loc, regionIncluded, serverIncluded)) { Action<Row> action = new Action<Row>(r, ++posInList); setNonce(ng, r, action); retainedActions.add(action); addAction(loc, action, actionsByServer, ng); it.remove(); } }
解决:
每个线程实例化一个HTable:
HTable table = new HTable(conf,"wf:error");
相关推荐
3. **线程安全与并发控制**:在多线程环境下,需要特别注意并发问题。HBase客户端提供了`HTableInterface`的原子操作,如`put`和`checkAndPut`,确保了多线程环境下的数据一致性。然而,对于自定义的多线程操作,...
因此,最佳实践是使用`HTablePool`,它允许线程安全地复用`HTable`实例,减少了对.META表的扫描次数,提高了整体效率。 `HTablePool`是一个线程安全的池,用于管理多个`HTable`实例。通过在应用程序启动时创建并...
以上就是使用Java连接HBase的基本知识,实际应用中可能还需要处理并发控制、错误处理、性能优化等问题。理解HBase的数据模型(行、列族、列限定符和时间戳)以及HBase的API用法,对于高效地使用HBase至关重要。同时...
Hbase 入库方式比较 ...预先生成 HFile 入库适合大规模数据集,通过 MapReduce 入库适合需要批量处理数据的场景,使用 HTable.put() 方法入库适合小规模数据集,多线程入库适合需要高效写入的场景。
asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous
"htable2csv"工具的工作原理可能包括以下步骤: 1. **解析HTML**:首先,该工具会解析输入的HTML文件或网页内容,找到其中的`<table>`元素。HTML解析库如BeautifulSoup或html.parser在Python中被广泛应用来实现这一...
然而,对于不那么重要的数据,可以通过设置`Put.setWriteToWAL(false)`或`Delete.setWriteToWAL(false)`来跳过WAL,提高写入性能,但牺牲了一定的数据安全性。 4. 数据压缩(Compression): 使用SNAPPY压缩算法可以...
五、连接管理和安全性 HBase客户端需要配置正确的Zookeeper地址以连接到HBase集群。Zookeeper是HBase的协调服务,负责集群的元数据管理。此外,为了确保数据安全,HBase支持多种安全机制,如SASL、Kerberos等,...
3. `HTable`: 表示与HBase表的连接,通过`HTable.getTableName()`获取表名,`HTable.getTableDescriptor()`获取表的描述符,`HTable.put()`和`HTable.get()`分别用于写入和读取数据。 4. `Put` 和 `Get`: 这两个类...
wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...
如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不调用setMaxVersions,只会取到最新的版本。 * setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取。 * setTimeStamp:...
AyncHBase 客户端是 Apache HBase 的完全异步和线程安全的客户端。 与传统的 HBase 客户端 (HTable) 不同,每个要与之交互的 HBase 集群只需要一个客户端实例。 即使您想与多个表进行交互。 它避免了不必要的等待...
- **内存消耗**:考虑HTable中writeBuffer的存在,即使设置了autoFlush为true或false,也需要关注HTable实例的数量。 - **优化建议**:合理管理HTable实例的数量,避免不必要的资源浪费。 ### 总结 通过对HBase的...
首先需要确定HBase和Hadoop的版本是否一致,为了避免版本不兼容问题。在本例中,我们使用的HBase版本为hbase-0.90.5,Hadoop版本为Hadoop-0.20.2。 二、Eclipse开发环境配置 1. 复制HBase部署文件:首先需要从...
- HBase连接器通常支持Hadoop的Kerberos认证,确保数据的安全传输和访问控制。 7. **Bulk Load**: - 通过HBase连接器可以实现批量加载数据,提高大数据导入的效率。 8. **数据模型**: - HBase是基于列族...
- 需要确保Hadoop和HBase版本兼容,避免因版本不匹配导致的问题。 - 为了避免版本冲突,通常需要在类路径中包含Hadoop和HBase的全集JAR包,而不是仅依赖某些特定的库。 - 在执行MapReduce任务时,确保HBase集群是...
在HBase中,数据在更新时首先写入WAL日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到...
`HTablePool`用于管理HTable实例,可以有效地重用连接,减少资源消耗。`gettable`和`puttable`方法分别用于获取和释放HTable实例。 在HBase操作中,`Scan`类用于扫描表中的数据。通过`addColumn`方法指定需要查询的...
如果你需要进行大量操作,可以使用`HTable`的`batch()`方法来执行批量的`Put`或`Delete`操作。 10. 使用Scalastyle或类似工具保持代码风格的一致性,确保代码可读性和维护性。 在实际开发中,你可能还需要处理...