知识点
相关文章
更多最近更新
更多HBase多线程建立HTable问题
2019-03-28 12:58|来源: 网络
最近在写wormhole的HBase plugin,需要分别实现hbase reader和hbase writer。
相关阅读:
Hadoop+HBase搭建云存储总结 PDF http://www.linuxidc.com/Linux/2013-05/83844.htm
HBase 结点之间时间不一致造成regionserver启动失败 http://www.linuxidc.com/Linux/2013-06/86655.htm
Hadoop+ZooKeeper+HBase集群配置 http://www.linuxidc.com/Linux/2013-06/86347.htm
在测试的时候会报错如下:
2013-07-08 09:30:02,568 [pool-2-thread-1] org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1631) WARN client.HConnectionManager$HConnectionImplementation - Failed all from region=t1,,1373246892580.877bb26da1e4aed541915870fa924224., hostname=test89.hadoop, port=60020
java.util.concurrent.ExecutionException: java.io.IOException: Call to test89.hadoop/10.1.77.89:60020 failed on local exception: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/10.1.77.84:51032 remote=test89.hadoop/10.1.77.89:60020]. 59999 millis timeout left.
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1601)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1453)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:936)
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:783)
at com.dp.nebula.wormhole.plugins.common.HBaseClient.flush(HBaseClient.java:121)
at com.dp.nebula.wormhole.plugins.writer.hbasewriter.HBaseWriter.commit(HBaseWriter.java:112)
at com.dp.nebula.wormhole.engine.core.WriterThread.call(WriterThread.java:52)
at com.dp.nebula.wormhole.engine.core.WriterThread.call(WriterThread.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.IOException: Call to test89.hadoop/10.1.77.89:60020 failed on local exception: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/10.1.77.84:51032 remote=test89.hadoop/10.1.77.89:60020]. 59999 millis timeout left.
at org.apache.hadoop.hbase.ipc.HBaseClient.wrapException(HBaseClient.java:1030)
at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:999)
at org.apache.hadoop.hbase.ipc.SecureRpcEngine$Invoker.invoke(SecureRpcEngine.java:104)
at com.sun.proxy.$Proxy5.multi(Unknown Source)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3$1.call(HConnectionManager.java:1430)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3$1.call(HConnectionManager.java:1428)
at org.apache.hadoop.hbase.client.ServerCallable.withoutRetries(ServerCallable.java:215)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3.call(HConnectionManager.java:1437)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3.call(HConnectionManager.java:1425)
... 5 more
Caused by: java.io.InterruptedIOException: Interruped while waiting for IO on channel java.nio.channels.SocketChannel[connected local=/10.1.77.84:51032 remote=test89.hadoop/10.1.77.89:60020]. 59999 millis timeout left.
2013-07-08 09:30:03,579 [pool-2-thread-6] com.dp.nebula.wormhole.engine.core.WriterThread.call(WriterThread.java:56) ERROR core.WriterThread - Exception occurs in writer thread!
com.dp.nebula.wormhole.common.WormholeException: java.io.IOException: <SPAN style="COLOR: #ff0000">org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@b7c96a9 closed</SPAN>
at com.dp.nebula.wormhole.plugins.writer.hbasewriter.HBaseWriter.commit(HBaseWriter.java:114)
at com.dp.nebula.wormhole.engine.core.WriterThread.call(WriterThread.java:52)
at com.dp.nebula.wormhole.engine.core.WriterThread.call(WriterThread.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.IOException: org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@b7c96a9 closed
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:877)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:857)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1568)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1453)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:936)
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:783)
at com.dp.nebula.wormhole.plugins.common.HBaseClient.flush(HBaseClient.java:121)
at com.dp.nebula.wormhole.plugins.writer.hbasewriter.HBaseWriter.commit(HBaseWriter.java:112)
... 7 more
wormhole的reader和writer会分别起一个ThreadPoolExecutor,出错是在writer端的flush阶段,也就是最后一次批量插入操作。由于我的reader是每一个thread一个htable instance没有问题,而writer是共用了一个singleton HBaseClient,然后用ThreadLocal去保证每一个thread拥有一个本地htable对象,有可能有错误,最简单的方法是把writer端不用singleton HBaseClient,问题应该解决,不过没搞清root cause,不爽啊。。。
后来看了HTable和HAdmin的源代码才有点线索
public HTable(Configuration conf, final byte [] tableName)
throws IOException {
this.tableName = tableName;
this.cleanupPoolOnClose = this.cleanupConnectionOnClose = true;
if (conf == null) {
this.connection = null;
return;
}
this.connection = HConnectionManager.getConnection(conf);
this.configuration = conf;
int maxThreads = conf.getInt("hbase.htable.threads.max", Integer.MAX_VALUE);
if (maxThreads == 0) {
maxThreads = 1; // is there a better default?
}
long keepAliveTime = conf.getLong("hbase.htable.threads.keepalivetime", 60);
((ThreadPoolExecutor)this.pool).allowCoreThreadTimeOut(true);
this.finishSetup();
}
每一个HTable instance都有一个HConnection对象,它负责与Zookeeper和之后的HBase Cluster建立链接(比如cluster中定位region,locations的cache,当region移动后重新校准),它由HConnectionManager来管理
public static HConnection getConnection(Configuration conf)
throws ZooKeeperConnectionException {
HConnectionKey connectionKey = new HConnectionKey(conf);
synchronized (HBASE_INSTANCES) {
HConnectionImplementation connection = HBASE_INSTANCES.get(connectionKey);
if (connection == null) {
connection = new HConnectionImplementation(conf, true);
HBASE_INSTANCES.put(connectionKey, connection);
}
connection.incCount();
return connection;
}
}
HConnectionManager内部有LRU MAP => HBASE_INSTANCES的静态变量作为cache,key为HConnectionKey,包含了username和指定的properties(由传进去的conf提取), value就是HConnection具体实现HConnectionImplementation,由于传入进去的conf都一样,所以都指向同一个HConnectionImplementation,最后会调用connection.incCount()将client reference count加1
public void close() throws IOException {
if (this.closed) {
return;
}
flushCommits();
if (cleanupPoolOnClose) {
this.pool.shutdown();
}
if (cleanupConnectionOnClose) {
if (this.connection != null) {
this.connection.close();
}
}
this.closed = true;
}
相关问答
更多-
Java多线程问题[2022-05-03]
因为程序有等待。 比如你去查数据库,数据库返回数据之前会有一段等待时间,这段时间就可以执行其他的线程,这样就很快了。 其实一个cpu中,所有指令都是一条条执行的。 -
java多线程理解[2022-02-28]
java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。 一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法: Thread t = new Thread(); t.start(); start()方法是一个nat ... -
PHP多线程的问题[2023-02-06]
在*nix平台下可以用PHP做多线程程序, 比如做个守护进程, 提供某种服务, 比如说提供域名注册, 或者提供某个经纬度的偏移校正量,想提供什么服务都可以. 如果是非常繁重的文件搬迁的话还是用C写较好,一般性的服务用PHP好处是代码相对C简单得多,可以把时间放在设计方面 =============== 在linux环境可以用PHP写多线程程序 查一下网上的教程,使用这个函数的 pcntl_fork() 这个需要平台特性,使用fork() windows不行 -
在Java 中多线程的实现方法有哪些,如何使用~~~~~~~~~~~~~~~~~~急[2022-01-07]
1、 认识Thread和Runnable Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。 Thread Test = new Thread(); Test.start(); 在使用Runnable的时候需要先new一个实现Runna ... -
使用HBase shell扫描特定列值的HTable行(Scan HTable rows for specific column value using HBase shell)[2022-09-24]
没有Hive是可能的: scan 'filemetadata', { COLUMNS => 'colFam:colQualifier', LIMIT => 10, FILTER => "ValueFilter( =, 'binaryprefix:' )" } 注意:为了查找所有包含test1的行作为问题中指定的值,请在过滤器中使用binaryprefix:test1 (有关更多示例,请参阅此答案 ) It is possi ... -
确保在Scan对象(用于创建扫描程序的对象)上设置BatchSize和Caching 。 它们控制一次通过网络传输的行数,以及在内存中保留多少行以便在RegionServer本身上快速检索。 默认情况下,它们都太低而无法提高效率。 特别是BatchSize将大大提高您的性能。 编辑:根据评论,听起来你可能在服务器或客户端上交换,或者RegionServer可能没有足够的空间在BlockCache中满足你的扫描仪。 你给RegionServer多少堆? 你检查过它是否在交换? 请参阅如何找出在Linux中交换 ...
-
运行hadoop程序,hbase卡在htable声明中(running hadoop program with hbase stuck at htable declaration)[2021-09-09]
我顺便解决了这个问题。 通过重新安装Hadoop和HBase,同时仔细仔细检查兼容性(您可以在apache官方网站上搜索它们)。 就我而言,现在我正在使用Hadoop 2.5.1和HBase 0.98.11 希望这可能会在以后帮助某人。 I solved this problem btw. By re-installing both Hadoop and HBase while double checking the compatibility very carefully (you can search ... -
通过多线程与使用诸如hbase / hive之类的选项一起写入HDFS(writing to HDFS via multi threading vs using options like hbase / hive)[2021-05-20]
Hive和HBase是两种不同的工具。 Hbase是一个数据库,Hive是一个查询引擎。 Hbase与Hive和hadoop不同。 现在回答您的问题,您可以使用带有Java API的mapreduce编写HDfS,并且如果您的程序对于正在处理的数据非常有效。 然后地图缩小可以更快,然后配置单元。 这样做的主要原因是,无论您在配置单元中写入的查询都转换为地图缩减程序。 所以最终它是mapreduce程序的效率很重要。因此,如果你可以编写一个更好和更高效的程序,那么它可以更快,然后配置单元查询。 Hive an ... -
我坚持使用旧版本(<0.94.11),你仍然可以使用HTablePool但由于它已被HBASE-6580弃用,我认为从HTables到RS的请求现在通过提供ExecutorService自动汇集: ExecutorService executor = Executors.newFixedThreadPool(10); Connection connection = ConnectionFactory.createConnection(conf, executor); Table table = connec ...
-
我们可以重用多线程之间的hbase Java客户端连接吗?(Can we reuse the hbase Java client Connection between multi-threads?)[2021-12-13]
来自HBase 1.2的API文档,org.apache.hadoop.hbase.client.Connection: https : //hbase.apache.org/1.2/apidocs/org/apache/hadoop/hbase/client/Connection.html 连接创建是一项重量级的操作。 连接实现是线程安全的,因此客户端可以创建一次连接,并与不同的线程共享它。 另一方面,表和管理实例重量轻,不是线程安全的。 通常,每个客户端应用程序的单个连接都会被实例化,并且每个线程都将获 ...