来自HBase客户端的SocketTimeoutException问题
我们正在处理一个场景,在插入之前需要检查记录是否存在。如果记录已经存在,我们不会再插入它。我们正在分批进行。首先,我们创建一批get,以查看是否存在要插入的记录。当表格大小较小且非常间歇时,此问题不会出现Get的建议批量大小是多少。插入前检查记录是否存在的最佳方法是什么??感谢您的回复 这是堆栈跟踪来自HBase客户端的SocketTimeoutException问题,hbase,Hbase,我们正在处理一个场景,在插入之前需要检查记录是否存在。如果记录已经存在,我们不会再插入它。我们正在分批进行。首先,我们创建一批get,以查看是否存在要插入的记录。当表格大小较小且非常间歇时,此问题不会出现Get的建议批量大小是多少。插入前检查记录是否存在的最佳方法是什么??感谢您的回复 这是堆栈跟踪 java.util.concurrent.ExecutionException: java.net.SocketTimeoutException: Call to b16-pf-dv-093.abc
java.util.concurrent.ExecutionException: java.net.SocketTimeoutException: Call to b16-pf-dv-093.abc.com/10.106.8.103:60020 failed on socket timeout exception: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.106.8.133:41903 remote=b16-pf-dv-093.abc.com/10.106.8.103:60020]
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:1604)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1456)
at org.apache.hadoop.hbase.client.HTable.batch(HTable.java:757)
at org.apache.hadoop.hbase.client.HTable.get(HTable.java:726)
at org.apache.hadoop.hbase.client.HTablePool$PooledHTable.get(HTablePool.java:367)
at com.abc.psp.core.metering.util.HBaseClient.get(HBaseClient.java:263)
at com.abc.psp.core.metering.dao.MeteringHBaseDAOImpl.addMeteredRecords(MeteringHBaseDAOImpl.java:374)
at com.abc.psp.core.metering.dao.MeteringHBaseDAOImpl.addMeteredRecords(MeteringHBaseDAOImpl.java:342)
at HBaseTest.main(HBaseTest.java:32)
Caused by: java.net.SocketTimeoutException: Call to b16-pf-dv-093.abc.com/10.106.8.103:60020 failed on socket timeout exception: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.106.8.133:41903 remote=b16-pf-dv-093.abc.com/10.106.8.103:60020]
at org.apache.hadoop.hbase.ipc.HBaseClient.wrapException(HBaseClient.java:1026)
at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:999)
at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:86)
at $Proxy6.multi(Unknown Source)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3$1.call(HConnectionManager.java:1433)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3$1.call(HConnectionManager.java:1431)
at org.apache.hadoop.hbase.client.ServerCallable.withoutRetries(ServerCallable.java:215)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3.call(HConnectionManager.java:1440)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$3.call(HConnectionManager.java:1428)
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:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.106.8.133:41903 remote=b16-pf-dv-093.abc.com/10.106.8.103:60020]
at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:164)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:155)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:128)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at org.apache.hadoop.hbase.ipc.HBaseClient$Connection$PingInputStream.read(HBaseClient.java:373)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at java.io.DataInputStream.readInt(DataInputStream.java:370)
at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.receiveResponse(HBaseClient.java:646)
at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.run(HBaseClient.java:580)
出现此错误是因为GET所用的时间超过了HBase客户端应用程序远程调用超时所允许的默认时间,即60秒。当您的表很大(这意味着您有更多的数据要获取)时,获取将需要时间。您可以通过在hbase site.xml文件中将hbase.rpc.timeout的值设置为更高的值来增加此值 Get的建议批量大小是多少? 取决于您的设计、配置、规格、数据和访问模式 插入前检查记录是否存在的最佳方法是什么?
当您想要检查某个内容时,检查是唯一的选项。如果您能更详细地阐述一下您的用例,这将是很有帮助的。这将帮助我提出一些适当的建议。这里提供的解决方案并非100%正确。我在读写高负载时都面临socketTimeOut问题。除非hbase服务器上的扫描或写入非常大,否则增加hbase.rpc.timeout不是解决方案 这是我的问题: 我试图扫描hbase在几毫秒内返回的行。在我将并发扫描线程从10个增加到50个之前,一切都很正常。通过这样做,我开始遇到socketTimeoutException(与此线程中的异常相同),这是从一个进程扩展hbase读写的障碍 要得到确切的解决方案,首先需要了解原因 导致socketTimeout的原因 a。从hbase服务器返回的读或写速度较慢 b。客户端无法连接到服务器并超时。 线程阻塞 如果您遇到“a”,那么增加hbase.rpc.timeout可能是您的解决方案,但您很可能最终也会遇到“b” 我注意到hbase客户端默认情况下每个regionServer只创建一个连接。要进行验证,请从读取hbase的客户端运行此命令。确保负载处于运行状态 令我惊讶的是,对于每个regionServer,进程只建立了一个连接。这就是超时的原因。仅一个连接/插座?似乎这是默认的hbase客户端行为。还不知道为什么 解决方案: 在客户端的hbase conf中添加这两个属性,然后重新启动客户端
<property>
<name>hbase.client.ipc.pool.type</name>
<value>RoundRobinPool</value>
</property>
<property>
<name>hbase.client.ipc.pool.size</name>
<value>10</value>
</property>
hbase.client.ipc.pool.type
圆形机芯
hbase.client.ipc.pool.size
10
这在每个客户端的每个regionServer上创建了10个套接字。有了这个变化,您应该看到客户端的一个重大改进。自从这次更改以来,我没有经历过socketTimeOutException。非常感谢您的回复。我已经将rpc超时增加到了一个更大的数字,但我现在不明白这一点。但我不明白的是为什么它是间歇性的。我的意思是,为什么我没有得到这个暂停所有的时间。我现在面临的另一个性能问题是,几乎90-95%的总插入时间都花在了惟一性检查上,即使在使用批处理get之后也是如此。而且检查时间也很不一致。这种行为的原因是什么?欢迎你@nareshredy。实际上,这取决于很多因素,比如模式设计、数据分布等。一个可能的原因可能是RegionServer热点。您是否有顺序行键(如时间戳或随时间不断增加的内容)。我建议您遵循HBase最佳实践,并正确分析您的设计,以防有改进的余地。嗯
<property>
<name>hbase.client.ipc.pool.type</name>
<value>RoundRobinPool</value>
</property>
<property>
<name>hbase.client.ipc.pool.size</name>
<value>10</value>
</property>