SocketTimeoutException question de HBase Client
Nous travaillons sur un scénario où nous avons besoin de vérifier l'existence de l'enregistrement avant l'insertion. Si l'enregistrement existe déjà, nous ne pas insérer de nouveau. Nous faisons en lots. Nous avons d'abord créer un lot de voir l'existence des documents à insérer. Cette question n'est pas à venir, lorsque la taille de la table est de moins en moins et il est également très intermittent. Qu'est-ce que le recommandé de la taille des lots pour Obtenir. Et quelle est la meilleure approche pour vérifier l'existence de l'dossiers avant de les insérer?? Apprécier vos réponses..
Voici la trace de la pile..
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)
Vous devez vous connecter pour publier un commentaire.
Vous obtenez cette erreur, parce que le temps pris par votre obtient est plus que la valeur par défaut est un délai qui un HBase applications client peut le prendre pour un appel distant à la fois, ce qui est 60 secondes. Lorsque votre tableau est grand(ce qui signifie que vous avez plus de données à extraire) obtient prendra du temps. Vous pouvez augmenter cette valeur par la mise en valeur de hbase.rpc.délai d'attente pour certains plus de valeur dans votre hbase-site.xml fichier.
Qu'est-ce que le recommandé de la taille des lots pour les Obtenir?
Dépend de votre conception, la configuration, les spécifications, les données et le modèle de l'accès.
quelle est la meilleure approche pour vérifier l'existence de l'dossiers avant de les insérer?
Lorsque vous voulez vérifier quelque chose, vérification est la seule option. Il sera utile si vous pourriez préciser votre cas d'utilisation un peu plus. Qui va m'aider à venir avec une bonne suggestion.
La solution proposée ici n'est pas correct à 100%. J'ai fait face à socketTimeOut sur les lectures et les écritures sur la charge élevée. L'augmentation de hbase.rpc.délai d'attente n'est pas une solution jusqu'à ce que ou à moins que le scan ou écrit sur hbase serveur sont très grands.
Voici mon problème:
J'ai essayé de scanner les lignes qui ont été retournés par hbase en quelques millisecondes. Tout était normal jusqu'à ce que j'ai augmenté ma simultanées analyse fils de 10 à 50. En faisant ainsi, j'ai commencé à avoir socketTimeoutException (même exception que dans ce fil) qui est un obstacle à l'échelle hbase de lecture ou d'écriture d'un processus.
Pour arriver à la solution exacte, vous devez d'abord comprendre la cause première.
Causes de socketTimeout
Si vous rencontrez des "a", puis à la hausse hbase.rpc.délai d'attente peut être votre solution, mais encore, vous sera très probablement finir sur "b" ainsi.
J'ai remarqué que hbase client crée par défaut une seule connexion par regionServer. Pour valider, s'il vous plaît exécuter cette commande à partir du client où se lit à hbase sont faites. Assurez-vous que la charge en cours d'exécution.
À ma grande surprise, pour chaque regionServer, le processus a qu'une seule connexion. Voilà ce qui explique les délais d'attente. Une connexion/support? Me semble que si c'est la valeur par défaut hbase le comportement de la clientèle. Je ne sais pas pourquoi, pourtant?
Solution:
Ajouter ces deux propriétés dans hbase conf du client et redémarrez le client
Cela a créé 10 prises de courant sur chaque regionServer de chaque client. Avec ce changement, vous devriez voir une amélioration majeure à côté client. Je n'ai pas connu socketTimeOutException, depuis ce changement.