`

HTable取连接线程不安全的问题

 
阅读更多

发生情景:

启动多个线程共用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");

 

 

 

 

 

 

分享到:
评论

相关推荐

    多线程 hbase

    3. **线程安全与并发控制**:在多线程环境下,需要特别注意并发问题。HBase客户端提供了`HTableInterface`的原子操作,如`put`和`checkAndPut`,确保了多线程环境下的数据一致性。然而,对于自定义的多线程操作,...

    Java代码通过API操作HBase的最佳实践.pdf

    因此,最佳实践是使用`HTablePool`,它允许线程安全地复用`HTable`实例,减少了对.META表的扫描次数,提高了整体效率。 `HTablePool`是一个线程安全的池,用于管理多个`HTable`实例。通过在应用程序启动时创建并...

    java连接hbase的jar包

    以上就是使用Java连接HBase的基本知识,实际应用中可能还需要处理并发控制、错误处理、性能优化等问题。理解HBase的数据模型(行、列族、列限定符和时间戳)以及HBase的API用法,对于高效地使用HBase至关重要。同时...

    Hbase几种入库方式

    Hbase 入库方式比较 ...预先生成 HFile 入库适合大规模数据集,通过 MapReduce 入库适合需要批量处理数据的场景,使用 HTable.put() 方法入库适合小规模数据集,多线程入库适合需要高效写入的场景。

    高性能HBase客户端AsynchronousHBase.zip

    asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous

    htable2csv:将HTML表转换为.csv文件

    "htable2csv"工具的工作原理可能包括以下步骤: 1. **解析HTML**:首先,该工具会解析输入的HTML文件或网页内容,找到其中的`&lt;table&gt;`元素。HTML解析库如BeautifulSoup或html.parser在Python中被广泛应用来实现这一...

    HBASE性能调优方法1

    然而,对于不那么重要的数据,可以通过设置`Put.setWriteToWAL(false)`或`Delete.setWriteToWAL(false)`来跳过WAL,提高写入性能,但牺牲了一定的数据安全性。 4. 数据压缩(Compression): 使用SNAPPY压缩算法可以...

    hbase-client

    五、连接管理和安全性 HBase客户端需要配置正确的Zookeeper地址以连接到HBase集群。Zookeeper是HBase的协调服务,负责集群的元数据管理。此外,为了确保数据安全,HBase支持多种安全机制,如SASL、Kerberos等,...

    HBaseClientDemo

    3. `HTable`: 表示与HBase表的连接,通过`HTable.getTableName()`获取表名,`HTable.getTableDescriptor()`获取表的描述符,`HTable.put()`和`HTable.get()`分别用于写入和读取数据。 4. `Put` 和 `Get`: 这两个类...

    易语言判断系统补丁是否存在

    wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...

    hbase资料api

    如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不调用setMaxVersions,只会取到最新的版本。 * setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取。 * setTimeStamp:...

    storm-asynchbase:AsyncHBase 风暴映射器

    AyncHBase 客户端是 Apache HBase 的完全异步和线程安全的客户端。 与传统的 HBase 客户端 (HTable) 不同,每个要与之交互的 HBase 集群只需要一个客户端实例。 即使您想与多个表进行交互。 它避免了不必要的等待...

    HBASE使用注意事项

    - **内存消耗**:考虑HTable中writeBuffer的存在,即使设置了autoFlush为true或false,也需要关注HTable实例的数量。 - **优化建议**:合理管理HTable实例的数量,避免不必要的资源浪费。 ### 总结 通过对HBase的...

    eclipse构建HBase开发环境并运行实例对Hbase建表增删改查

    首先需要确定HBase和Hadoop的版本是否一致,为了避免版本不兼容问题。在本例中,我们使用的HBase版本为hbase-0.90.5,Hadoop版本为Hadoop-0.20.2。 二、Eclipse开发环境配置 1. 复制HBase部署文件:首先需要从...

    hbase-connectors:Apache HBase连接器

    - HBase连接器通常支持Hadoop的Kerberos认证,确保数据的安全传输和访问控制。 7. **Bulk Load**: - 通过HBase连接器可以实现批量加载数据,提高大数据导入的效率。 8. **数据模型**: - HBase是基于列族...

    hadoop和hbase集成所需jar包

    - 需要确保Hadoop和HBase版本兼容,避免因版本不匹配导致的问题。 - 为了避免版本冲突,通常需要在类路径中包含Hadoop和HBase的全集JAR包,而不是仅依赖某些特定的库。 - 在执行MapReduce任务时,确保HBase集群是...

    某大数据公司内部Hbase性能测试详细设计文档及用例

    在HBase中,数据在更新时首先写入WAL日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到...

    hadoop 分布式云计算 课程设计报告

    `HTablePool`用于管理HTable实例,可以有效地重用连接,减少资源消耗。`gettable`和`puttable`方法分别用于获取和释放HTable实例。 在HBase操作中,`Scan`类用于扫描表中的数据。通过`addColumn`方法指定需要查询的...

    scala API 操作hbase表

    如果你需要进行大量操作,可以使用`HTable`的`batch()`方法来执行批量的`Put`或`Delete`操作。 10. 使用Scalastyle或类似工具保持代码风格的一致性,确保代码可读性和维护性。 在实际开发中,你可能还需要处理...

Global site tag (gtag.js) - Google Analytics