2013-07-29 27 views
5

Chúng tôi đang làm việc trên một kịch bản mà chúng ta cần phải kiểm tra sự tồn tại của bản ghi trước khi chèn. Nếu bản ghi đã tồn tại, chúng tôi không chèn lại. Chúng tôi đang làm theo lô. Đầu tiên chúng ta tạo một lô Gets để xem sự tồn tại của các bản ghi mà chúng ta muốn chèn vào. Vấn đề này không đến khi kích thước bảng nhỏ hơn và nó cũng rất liên tục. Kích thước lô được đề xuất cho Get là bao nhiêu. Và phương pháp nào tốt nhất để kiểm tra sự tồn tại của các bản ghi trước khi chèn ?? Đánh giá cao trả lời của bạn ..Vấn đề SocketTimeoutException từ HBase Client

Dưới đây là stack trace ..

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) 

Trả lời

3

Bạn đang nhận được lỗi này vì thời gian thực hiện bằng được của bạn có nhiều hơn so với mặc định thời gian cho phép mà một HBase các ứng dụng khách hàng có thể đưa cho một cuộc gọi từ xa đến hết giờ, là 60 giây. Khi bảng của bạn lớn (có nghĩa là bạn có nhiều dữ liệu hơn để tìm nạp) sẽ mất thời gian. Bạn có thể tăng giá trị này bằng cách đặt giá trị của hbase.rpc.timeout thành một số giá trị cao hơn trong tệp hbase-site.xml của bạn.

Kích thước lô được đề xuất cho Get là bao nhiêu?

Phụ thuộc vào thiết kế, cấu hình, thông số kỹ thuật, dữ liệu và mẫu truy cập của bạn.

cách tiếp cận tốt nhất để kiểm tra sự tồn tại của các bản ghi trước khi chèn là gì?

Khi bạn muốn kiểm tra điều gì đó, kiểm tra là tùy chọn duy nhất. Nó sẽ rất hữu ích nếu bạn có thể xây dựng trường hợp sử dụng của bạn nhiều hơn một chút. Điều đó sẽ giúp tôi trong việc đưa ra một số gợi ý thích hợp.

+0

Cảm ơn rất nhiều vì phản hồi của bạn Tariq. Tôi đã tăng thời gian chờ rpc cho một số lớn hơn và tôi không nhận được điều này ngay bây giờ. Nhưng những gì tôi không thể hiểu được là tại sao nó liên tục. Ý tôi là, tại sao tôi không bị hết thời gian chờ này. Và một vấn đề hiệu suất hơn mà tôi đang phải đối mặt ngay bây giờ là gần 90 - 95% tổng thời gian chèn đã được chi cho kiểm tra duy nhất ngay cả sau khi sử dụng hàng loạt được. Và thời gian kiểm tra cũng rất không nhất quán. Lý do của hành vi này là gì? –

+0

Bạn được chào đón @NareshReddy. Trên thực tế nó phụ thuộc vào rất nhiều thứ, như thiết kế lược đồ của bạn, phân phối dữ liệu của bạn, vv Một lý do có thể có thể là ** RegionServer Hotspotting **. Bạn có các rowkey tuần tự không (như dấu thời gian hoặc thứ gì đó tăng liên tục theo thời gian). Tôi khuyên bạn nên làm theo các thực hành tốt nhất của HBase và phân tích thiết kế của bạn đúng cách, trong trường hợp có một số phạm vi cải tiến. HTH – Tariq

6

Giải pháp được cung cấp ở đây không chính xác 100%. Tôi phải đối mặt với socketTimeOut trên cả hai lần đọc và viết trên tải cao. Tăng hbase.rpc.timeout không phải là giải pháp cho đến khi hoặc trừ khi quá trình quét hoặc ghi trên máy chủ hbase là rất lớn.

Đây là vấn đề của tôi:

tôi đã cố gắng để quét hàng đã được trả lời lại bằng HBase trong một vài mili giây. Mọi thứ đều bình thường cho đến khi tôi tăng luồng quét đồng thời từ 10 lên 50. Bằng cách làm như vậy, tôi bắt đầu gặp phải socketTimeoutException (ngoại lệ giống như trong luồng này), đây là một trở ngại để mở rộng đọc hoặc viết từ một tiến trình.

Để tìm giải pháp chính xác, trước tiên bạn cần hiểu nguyên nhân trước.

Nguyên nhân cho socketTimeout

a. Việc đọc hoặc viết trả lại từ máy chủ cơ sở là chậm

b. Máy khách không thể kết nối với máy chủ và hết thời gian chờ. Chủ đề tắc nghẽn?

Nếu bạn đang gặp "a", sau đó tăng hbase.rpc.timeout có thể là giải pháp của bạn, nhưng bạn vẫn có thể sẽ kết thúc bằng "b".

Tôi nhận thấy rằng máy khách hbase theo mặc định chỉ tạo một kết nối cho mỗi máy chủ vùng. Để xác thực, vui lòng chạy lệnh này từ máy khách, nơi đọc đến HBase. Đảm bảo tải đang chạy.

netstat -an | grep 60020 | grep EST 

Trước sự ngạc nhiên của tôi, cứ mỗi regionServer, quá trình này được thực hiện chỉ có một kết nối. Điều này giải thích thời gian chờ. Chỉ một kết nối/ổ cắm? Có vẻ như đây là hành vi khách hàng cơ sở mặc định. Bạn không chắc chắn tại sao?

Giải pháp:

Thêm hai thuộc tính này trong HBase conf trong các khách hàng và khởi động lại máy khách

<property> 
    <name>hbase.client.ipc.pool.type</name> 
    <value>RoundRobinPool</value> 
</property> 
<property> 
    <name>hbase.client.ipc.pool.size</name> 
    <value>10</value> 
</property> 

này tạo ra 10 ổ cắm trên mỗi regionServer từ mỗi khách hàng. Với thay đổi này, bạn sẽ thấy một cải tiến lớn ở phía khách hàng. Tôi đã không có kinh nghiệm socketTimeOutException, kể từ khi thay đổi này.

Các vấn đề liên quan